Shell脚本if [ -f ]判断文件存在性始终失败,echo路径显示正确的原因
Shell 文件存在判断始终失败的原因
你遇到的「echo $a 输出路径完全正确,但if [ -f $a ]永远判断不通过」的问题,基本是两个高频疏漏导致的:
1. 读取的内容混有不可见的隐藏字符
这是这类问题最常见的诱因:
- 你逐行读取的
order文件如果是从Windows环境、跨平台编辑器保存的,每行换行是CRLF格式(带\r回车符),read命令读行时会把这个\r一并存进变量。 - 执行
echo $a时,终端遇到\r会把光标移回行首,你肉眼看到的路径文本是完全正常的,但实际上变量$a的尾部已经混进了这个看不见的回车符,最终拼出来的待判断路径是x86_64/真实路径\r,系统根本找不到这个带特殊字符的文件,自然判断失败。 - 快速实锤方法:拿到变量a之后执行
echo "$a" | od -c,如果输出末尾出现\r字符,就可以确认是这个问题。 - 修复方式:读入内容后主动清除回车符,比如把取值代码改成
b=$(echo "$line" | awk '{print $2}' | tr -d '\r'),过滤掉隐藏字符再做路径拼接。
2. Shell 判断语句的语法细节疏漏
Shell 的内置判断命令[对空格的要求非常严格:
- 如果你写判断时漏了
[和-f之间的空格(比如写成if [-f $a ]),Shell会直接把[-f当成一个不存在的外部命令去找,根本不会执行文件存在校验,自然永远走else分支输出No。 - 另外判断时不给变量加双引号也是高频坑:如果路径里带空格,不带引号的
$a会被Shell拆成多个零散参数传给[命令,直接触发语法错误。规范写法应该是if [ -f "$a" ]。
内容的提问来源于stack exchange,提问作者Thilina Sameera
相关产品推荐
相关产品推荐

