You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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转换脚本格式:
    dos2unix your_script.sh
    
    或用sed去除\r字符:
    sed -i 's/\r$//' your_script.sh
    

内容的提问来源于stack exchange,提问作者Hamza Mohammad Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 17:52:40