Shell脚本elif

时间:2012-01-20 15:47:11

标签: shell

我是shell脚本的新手,试图捕获程序的返回值,并用它做一些事情。

我在下面有这个脚本

#!/bin/sh


if [ $# !=2 ] ; then
        echo "Usage : param1 param2 "
        exit 1;
elif [ $# -eq 2 ]; then
        ./callprogram
        $out = $?
        echo "$out"
fi

if [ $out==0 ]; then
    echo "out ok"
fi

它一直让我错误

"[: 11: 0: unexpected operator

out ok

我不知道第11行是错误的。如果我删除“fi”,它将承诺它需要“fi”。有谁可以帮忙解决这个问题?

谢谢

3 个答案:

答案 0 :(得分:3)

[后需要一个空格,您需要使用-eq(等于)或-ne(不等于)来比较if语句中的数字。

分配变量使用out=$?,而不是$out = $?=标志的任何一侧都不应有空格。

试试这个:

if [ $# -ne 2 ] ; then
        echo "Usage : param1 param2 "
        exit 1
elif [ $# -eq 2 ]; then
        ./callprogram
        out=$?
        echo "$out"
fi

if [ $out -eq 0 ]; then
    echo "out ok"
fi

答案 1 :(得分:2)

变化:

if [ $out==0 ]; then

为:

if [ $out = 0 ]; then

添加空格,并将'=='更改为'='。注意,作为bash执行的bash接受==。但是如果你运行的话就是“意外的操作员”

<强>为什么:

[是一个命令(或用于测试二进制文件的符号链接,具体取决于您的操作系统和shell)。它期望$out==以及0]是单独的命令参数。如果你错过了他们周围的空间,你有一个参数$out==0

<强>顺便说一句:

总是引用这样的变量更安全:

if [ "$var" ...... 

而不是

if [ $var

因为当变量为空时,由于参数数量错误(没有参数而不是空字符串),您可能会收到另一个错误。

答案 2 :(得分:1)

你有几个问题。给你错误的是你在<= p>之后需要一个空格

if [ $# != 2 ]

(虽然-ne会比!=好。你似乎用11个参数调用脚本,然后调用[带参数11 !=2,并且它不知道该怎么办!= 2因为你的意思是!= 2但忘记了空间。另外,你想要

out=$?

关于作业(LHS上没有$) 和

if [ $out = 0 ]

比较。 (运算符周围的空格,'='而不是'=='。'=='将适用于许多shell,但'='适用于更多的shell。)

但是如果没有明确引用$?

,你的脚本会写得更好
#!/bin/sh

if test $# != 2; then
        echo "Usage: $0 param1 param2 " >&2  # Errors go to stderr, not stdout
        exit 1;
fi
# you know $# is 2 here. No need to check

if ./callprogram; then
        echo "out ok"
fi