下面是我在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将每个值显示为开始/运行,所以为什么会发生这种情况。
答案 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