You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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* ]]; then
  • if [[ "$i" == "et"* ]]; then
  • if [[ "$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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 21:50:11