这是我的代码:
#!/bin/bash
if [ "$#" -ne 2 ] ; then
echo "$0: exactly 2 arguments expected"
exit 3
fi
if [$1 != "file" -a $1 != 'dir'] ; then
echo "$0: first argument must be string "file" or "dir""
exit 1
elif [-e $2 -a -r $2]; then
if ["$1" = "file" -a -f $2] ; then
echo YES
elif ["$1" = "dir" -a -d $2] ; then
echo YES
else
echo NO
fi
exit 0
else
echo "$0: $2 is not a readable entry"
exit 2
fi
如果我运行./lab4 file filename1
,它将检查第一个参数是字符串“file”还是“dir”,如果第一个参数是“file”而filename1是文件,它将打印是。 dir也是一样。
它无法识别$1
和$2
。代码将输出:
./lab04Q2: line 7: [file: command not found
./lab04Q2: line 10: [-e: command not found
即使我在运行程序时输入了2个参数。
答案 0 :(得分:48)
在bash中尝试以下3行:
if [ "a" == "a" ]; then echo hi; fi
if ["a" == "a" ]; then echo hi; fi
if ["a" == "a"]; then echo hi; fi
你会看到只有第一个有效,而另外两个没有。也就是说,你的空间不足是你表达不起作用的原因。
上面的示例还建议您可以直接在bash提示符下测试bash语法。您可以在将它们合并到脚本中之前将其正确使用。
答案 1 :(得分:23)
问题来自[
实际上是命令的事实。实际上它是test
命令的别名。为了使其正常运行,您需要在[
之后添加空格,如下所示:
if [ $1 != "file" -a $1 != 'dir' ] ;
为[
之后没有空格的所有实例执行此操作。
P.S。
由于您使用bash
作为翻译,我强烈建议您使用[[ ]]
代替[ ]
进行测试,因为前者比后者更有能力而没有缺点;不需要空间就是其中之一