Unix bash错误-应为二进制运算符
下面是我在bash脚本中的代码。当我给出命令2个参数时,我得到了一个错误,表示需要二进制运算符(当我给出1个参数时,不给出错误)。当我给出2个参数时,它确实会更改文件权限,因为我在执行ls-l时可以看到它,但它仍然会给我这个错误。我怎么修理它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
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!不要改变你的问题。如果你有一个新问题,你应该把它作为一个新的,而不是改变你现有的问题。