为什么外卡不能用于if子句bash

时间:2014-08-14 07:55:18

标签: linux bash shell glob

下面是我在shell脚本中的代码


for i in "${status_array[@]}"
do
        if [[ $i == "*start*"  ]]; then
                echo "$i"
                echo "${service_array[$count]}  $i "
        fi

        count=`expr $count + 1`
        isStarted=""
done

for j in "${status_array[@]}"
do
        echo "$j"
done


在j的下面循环的这个脚本中,$ j显示少量值为stop.waiting,很少显示为开始/运行。但是对于上面的循环控制来到if子句块。并且在这里$ i将每个值显示为开始/运行,所以为什么会发生这种情况。

2 个答案:

答案 0 :(得分:3)

您应该将"*start*"更改为*"start"*。如果在引号周围放置glob模式,它将以字面形式匹配。

答案 1 :(得分:3)

使用[[ ]]时,您不需要引用字符串

  单词

不执行单词拆分和路径名扩展   在[[和]]之间;波浪扩展,参数和变量   扩展,算术扩展,命令替换,过程
  替换和引用删除被执行。

并且引用会禁用您的glob 模式。

解决方案

删除[[ ]]测试中的引号

if [[ $i == *start*  ]]; then
    echo "$i"
fi 

测试

让我们看看bash

set -x做了什么

带引号

set -x; i=starter; [[ $i == "*start*" ]] && echo "yes" || echo "no"; set +x
+ set -x
+ i=starter
+ [[ starter == \*\s\t\a\r\t\* ]]
+ echo no
no

查看所有内容,即使*已转义。

没有引号

set -x; i=starter; [[ $i == *start* ]] && echo "yes" || echo "no"; set +x
+ set -x
+ i=starter
+ [[ starter == *start* ]]
+ echo yes
yes

Moar

What is the difference between test, [ and [[ ?