2012-02-03 42 views
1

如果在bash 4中有條件的話,可以在裏面分配變量嗎?即。在下面的函數中我想分配執行cmd的輸出來輸出並檢查它是否是一個空字符串 - 都在測試條件內。該函數應輸出如果在bash 4中有條件,那麼在裏面分配變量?

「命令返回:酒吧」

myfunc() { 

local cmd="echo bar" 
local output= 

while [[ -z output=`$cmd` ]]; 
do 
    #cmd is failing so far, wait and try again 
    sleep 5 
done 

# great success 
echo "command returned: $output" 
} 

爲什麼上面?

我更喜歡用'set -e'運行腳本 - 這會導致腳本終止於不在if/loop條件中的第一個非0返回/退出代碼。

考慮到這一點,想象一下,cmd是一個不穩定的命令,可能會隨時退出> 1,我想繼續調用它,直到成功並獲得一些輸出。

+0

你的代碼相當於'if [[!! -z output = bar]]'。 – 2012-02-03 21:22:55

+0

你試過了嗎?爲什麼你想首先做到這一點? – 2012-02-03 21:24:34

+0

以上是一個微不足道的例子 - 我將澄清 – Nikita 2012-02-03 21:26:32

回答

0

你可以嘗試這樣的事情:

myfunc() { 

    local cmd="echo bar" 
    local output= 

    while ! output=$($cmd) || [[ -z output ]]; 
    do 
     #cmd is failing so far, wait and try again 
     sleep 5 
    done 

    # great success 
    echo "command returned: $output" 
} 

要注意的是strongly recommended避免使用set -e

+0

很長時間沒有看到 – SiegeX 2012-02-04 03:30:55

+0

感謝您的答案 - 適用於我。 「set -e」是不可靠的 - 太糟糕了 - IMO實現設置-e背後的目標將非常有用 – Nikita 2012-02-05 16:07:39

0

我不認爲你將能夠做到這一點在你的條件

由於yi_H指出的那樣,如果是相當於

if [[ ! -z output=bar ]];

這又是基本上

if [[ ! -z "output=bar" ]];

所以,你所檢查的是如果字符串「輸出=酒吧」是空的或不...

因此,output = bar實際上可以是!@#!@%===之類的東西,它仍然會執行相同的操作(即不評估表達式)。您可能必須以某種方式在子外殼中分配變量,但我不確定這會起作用。

0

由於分配不會在那裏工作,您需要一些workaroudn。

你可以暫時做一個set +e ...

-1

你可以用這種方式...

$cmd 
exit_status=$? 

while [[ $exit_status -gt 0 ]]; 
do 
    #cmd is failing so far, wait and try again 
    sleep 5 

    $cmd 
    exit_status=$? 
done 

編輯:這不會工作 '設置-e' 或其他方式周圍,​​不要使用'set -e'開頭。

+0

內部沒有包括它。'set -e'會引起混亂,並且會強制以非自然的方式編寫腳本。國際海事組織,這是比它的價值更麻煩。這段代碼就是應該避免的一個例子。 – Nikita 2012-02-07 14:04:42

+0

同意後退出,這就是爲什麼這個答案在測試條件 – 2012-02-07 17:15:18