2016-04-07 45 views
1

如果要結合多個測試,您如何否定bash中的測試?如何否定bash中的邏輯表達式

的代碼是

if ! [ $(pgrep Xvfb) ] || [ ! -v DISPLAY ]; then 
    echo starting xvfb 
    mkdir -p /tmp/xvfb 
    Xvfb :1 -fbdir /tmp/xvfb > /tmp/xvfb_output 2>&1 & 
    export DISPLAY=:1 
fi 

它應該被採購,如果尚未運行啓動的Xvfb。 以前,它缺少|| [ ! -v DISPLAY ]部分來檢查所述變量的存在。

爲了否定測試,您可以執行! [ ... ][ ! ... ],這兩者似乎都有效。

推理是否正確,你應該使用[ ! ...],因爲它在測試中,因此它更清晰(和更有效率)?

回答

1

我敢肯定,無論你把否定的效率放在哪裏都沒有關係。至於可讀性,你可以寫你的if聲明是這樣的:

if ! (test "$(pgrep Xvfb)" -a -n "${DISPLAY:+1}"); then

這種方式,你有一個測試只有一個否定。

我同意你的看法

if ! [ $(pgrep Xvfb) ] || [ ! -v DISPLAY ]; then

是含糊不清,

if [ ! $(pgrep Xvfb) ] || [ ! -v DISPLAY ]; then

不是。

+0

重寫爲AND子句並沒有發生在我身上。謝謝。你是否考慮過「如果! (測試...'行比'if [!...'更具可讀性? –

+1

@user是的,實際上我更喜歡將'test expr'表達式放在'[expr]'中。這種情況下,特別是因爲我的經驗是根本沒有用,因爲它是檢測shell腳本中條件結束的線索。當然,這只是我的看法。:-)如果您更喜歡這種表示法,請使用括號。 –

+0

'[$(pgrep Xvfb)]'本身就是一個錯誤。你希望*'pgrep'的輸出將是一個有效的非空字符串,以便''測試通過。但這不是可靠的或好主意。幸運的是(因爲它是理智的)'pgrep'具有有意義的返回碼。所以要測試它發現了你想要的東西'if pgrep Xvfb&>/dev/null;然後回聲「現在做一些事情,我們發現Xvfb」; fi'。對於這種情況,這將是'如果! pgrep Xfvb&>/dev/null || [! -v DISPLAY];然後 ....; fi'。我還會注意到,如果'DISPLAY'被取消設置,這可能會或可能不是您想要的,它會多次運行Xvfb。 –