Bash脚本判断数组元素是否以指定字符开头出错求助
Bash数组元素前缀匹配问题排查
我需要检查数组中的每个元素是否以指定字符开头,写了代码但没得到预期结果。
我的代码:
arr=("etpass-foo" "etpass-bar" "pass-foo" "pass-abc" "etpass-abc") for i in "${arr[@]}" do if [[ $i == et* ]]; then printf "$i" fi done
实际输出:
etpass-foo etpass-bar pass-foo pass-abc etpass-abc
预期输出:
etpass-foo etpass-bar etpass-abc
我还尝试过以下几种if条件写法:
if [[ $i == et* ]]; thenif [[ "$i" == "et"* ]]; thenif [[ "$i" == "et*" ]]; then
问题原因及修复
你的核心问题大概率是用了sh而非bash执行脚本:
[[ ]]是Bash专属的条件判断语法,POSIX标准的sh不支持该语法。当用sh执行时,[[会被视为不存在的命令,条件判断会默认返回真,导致所有数组元素都被输出。
另外你的printf语句缺少换行符,即使逻辑正确,输出也会挤在一起,需要补充换行。
修正后的Bash代码
arr=("etpass-foo" "etpass-bar" "pass-foo" "pass-abc" "etpass-abc") for i in "${arr[@]}" do if [[ $i == et* ]]; then printf "%s\n" "$i" fi done
兼容POSIX sh的写法
如果需要在标准sh环境中运行,可以用字符串截取的方式判断前缀:
arr=("etpass-foo" "etpass-bar" "pass-foo" "pass-abc" "etpass-abc") for i in "${arr[@]}" do # 截取掉开头的"et"后,若结果和原字符串不同,说明前缀匹配 if [ "${i#et}" != "$i" ]; then printf "%s\n" "$i" fi done
关于你尝试的几种条件写法
- 写法1和写法2:在Bash中都是正确的前缀匹配写法,引号不会影响通配符
*的作用,两者效果完全一致。 - 写法3:把
et*当成了字面量字符串,只会匹配完全等于et*的元素,所以无法得到正确结果。
内容的提问来源于stack exchange,提问作者data-bite
相关产品推荐
相关产品推荐

