2017-02-20 7 views
1

Вывод состояния диска из массива дисков, я получаю «готовый» и «онлайн» как статус для OK. Попытка поймать это с помощью инструкции IF в bash, это будет действовать, если значение что-то еще, чем «готово» и «онлайн».Сравнение нескольких строк с OR и NOT

Фрагмент кода ниже работает для улавливания «ОК», но я хотел бы отменить его, поэтому он ловушки, если $ diskstatus НЕ готов или онлайн.

#!/bin/bash 
diskstatus="online" 
if [[ $diskstatus = online ]] || [[ $diskstatus = ready ]]; then echo "OK: $diskstatus"; fi 

ли в настоящее время пытались почти все со скобками, кавычками и этажерки, но не становится его работать.

ответ

2

Для полноты рассмотрите также заявление case.

case $diskstatus in 
    online | ready) ;; 
    *) echo "Not ok: $diskstatus";; 
esac 

Синтаксис сначала может выглядеть тайным, но вы быстро привыкаете к нему. Я на самом деле предпочитаю его более if для многих вещей, связанных с простым сопоставлением строк. В качестве бонуса он совместим с традиционными sh.

+0

Спасибо, не подумал об этом. Я часто использую случай в синтаксическом анализе ввода команды. – tompaah

1

Используйте regex оператор в bash с [[ оператором, как показано ниже,

[[ ! $diskstatus =~ ^(ready|online)$ ]] && echo "Not OK: $diskstatus" 

Кроме того, заметим, что двойные кавычки не нужны ни для regex или переменной части, потому что ни софистика ни подстановка имен файлов (подстановка) будет осуществляться в этом контексте

другой POSIX способ сделать это, чтобы добавить к tripleee's answer будет, как

if [ "$diskstatus" != "ready" ] && [ "$diskstatus" != "online" ]; then echo "Not OK: $diskstatus"; fi 
+1

У меня было это решение в моем сознании, но я сжимал голову, как заставить его работать. Хорошая работа. –

+1

Спасибо за разнообразие регулярных выражений, для удобства чтения он очень изящный. Я выберу это :) – tompaah

0

просто реверсивное равенство и логический оператор, кажется, работают для меня

$ diskstatus=onlin 
$ if [[ $diskstatus != online ]] && [[ $diskstatus != ready ]]; then echo "NOK: $diskstatus"; fi 
NOK: onlin 
+0

Здесь нет никакой причины «экспортировать» переменную. – tripleee

+0

@ tripleee вы правы, я удалил бесполезный, но безвредный экспорт – VirgileD

0

С как необходимости быть ложными, вы должны использовать and заявление.

if [[ $diskstatus != online ]] && [[ $diskstatus != ready ]]; then echo "OK: $diskstatus"; fi 

В противном случае, поскольку хотя бы одно из условий всегда будет истинным, тело вашего оператора if всегда будет работать.

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