我正在编写一个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
。
有人可以帮帮忙吗?
感谢。
答案 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)
手册页的详细信息应指向正确的方向。