Shell脚本文件名前缀匹配逻辑失效,无法识别changeip.data文件
问题排查与修改方案
原代码的两处核心问题
- 第一处是Shell语法硬错误:Shell 的变量赋值要求等号两侧不能加任何空格,原代码写的
file = "changeip.data"会被Shell解析为“执行名为file的命令,传入两个参数=和changeip.data”,直接报command not found错误,脚本根本无法执行到后续的if判断逻辑。 - 第二处是逻辑错位:哪怕把变量赋值的空格去掉,原逻辑也是在对硬编码的字符串值做前缀匹配,完全没有去查询目标目录下真实存在的文件。这种写法的问题是,只要硬写的字符串符合
change*的匹配规则,哪怕目标目录下根本不存在对应文件,也会输出“File found”的错误结果——甚至如果脚本没有成功切换到目标目录,判断结果也会和实际文件系统状态完全脱节,完全不符合“检测目录内真实文件”的需求。
修正后的可运行代码
要实现“检测目标目录下是否存在文件名以change为前缀的文件”,需要去掉硬编码的字符串判断,直接对文件系统做检测,同时补上目录切换的容错逻辑:
# 切换到目标目录,若切换失败直接退出,避免在错误目录做检测 cd /home/raymond || exit 1 # 检测当前目录下是否存在change开头的文件 # 用bash内建compgen做通配符匹配,无额外进程开销 if compgen -G "change*" > /dev/null; then echo "File found..." else echo "File not found..." fi
可选的兼容写法
如果需要在不依赖compgen的Shell环境运行,可以用find命令实现同样的检测,仅扫描当前目录不递归子文件夹:
cd /home/raymond || exit 1 # 找到第一个匹配文件就立即退出,减少不必要的扫描开销 if [ -n "$(find . -maxdepth 1 -name 'change*' -print -quit)" ]; then echo "File found..." else echo "File not found..." fi
内容的提问来源于stack exchange,提问作者raymond indwar
相关产品推荐
相关产品推荐

