Bash脚本中判断文件名含指定字符串的问题排查
问题分析与解决方案
嘿,我来帮你拆解下脚本里的两个关键问题,都是bash脚本里很容易踩的小坑:
第一个错误:条件判断符号缺少空格
你写的[[$file == *"$STRING"*]]里,[[和$file之间、]]和前面的表达式之间都没有空格。在bash中,[[是一个内置命令,不是单纯的语法符号,必须和后续表达式用空格隔开,否则shell会把[[*.out当成一个完整的命令去查找,自然会报“command not found”的错误。
第二个错误:变量加引号导致通配符不展开
你用for file in "$OT"时,双引号会把*.out当成一个字面字符串,而不是让shell去匹配当前目录下所有.out结尾的文件。所以循环只会执行一次,处理的是字符串*.out,而不是实际的a.out、b.out这些文件——这也是为什么$file会被当成$OT而非单个匹配文件的核心原因。
修正后的脚本
我把两个问题都修复了,你可以直接运行:
OUT_FILE="*.out" OT=$OUT_FILE STRING="a" for file in $OT; do # 去掉双引号,让通配符正常展开为具体文件名 if [[ $file == *"$STRING"* ]]; then # 给[[、]]前后添加空格,符合bash语法要求 echo $file fi done
额外优化建议
其实你可以简化脚本逻辑,去掉中间变量让代码更直观,同时给输出变量加引号避免文件名含空格时出问题:
STRING="a" for file in *.out; do if [[ $file == *"$STRING"* ]]; then echo "$file" fi done
甚至可以用grep一行搞定,更简洁高效:
ls *.out | grep "$STRING"
内容的提问来源于stack exchange,提问作者katiayx
相关产品推荐
相关产品推荐

