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 ]
部分來檢查所述變量的存在。
爲了否定測試,您可以執行! [ ... ]
或[ ! ... ]
,這兩者似乎都有效。
推理是否正確,你應該使用[ ! ...]
,因爲它在測試中,因此它更清晰(和更有效率)?
重寫爲AND子句並沒有發生在我身上。謝謝。你是否考慮過「如果! (測試...'行比'if [!...'更具可讀性? –
@user是的,實際上我更喜歡將'test expr'表達式放在'[expr]'中。這種情況下,特別是因爲我的經驗是根本沒有用,因爲它是檢測shell腳本中條件結束的線索。當然,這只是我的看法。:-)如果您更喜歡這種表示法,請使用括號。 –
'[$(pgrep Xvfb)]'本身就是一個錯誤。你希望*'pgrep'的輸出將是一個有效的非空字符串,以便''測試通過。但這不是可靠的或好主意。幸運的是(因爲它是理智的)'pgrep'具有有意義的返回碼。所以要測試它發現了你想要的東西'if pgrep Xvfb&>/dev/null;然後回聲「現在做一些事情,我們發現Xvfb」; fi'。對於這種情況,這將是'如果! pgrep Xfvb&>/dev/null || [! -v DISPLAY];然後 ....; fi'。我還會注意到,如果'DISPLAY'被取消設置,這可能會或可能不是您想要的,它會多次運行Xvfb。 –