Linux中使用变量检查目录存在性结果异常的原因咨询
Shell脚本目录检查变量使用异常问题排查
问题场景
目标目录/home/bob/caleston实际存在,但使用变量存储路径进行检查时,脚本输出Directory not found:
dir="/home/bob/caleston" if [ -d $dir ] then echo "Directory exists" else echo "Directory not found" fi
而直接将路径写入条件语句时,脚本输出Directory exists:
if [ -d "/home/bob/caleston" ] then echo "Directory exists" else echo "Directory not found" fi
问题原因
1. 变量引用未加双引号
Shell中,未加引号的变量$dir会被执行单词拆分和文件名扩展操作。即使路径表面无空格,若变量值包含制表符、通配符等特殊字符,或变量被意外清空,都会导致[ -d $dir ]的参数解析异常,判断逻辑失效。[命令会错误地将拆分后的内容当作多个参数处理,而非完整路径。
2. 脚本含Windows换行符(CRLF)
若脚本在Windows环境编辑后部署到Linux,文件换行符会是\r\n(CRLF)而非Linux标准的\n(LF)。这会让变量dir的值末尾多出一个不可见的\r字符,实际检查路径变为/home/bob/caleston\r,该目录不存在,因此脚本输出错误。直接写路径的脚本若未受此影响,就能正常判断。
解决办法
- 给变量引用添加双引号,确保路径作为整体传递:
dir="/home/bob/caleston" if [ -d "$dir" ] then echo "Directory exists" else echo "Directory not found" fi - 若为换行符问题,用
dos2unix转换脚本格式:
或用sed去除dos2unix your_script.sh\r字符:sed -i 's/\r$//' your_script.sh
内容的提问来源于stack exchange,提问作者Hamza Mohammad Khan
相关产品推荐
相关产品推荐

