You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何Linux Shell脚本无法检测到已存在的文件?

问题分析:为何Bash脚本无法检测到已存在的文件?

你的脚本之所以识别不到明明存在的sample.txt,核心问题是单引号的强引用特性导致变量没有被正确解析

具体问题点

在你的判断语句里:

if [ -e '$VAR' ]

这里的单引号'会把内部内容完全当作普通字符串处理,Bash不会解析其中的$VAR变量。也就是说,脚本实际在检查的是一个名为$VAR的文件(而不是变量指向的/home/$USER/MyShellScripts/sample.txt)——这个文件显然不存在,所以才会输出错误提示。第二个判断[ -x '$VAR' ]也犯了同样的错误。

Bash引号规则科普

Bash里的两种引号作用完全不同,搞清楚就能避免这类问题:

  • 单引号':强引用,内部所有特殊字符(包括$\、空格等)都会失去特殊含义,被原样当作普通文本。
  • 双引号":弱引用,内部的变量(比如$VAR)会被解析为对应的值,同时保留空格等特殊字符的含义。

修正后的脚本

只需要把判断条件里的单引号换成双引号,让变量被正确解析即可:

#!/bin/bash
VAR="/home/$USER/MyShellScripts/sample.txt"
if [ -e "$VAR" ]
then
    echo "$VAR exist"
else
    echo "the file $VAR doesn't exist!"
fi
if [ -x "$VAR" ]
then
    echo "You have permissions to execute the file $VAR"
else
    echo "You do not have permissions to execute the file $VAR"
fi

验证小技巧

修改后运行脚本,就能正确检测到sample.txt的存在和执行权限了。如果想确认变量是否被正确解析,可以在脚本开头加一行:

echo "当前检测的文件路径:$VAR"

这样就能直观看到脚本实际在检查的路径。

内容的提问来源于stack exchange,提问作者rcmv

火山引擎 最新活动