2013-05-09 3 views
1

Я знаю, что следующая команда возвращает 0 (истина) или 1 (ложь) в следующих условиях:Bash: если (команда) | (команда)

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

верно, если диск активен, иначе лжи , Я хотел бы программным образом использовать этот результат для отображения другого текста или использования его для мониторинга. Я пробовал с этим, но он не работает (синтаксическая ошибка):

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

ответ

1

Wrap условный оператор внутри субоболочке:

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

-z проверяет пустую строку здесь. Возможно, вам также необходимо заменить active/idle на active.

EDIT: в @abasu предполагает, в этом случае, это лучше, чтобы проверить на обратный код Grep, который будет 0, если выражение было подобрано:

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

Вы найдете все подробности на условный на test man page. Однако ваша оболочка может расширить синтаксис дальше, как это делает bash.

+1

это крайне рискованно. Почему я должен проверять строку, которая может содержать что-то из stderr, или stdout? что, если я использую 'grep -q'? Всегда используйте '$?', Чтобы получить результат последней команды. – abasu

+0

Вы определенно правы. Ред. –

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' действует на статус выхода этой команды, этот ответ будет более очевидным. –

Смежные вопросы