我如何比较一个变量的字符串(并做一些事情,如果他们匹配)?


当前回答

你是否存在比较问题?(如下面?)

var="true"
if [[ $var == "true" ]]; then
  # It should be working, but it is not...
else
  # It is falling here...
fi

试试=~操作符(正则表达式操作符),它可能会工作:

var="true"
if [[ $var =~ "true" ]];then
  # Now it works here!!
else
  # No more inequality
fi

Bash正则表达式运算符=~(官方参考) StackOverflow的进一步示例(此处)

其他回答

在if语句中使用变量

if [ "$x" = "valid" ]; then
  echo "x has the value 'valid'"
fi

如果你想在它们不匹配的时候做一些事情,用!=替换=。您可以在它们各自的文档中阅读更多关于字符串操作和算术操作的信息。

为什么在$x周围使用引号?

你需要在$x周围加上引号,因为如果$x为空,你的Bash脚本会遇到如下所示的语法错误:

if [ = "valid" ]; then

==运算符的非标准使用

请注意,Bash允许使用==与[相等,但这不是标准的。

使用第一种情况,其中$x周围的引号是可选的:

if [[ "$x" == "valid" ]]; then

或者使用第二种情况:

if [ "$x" = "valid" ]; then

如果输入只有几个有效项,我可能会使用regexp匹配。例如,只有“开始”和“停止”是有效的操作。

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
  echo "valid action"
fi

注意,我使用双逗号小写变量$ACTION。还要注意,这在太老的bash版本上不起作用。

我不得不在某一点上不同意其中的一个评论:

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

不,这不是疯狂的线上旅行

只是在外行看来,嗯…

在某种程度上,它使用通用模式作为一种语言;

在你学会了语言之后。

事实上,读起来很不错

它是一个简单的逻辑表达式,有一个特殊的部分:逻辑运算符的惰性求值。

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

每个部分都是一个逻辑表达式;第一个可能是真的,也可能是假的,其他两个永远是真的。

(
[ "$x" == "valid" ] 
&&
echo "valid"
)
||
echo "invalid"

现在,当它被求值时,第一个被选中。如果为false,则逻辑的第二个操作数和后面的&&不相关。第一个不是真的,所以第一个不可能是真的,第二个也不可能是真的。 现在,在这种情况下,逻辑的第一边或||是假的,但如果另一边-第三部分-是真的,它可能是真的。

所以第三部分将被评估-主要是作为一个副作用写消息。(true的结果为0,这里不使用)

其他情况类似,但更简单——而且——我保证!是——可以——容易阅读! (我没有,但我认为作为一个留着灰胡子的UNIX老手在这方面有很大帮助。)

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

享受。

或者,如果你不需要else子句:

[ "$x" == "valid" ] && echo "x has the value 'valid'"