【问题标题】:Unix bash error - binary operator expectedUnix bash 错误 - 需要二进制运算符
【发布时间】:2017-04-17 18:33:11
【问题描述】:

下面是我的 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 不存在),即使文件确实存在。

【问题讨论】:

  • 不要改变你的问题。如果您有 问题,您应该将其作为新问题发布,而不是更改您的 现有 问题。

标签: bash shell unix command


【解决方案1】:

换一种方式:只问传递了多少参数:

...
if [ $# -eq 0 ]
...

您的代码中出现错误,因为 $@ 变量扩展为多个单词,这使得 test 命令看起来像这样:

[-z parm1 parm2 parm3 ...]

【讨论】:

  • 引用$@ 仍然可以给-z 多个参数;这些参数中的空白只是保留。
  • 那会教我不用测试就能回答!谢谢,@chepner!
【解决方案2】:

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

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

【讨论】:

  • 我已在问题框中更新了上面的代码,但出现了不同的错误,请您帮帮我。我是初学者,需要帮助。
【解决方案3】:

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

if [ -z file1 file2 file3 ]

-z 只希望在其后添加一个词。您需要使用$* 并引用它,因此它会扩展为一个单词:

if [ -z "$*" ]

这扩展为:

if [ -z "file1 file2 file3" ]

或者只检查参数的数量:

if [ $# -eq 0 ]

您还应该将此检查放在for 循环之前。你应该在for 循环中引用参数,这样你就不会遇到带有空格的文件名的问题:

for file in "$@"

【讨论】:

  • 我已在问题框中更新了上面的代码,但出现了不同的错误,请您帮帮我。我是初学者,需要帮助。
  • -f 后面只需要一个文件名,但您将所有文件名参数组合到一个测试中。
  • 如果您有其他问题,您应该发布一个新问题,而不是将其添加到已回答的问题中。
  • 是的,我该如何解决。请。我猜是for循环。
  • 我不明白你想做什么。您应该在for 循环内使用if [ ! -f "$file" ]。为什么要测试整个参数列表?
猜你喜欢
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
相关资源
最近更新 更多