2013-07-31 61 views
0

我正在檢查遠程服務器上的進程是否已被殺死。我正在使用的代碼是:Bash - 命令的輸出似乎是一個整數,但「[」抱怨

if [ `ssh -t -t -i id_dsa [email protected] "ps -auxwww |grep pipeline| wc -l" | sed -e 's/^[ \t]*//'` -lt 3 ] 
then 
    echo "PIPELINE STOPPED SUCCESSFULLY" 
    exit 0 
else 
    echo "PIPELINE WAS NOT STOPPED SUCCESSFULLY" 
    exit 1 
fi 

然而,當我執行此我得到:

: integer expression expected 
PIPELINE WAS NOT STOPPED SUCCESSFULLY 
1 

返回的實際值是「1」,無空白。我通過以下方式檢查了:

vim <(ssh -t -t -i id_dsa [email protected] "ps -auxwww |grep pipeline| wc -l" | sed -e 's/^[ \t]*//') 

然後是僅顯示整數和換行符的「:set list」作爲返回值。

我不知道爲什麼這不起作用。

+0

而不是'grep pipeline | wc -l'嘗試使用'grep -c pipeline' – anubhava

+0

當我運行該命令時,在數字末尾看到一個'\ r \ n',這可能會導致比較失敗。爲了快速「修復」它,我通過另一個「sed」管道在第一個之後:'... | sed -e's/\ r * $ //''。然後它沒有錯誤地工作。我不確定'\ r'中有什麼東西在折騰。因此,您的整個'ssh'行如下所示:'ssh -t -t -i id_dsa [email protected]「ps -auxwww | grep pipeline | wc -l」| sed -e's/^ [\ t] * //'| sed -e's \\ r * $ //'' – lurker

+0

它增加了額外的\ r,所以你是sed命令的工作。謝謝,我會投你的答案,但你沒有發佈它作爲答案。 –

回答

1

如果ssh命令的輸出結果只是一個前面帶有可選選項卡的整數,那麼您應該不需要sed命令;在使用它作爲-lt運算符的操作數之前,shell會將前導和/或尾隨空白除去爲不必要的。

if [ $(ssh -tti id_dsa [email protected] "ps -auxwww | grep -c pipeline") -lt 3 ]; then 

這是可能的ssh的結果是不一樣的,當你手動運行它時,它在shell中運行的。你可以嘗試將其保存在一個變量,所以你可以在你的測試腳本之前,它輸出:

result=$(ssh -tti id_dsa [email protected] "ps -auxwww | grep -c pipeline") 
if [ $result -lt 3 ]; 
+0

不知道shell會剝掉多餘的空白,謝謝。我試着把它保存到一個變量中(就像你上面寫的那樣),結果是一樣的。 –

+0

'result'的值是什麼?如果它是空字符串,就像您原來的錯誤信息所暗示的那樣,那麼問題出在您期望通過遠程調用返回到'ps'的一組進程。 – chepner

+0

我懷疑這是導致問題的tty分配。對我來說,當連接關閉而不僅僅是返回輸出時,這會讓ssh報告。 –

0

你得到的返回值不完全是一個數字。也許有些殼元字符/換行/任何進入這裏用自己的方式:當用戶mbratch注意到我正在在除了預期的「\ n」返回值「\ r」

#!/bin/bash 

var=$(ssh -t -t -i id_dsa [email protected] "ps auxwww |grep -c pipeline") 

echo $var 

# just to prove my point here 
# Remove all digits, and look wether there is a rest -> then its not integer 
test -z "$var" -o -n "`echo $var | tr -d '[0-9]'`" && echo not-integer 

# get out all the digits to use them for the arithmetic comparison 
var2=$(grep -o "[0-9]" <<<"$var") 

echo $var2 


if [[ $var2 -lt 3 ]] 
then 
    echo "PIPELINE STOPPED SUCCESSFULLY" 
    exit 0 
else 
    echo "PIPELINE WAS NOT STOPPED SUCCESSFULLY" 
    exit 1 
fi 
0

。所以我改變了我的sed腳本,以便刪除「\ r」而不是空格(chepner指出這是不必要的)。

sed -e 's/\r*$//'