2017-02-20 85 views
1

從磁盤陣列中提取磁盤狀態,我將「就緒」和「在線」作爲OK狀態。試圖用bash中的IF語句來捕獲這個錯誤,如果這個值是其他的比「準備就緒」和「在線」就會起作用。Bash與OR的多個字符串比較而不是

下面的代碼片段用於捕獲「OK」,但我想反轉它,所以它會陷阱如果$ 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

使用在bashregex運營商,如下面[[操作,

[[ ! $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

在這裏沒有任何理由'export'這個變量。 – tripleee

+0

@tripleee你是對的,我刪除了無用但無害的出口 – VirgileD

0

工作,因爲需要是假的,你必須使用一個and聲明。

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

否則,由於至少有一個條件總是爲真,所以if語句的主體將始終運行。