如果语句没有运行单个命令行参数

时间:2015-08-13 22:41:02

标签: bash unix scripting

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

bash ./myScript.sh textfile.txt

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

这是我到目前为止所拥有的:

    #CS101 Assignment BASH script
CARFILE=$1
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

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

有人可以帮帮忙吗?

感谢。

1 个答案:

答案 0 :(得分:2)

这里有两个问题。首先,在检查wc $CARFILE是否存在之前,您正在调用$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

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