2016-10-05 27 views
1

我有兩個條件來驗證參數的腳本開始。其意圖是應該傳遞兩個參數,第一個參數必須是"FOO""BAR"。我有以下的作品,但我想知道如何使這個單一的if語句:結合具有選擇優先級的shell布爾條件

#!/bin/bash 

if [ "$#" -ne 2 ]; then 
     echo "Usage: $0 <FOO or BAR> <Removed for SO>" 
     exit 
fi 
if [ "$1" != "FOO " -a "$1" != "BAR" ]; then 
     echo "Usage: $0 <FOO or BAR> <Removed for SO>" 
     exit 
fi 

只是爲了澄清,我所問的是如何在一般結合「的邏輯和」與「邏輯或」在shell腳本中。在僞代碼,這是我想要的東西:

if (numArgs != 2 || (someArg != "FOO" && someArg != "BAR")) 

回答

1

您可以使用條件|| 2之間:

if [ "$#" -ne 2 ] || [ "$1" != "FOO" -a "$1" != "BAR" ]; then 
     echo "Usage: $0 <FOO or BAR> <Removed for SO>" 
     exit 
fi 
+0

在右邊的條件中'-a'比'||'具有更高的優先級嗎? – asimes

+0

優先是不需要的,因爲'||'之後的所有內容都在'[...]'中,這意味着'[...]'將被單獨評估。 – anubhava

0

你可以使用正則表達式匹配:

if [[ $# != 2 && ! $1 =~ ^(FOO|BAR)$ ]] 
then 
    ... 
fi 

這樣做的好處如果第一個參數應該允許更多的值,則更容易適應。

但是,我會,但是,不是將這兩個條件合併爲一個,但將它們分開併爲它們提供不同的錯誤消息。