2012-01-20 141 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