单个命令行参数不是 运行 if 语句

Single command line parameter not running if statement

我正在编写一个 bash 脚本来组织一个 .txt 文件,其中使用命令行参数 bash 脚本加载该文件:

bash ./myScript.sh textfile.txt

我有一个 if 语句(下面,非功能性),它应该检测 .txt 文件是否存在于同一目录中。如果是,它会与用户确认并继续执行脚本。如果不存在,脚本应该在继续之前不断检查用户的输入是否是工作目录中的现有文件。

这是我目前的情况:

    #CS101 Assignment BASH script
CARFILE=
wc $CARFILE
if [ -f $CARFILE ]
then 
    echo "$CARFILE exists, please continue"
else
    echo "This file does not exist, please enter the new filename and press [ENTER]"
read CARFILE
echo "We have detected that you're using $CARFILE as your cars file, please continue."
fi

它只是输出:exists, please continue 如果您不使用 .txt 运行 它(即 bash jag32.sh 而不是 bash jag32.sh textfile.txt)。

有人可以帮忙吗?

谢谢。

这里有两个问题。首先,您在检查 $CARFILE 是否存在之前调用 wc $CARFILE。如果您不指定任何参数 (bash jag32.sh),那么这将变成简单的 wc,它将永远等待 stdin 上的输入。

在继续之前,bash -x 是您的朋友:这将跟踪脚本的执行,向您准确显示脚本的命令 运行。这通常有助于阐明问题:

bash -x jag32.sh

你的测试问题:

if [ -f $CARFILE ]

是不是如果$CARFILE为空,就变成了简单的:

if [ -f ]

计算结果为 true。什么!?那是因为文件存在性测试有两个参数 (-f FILE),当 $CARFILE 为空时,你只有一个,所以它被评估为一个简单的 is-this-string-empty?测试。

这就是为什么你总是引用变量:

if [ -f "$CARFILE" ]

如果 $CARFILE 为空,则变为:

if [ -f "" ]

计算结果为 false

除了检查文件是否存在之外,您还可以首先检查 </code> 是否有任何值,或者您的脚本是否已传递任何参数。 <code>bash(1)test(1) 手册页中的详细信息应该能为您指明正确的方向。