我如何比较一个变量的字符串(并做一些事情,如果他们匹配)?
当前回答
我不得不在某一点上不同意其中的一个评论:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
不,这不是疯狂的线上旅行
只是在外行看来,嗯…
在某种程度上,它使用通用模式作为一种语言;
在你学会了语言之后。
事实上,读起来很不错
它是一个简单的逻辑表达式,有一个特殊的部分:逻辑运算符的惰性求值。
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
每个部分都是一个逻辑表达式;第一个可能是真的,也可能是假的,其他两个永远是真的。
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
现在,当它被求值时,第一个被选中。如果为false,则逻辑的第二个操作数和后面的&&不相关。第一个不是真的,所以第一个不可能是真的,第二个也不可能是真的。 现在,在这种情况下,逻辑的第一边或||是假的,但如果另一边-第三部分-是真的,它可能是真的。
所以第三部分将被评估-主要是作为一个副作用写消息。(true的结果为0,这里不使用)
其他情况类似,但更简单——而且——我保证!是——可以——容易阅读! (我没有,但我认为作为一个留着灰胡子的UNIX老手在这方面有很大帮助。)
其他回答
我不得不在某一点上不同意其中的一个评论:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
不,这不是疯狂的线上旅行
只是在外行看来,嗯…
在某种程度上,它使用通用模式作为一种语言;
在你学会了语言之后。
事实上,读起来很不错
它是一个简单的逻辑表达式,有一个特殊的部分:逻辑运算符的惰性求值。
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
每个部分都是一个逻辑表达式;第一个可能是真的,也可能是假的,其他两个永远是真的。
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
现在,当它被求值时,第一个被选中。如果为false,则逻辑的第二个操作数和后面的&&不相关。第一个不是真的,所以第一个不可能是真的,第二个也不可能是真的。 现在,在这种情况下,逻辑的第一边或||是假的,但如果另一边-第三部分-是真的,它可能是真的。
所以第三部分将被评估-主要是作为一个副作用写消息。(true的结果为0,这里不使用)
其他情况类似,但更简单——而且——我保证!是——可以——容易阅读! (我没有,但我认为作为一个留着灰胡子的UNIX老手在这方面有很大帮助。)
要比较字符串和通配符,使用:
if [[ "$stringA" == *"$stringB"* ]]; then
# Do something here
else
# Do something here
fi
我也曾在同样的情况下挣扎过一段时间,下面是我解决的方法:
if [ "$var1" == "$var2" ]; then
#dowhateveryouwant
fi
注意比较符号前后的空格,否则将不起作用,或者会得到意想不到的结果。
我花了很多时间在使用一个等号(=)上,但没有用。希望能有所帮助。
你也可以使用用例/esac:
case "$string" in
"$pattern" ) echo "found";;
esac
Bash 4+示例。注意:当单词中包含空格时,不使用引号会导致问题。在我看来,总是用Bash引用。
下面是Bash 4+中的一些例子:
例1,在字符串中检查'yes'(不区分大小写):
if [[ "${str,,}" == *"yes"* ]] ;then
例2,检查字符串中的'yes'(不区分大小写):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
例3,检查字符串中的'yes'(区分大小写):
if [[ "${str}" == *"yes"* ]] ;then
例4,检查字符串中的'yes'(区分大小写):
if [[ "${str}" =~ "yes" ]] ;then
例5,精确匹配(区分大小写):
if [[ "${str}" == "yes" ]] ;then
例6,精确匹配(不区分大小写):
if [[ "${str,,}" == "yes" ]] ;then
例7,精确匹配:
if [ "$a" = "$b" ] ;then
享受。