以下是我的bash脚本中的代码。当我给出命令2个参数时,我得到一个错误,说二元运算符是预期的(当我给出1个参数时,不会给出错误)。当我提供2个参数时,它确实会更改文件权限,因为当我执行ls -l时我可以看到它,但它仍然给我这个错误。我该如何解决?
for file in $@
do
chmod 755 $file
done
if [ -z $@ ]
then
echo "Error. No argument."
exit $ERROR_CODE_1
fi
我现在添加了这个
if [ ! -f "$*" ]
then
echo "Error. File does not exist"
exit $ERROR_NO_FILE
fi
但是现在当我输入多于1个参数时,它只会在if语句中执行所有操作(即打印error.file不存在),即使该文件存在也是如此。
答案 0 :(得分:3)
另一种方式:只要询问传递了多少参数:
...
if [ $# -eq 0 ]
...
您的代码中出现错误,因为$ @变量扩展为多个单词,这使得test
命令看起来像这样:
[-z parm1 parm2 parm3 ...]
答案 1 :(得分:2)
$@
正在扩展到所有参数,它们之间有空格,所以它看起来像:
if [ -z file1 file2 file3 ]
但-z
只需要一个字。您需要使用$*
并引用它,因此它会扩展为一个单词:
if [ -z "$*" ]
这扩展为:
if [ -z "file1 file2 file3" ]
或者只是检查参数的数量:
if [ $# -eq 0 ]
您还应该在for
循环之前进行此检查。你应该引用for
循环中的参数,这样你就不会遇到有空格的文件名问题:
for file in "$@"