Arrays 一个字符串包含bash中的子字符串-不工作
我有以下代码:Arrays 一个字符串包含bash中的子字符串-不工作,arrays,bash,shell,Arrays,Bash,Shell,我有以下代码: #!/bin/bash temp=("aaa", "bbb", "ccc", "ddd", "eee") sub="cc" for i in $temp do if [[ $i == *"$sub"* ]]; then echo "contains sub" fi done 为什么子字符串在循
#!/bin/bash
temp=("aaa", "bbb", "ccc", "ddd", "eee")
sub="cc"
for i in $temp
do if [[ $i == *"$sub"* ]]; then
echo "contains sub"
fi
done
为什么子字符串在循环期间不包含在temp中?(if语句永远不会为true,并且永远不会到达回显)
我可以想象,这段代码一个接一个地遍历temp(例如“aaa”、“bbb”、“ccc”等),并将它们与sub“cc”进行比较,以查看sub是否包含在temp中的任何字符串中,但显然我没有得到任何东西。您有几个问题
,'
,
do if[[$i=~“$sub”];然后
$sub
无引号将被视为正则表达式)
总而言之:
#/bin/bash
温度=(“aaa”“bbb”“ccc”“ddd”“eee”)
sub=“cc”
对于“${temp[@]}”中的i
如果[[$i=~“$sub”]],则执行此操作;然后
回显“$i-包含子项”
fi
完成
示例输出
$ bash s.sh
ccc - contains sub
temp=(“aaa”“bbb”“ccc”“ddd”“eee”)
(注意没有,“
)。。。并使用“${temp[@]}”中的i的访问其元素。请将脚本粘贴到。请注意[[[$i=~$sub]]
将$sub的值视为正则表达式模式;这仅在它包含任何正则表达式元字符时才重要,但如果它包含任何正则表达式元字符,则可能会导致意外结果。如果你想把它当作一个普通字符串来处理,就把它双引号引起来(即使用[[$i==*“$sub”*]
或[$i=~“$sub”]]
)以避免对元字符的解释。@GordonDavisson--这是一个很好的观点。=“$sub”
为什么比==*“$sub”*
更好?@JohnKugelman没有技术原因,两者都会匹配,但是=~
提供了使用正则表达式而不是简单全局匹配的灵活性。[[$i=*“$sub”*]
没有什么问题,选择=~
比其他任何东西都更不符合[…]
的习惯。=~
看起来更好,而且更短