2013-05-09 129 views
1

我知道以下命令返回0(真)或1(假)在下列條件:擊:如果(命令)|(命令)

hdparm -C /dev/sda |grep "active/idle" 

如果真磁盤處於激活狀態,否則返回false 。我想以編程方式使用此結果來顯示其他文本或將其用於監視。我試過了,但它不起作用(語法錯誤):

if [ hdparm -C /dev/sda |grep "active/idle" ]; then 
    echo sda1 is ON 
else 
    echo sda1 is OFF 
fi 

它是如何正確工作的?

此外,是否有一個明確可以理解的,權威性的Bash條件表達式指南,可以解釋所有不同類型的表達式語句適用於每種可能的情況?

+0

http://www.robvanderwoude.com/嘗試此頁面 – Arun 2013-05-09 10:11:13

回答

1

裹子shell裏面的條件語句:

if [ -z "$(hdparm -C /dev/sda |grep "active/idle")" ]; then 

-z這裏測試空字符串。可能你也必須用active替換active/idle

編輯:作爲@abasu建議,在這種情況下,最好是測試的grep的返回代碼,這將是0,如果表達匹配:

hdparm -C /dev/sda | grep -q "active/idle" 
status=$? 
if [ $status -eq 0]; then 

你會發現在有條件的所有細節關於test man page的聲明。然而,你的shell可能會進一步擴展語法,就像bash所做的那樣。

+1

這是極其危險的。爲什麼我要檢查一個可能包含來自stderr或stdout的字符串?如果我使用'grep -q'怎麼辦?總是使用'$?'來獲取最後一條命令的結果。 – abasu 2013-05-09 10:08:18

+0

你絕對是對的。編輯。 – 2013-05-09 10:14:14

3

我通常只是簡單地使用

if hdparm -C /dev/sda | grep -q 'active/idle' ; then 
    echo sda1 is ON 
else 
    echo sda1 id OFF 
fi 
+0

@LonelyPixel,當你意識到比'['和'[['只是命令,而不是特殊'if'語法,並且'if'作用於該命令的退出狀態時,這個答案會更明顯。 – 2013-05-09 10:48:56