【问题标题】:[: -le: unary operator expected[:-le:应为一元运算符
【发布时间】:2016-11-15 18:26:23
【问题描述】:

我正在编写一个简单的代码,它输出以00 开头的目录中的子目录数。这是我的代码:

#!/bin/bash

maxout=2

function getnumber {
    number=`ls | grep 00 | wc -l`
    return $number
}

qs=`getnumber`
echo $qs
if [ $qs -le $maxout ]
    then
        echo 'Youpiiii !!!'
else
    echo 'Sleeping for 60 sec'
fi

但是我收到以下错误 [: -le: unary operator expected

当我trace 我的代码时,该功能正在运行。我有

++ return 5

但是

+ qs=

我做错了什么?

【问题讨论】:

  • 如果您引用了您的扩展 ([ "$qs" -le "$maxout" ]),您会收到更合理的错误消息。现在,您的代码试图运行[ -le 2 ] 之类的东西,实际上,这是无效的。 [ '' -le 2 ],因为调用将带有正确的引用,所以 test 命令能够发出更正确的错误。
  • ...另外,考虑使用getnumber() {,而不是function getnumber {。前一种语法符合 POSIX 标准,因此适用于 /bin/sh;后者是一种 bashism,但(与许多其他实际增加价值的 bashism 不同)对可移植语法没有任何好处。
  • 另外,don't try to parse the output of ls。如果您想计算名称中包含 00 的文件的数量,可能看起来更合适:getnumber() ( shopt -s nullglob; set -- *00*; echo "$#" ) - 仅生成一个子进程,并且这是一个子shell fork()ed off 没有 execve下列的;与生成一个子shell 的原始代码进行比较,然后从该子shell 生成另外三个,一个到exec,每个lsgrepwc

标签: bash shell terminal


【解决方案1】:

`...` 表示法捕获 ... 打印 的内容,而不是它返回的内容。 (return 主要用于表示成功与失败。)

所以,改变这个:

number=`ls | grep 00 | wc -l`
return $number

到这里:

number=`ls | grep 00 | wc -l`
echo $number

或者只是:

ls | grep 00 | wc -l

【讨论】:

  • 当然更正确,但我认为在理想的世界中,我们会劝阻 OP 不要使用外部工具完全来完成 shell 可以做得很好的事情单独使用内置函数。
  • 那么如何将函数的输出分配给变量?我不习惯用 bash 编码。这就是我在python中的做法。谢谢!
  • @aloha:您已经正确捕获了输出;只是输出是通过echoprintf 等填充的,而不是通过return。如果您想要的是退出状态(这是return 设置的),那么您可以在命令完成后检查$? 变量的值。但这不适合您问题中描述的情况。
  • 好的,谢谢。这正是我需要的。那么这是一个“玩具”的例子。我的代码比那更复杂。 $? 完成这项工作
猜你喜欢
  • 2015-03-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2018-10-25
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多