为什么 'if [ $# > 0 ] ; then' 是错误的?

3
为什么第三个命令仍然会产生输出?
$cat sh.sh
#!/bin/sh
echo $#
if [ $# > 0 ] ; then
    base=`basename $1 .c`
    echo $base
fi
$ sh sh.sh a.c
1
a
$ sh sh.sh
0
.c

我使用这个文件:/usr/share/doc/opencv-doc/examples/c/build_all.sh 来构建opencv软件包的c语言示例,但是遇到了类似的错误。

1
如果你的shebang写着#!/bin/sh,那你并没有真正使用Bash。如果你想要使用>和双括号,就像codaddict提到的那样,那么你需要写上#!/bin/bash。然后你可以这样写:if (( $# > )) - undefined
3个回答

7

你需要使用-gt代替>

如果使用双括号结构,可以使用>


谢谢,所以这是opencv-doc软件包中的一个错误。至少第一行应该更改为#!/bin/bash或者**>改为-gt**。 - undefined

2

在条件语句中,应该使用 -gt(大于)而不是 >。请查看 man test 以获取更多信息。

if [ $# -gt 0 ] ; then
    base=`basename $1 .c`
    echo $base
fi

2
请记住,[是一个命令。确切地说,它链接到命令/usr/bin/test
因此,[ $# > 0test $# > 0完全相同,即将test $#的输出重定向到文件0
如果您正在使用bash ...那就是另一回事了 :-)

1
[ 是除了 Bash 之外,几个 shell 中的内建命令。但你说得对,它确实是一个“命令”。/usr/bin/[(以及 /usr/bin/test)主要是为了向后兼容那些不包含它的 shell 而存在的。当你实际上并没有使用 shell 时,例如在 find 命令的 -exec 子句中,也可以使用它。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接