Shell脚本复制文件无语法错误却提示文件不存在如何解决
故障原因
报错和文件名准确性无关,核心是Shell通配符展开规则和引号使用冲突:
- 你给通配符模式
*.dat加了双引号赋值,后续执行复制命令时又给$FILE加了双引号,双引号会强制Shell保留字符串字面含义,禁止通配符(globbing)展开,最终Shell会去找文件名字面就是*.dat(文件名本身带星号字符)的文件,自然匹配不到目标文件触发报错。 - 脚本中
cd $SOURCE_PATH没有做失败校验,如果源路径不存在、当前用户无访问权限,cd执行失败后脚本会继续在原工作目录执行复制,也会触发文件不存在错误。
修正方案
如果不需要单独用变量存匹配规则,直接写通配符即可,同时补上cd执行失败的兜底判断,修正后脚本如下:
#!/bin/bash export SOURCE_PATH="/home/la1122/export" export SOURCE_TARGET="/home/la1122/export/backup" cd "$SOURCE_PATH" || { echo "进入源目录失败,脚本退出"; exit 1; } echo "Current location: $(pwd)" cp *.dat "$SOURCE_TARGET"
如果你确实需要把匹配模式存在变量中,注意引用变量时不要加双引号,否则通配符不会展开,对应写法:
FILE=*.dat # 注意这里$FILE不要加双引号 cp $FILE "$SOURCE_TARGET"
补充说明:双引号适合用来包裹固定路径、固定文件名这类不需要做通配匹配、需要保留原始字符的内容,避免空格、特殊字符被Shell拆分;如果字符串里包含
*?这类需要做文件名匹配的通配符,就不能给整段内容加双引号,否则通配符会失效。
内容的提问来源于stack exchange,提问作者Reach Loki
相关产品推荐
相关产品推荐

