2012-01-20 116 views
1

我是shell脚本中的新手,试图捕获程序的返回值,并对其执行某些操作。Shell脚本elif

我有以下

#!/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

您需要[后一个空间,你需要使用-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 
+0

谢谢。有用 :) – heike

2

变化:

if [ $out==0 ]; then 

到:

if [ $out = 0 ]; then 

添加空格,并改变 '==' 到 '='。请注意,该bash,作为bash执行接受==。但如果你运行的是一个sh,它会说“意外运营商”

为什么:

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

BTW:

它的安全总是enquote这样的变量:

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

,而不是

if [ $var 

因为当变量是空的,那么你就可以得到另一个错误由于参数数量错误(无参数而不是空字符串)。

+0

它返回我: “[11:0:意外操作 [15:==:意外操作 ” – heike

+0

有一种说法,是不是空的计算结果为 '真' 。 –

+0

@heike:当然,正确的参数是'='不是'=='。修复了答案。 –

1

你有几个问题。这是给你的错误之一是,你需要经过!空格=上

 
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 
+0

它返回我:“[:11:0:意外的运营商 出ok ok ” – heike