【发布时间】: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 "$#" )- 仅生成一个子进程,并且这是一个子shellfork()ed off 没有execve下列的;与生成一个子shell 的原始代码进行比较,然后从该子shell 生成另外三个,一个到exec,每个ls、grep和wc。