Unix bash错误-应为二进制运算符

Unix bash错误-应为二进制运算符,bash,shell,unix,command,Bash,Shell,Unix,Command,下面是我在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

下面是我在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

但现在,当我输入多个参数时,它只执行if语句中的所有操作(即prints error.file不存在),即使该文件确实存在。

另一种方法:只需询问传递了多少个参数:

...
if [ $# -eq 0 ]
...
代码中出现错误是因为$@变量扩展为多个字,这使得
test
命令如下所示:

[-z parm1 parm2 parm3…]


将参数用双引号括起来,以避免分词和路径名扩展:

for file in "$@"
do
    chmod 755 "$file"
done

if [ -z "$*" ] # Use $* instead of $@ as "$@" expands to multiply words.
then
        echo "Error. No argument."
        exit "$ERROR_CODE_1"
fi
但是,您可以稍微更改代码:

for file # No need for in "$@" as it's the default
do
    chmod 755 "$file"
done

if [ "$#" -eq 0 ] # $# Contains numbers of arguments passed
then
    >&2 printf 'Error. No argument.\n'
    exit "$ERROR_CODE_1" # What is this?
fi

$@
正在扩展到所有参数,它们之间有空格,因此看起来像:

if [ -z file1 file2 file3 ]
但是
-z
只要求后面有一个单词。您需要使用
$*
并引用它,以便它扩展为一个单词:

if [ -z "$*" ]
这扩展为:

if [ -z "file1 file2 file3" ]
或者只需检查参数的数量:

if [ $# -eq 0 ]
您还应该将此检查置于
for
循环之前。您应该在
循环中引用
for
的参数,这样您就不会对带有空格的文件名产生问题:

for file in "$@"

我已经在问题框中更新了我上面的代码,并且得到了一个不同的错误,请您帮助我。我是一个初学者,需要帮助。我已经在问题框中更新了上面的代码,遇到了一个不同的错误,请你帮助我。我是初学者,需要帮助。
-f
要求后面只有一个文件名,但您正在将所有文件名参数合并到一个测试中。如果您有不同的问题,您应该发布一个新问题,而不是将其添加到已回答的问题中。是的,那么我如何修复它。请我想是吧,我不明白你想做什么。您应该在
for
循环中使用
if[!-f“$file”]
。为什么要测试整个参数列表?引用
$@
仍然可以给出
-z
多个参数;这些参数中的空白被保留了下来。这将教会我不用测试就回答问题!谢谢,@chepner!不要改变你的问题。如果你有一个新问题,你应该把它作为一个新的,而不是改变你现有的问题。