bash中能否使用连续or运算符?如何简化多后缀匹配的条件表达式?
Bash 多条件匹配写法问题解答
为什么修改后的写法无法正常工作
bash 的 [[ ]] 复合命令中,逻辑或运算符 || 连接的必须是完整的独立布尔表达式。你写的第二种写法会被解析为如下逻辑:
判断
$INPUT_FILE == *".aac"是否成立,若不成立则直接判断字符串*".aiff"是否非空,再判断*".pcm"是否非空
由于单独的非空字符串在条件判断中永远返回真,整个表达式的逻辑完全不符合你预期的多后缀匹配规则,自然无法得到正确结果。
Bash 是否支持连续或运算符
支持,但每个 || 连接的都必须是完整的判断条件。你原本的写法可以先精简为同一个 [[ ]] 块内的连续或判断,逻辑和原写法完全一致:
if [[ $INPUT_FILE == *.aac || $INPUT_FILE == *.aiff || $INPUT_FILE == *.pcm ]]
注意:[[ ]] 中使用 == 做通配符匹配时,通配符部分不要加引号,否则会被识别为普通字符串,无法正常匹配。
更精简的优化方案
方案1:使用extglob扩展通配符(适合固定多模式匹配)
先开启extglob扩展(脚本中建议显式开启):
shopt -s extglob
匹配逻辑可以简化为一行:
if [[ $INPUT_FILE == *.@(aac|aiff|pcm) ]]
@(pattern1|pattern2) 是extglob的语法,代表匹配括号内任意一个模式,非常适合多后缀匹配场景。
方案2:使用case语句(适合多分支判断场景)
如果后续要针对不同后缀做不同处理,case语句的可读性更高:
case $INPUT_FILE in *.aac|*.aiff|*.pcm) # 符合条件时的执行逻辑 ;; *) # 不符合条件时的执行逻辑 ;; esac
方案3:正则匹配(适合动态后缀列表场景)
如果支持的后缀是动态生成的,可以用正则匹配实现:
# 动态定义支持的后缀列表 SUPPORT_EXTS=("aac" "aiff" "pcm") # 拼接为正则匹配格式 EXT_PATTERN=$(IFS='|'; echo "${SUPPORT_EXTS[*]}") if [[ $INPUT_FILE =~ \.($EXT_PATTERN)$ ]] then echo "格式匹配成功" fi
内容的提问来源于stack exchange,提问作者Joey Joestar
相关产品推荐
相关产品推荐

