2015-11-18 65 views
1

我想知道如何分配變量,如果裏面塊shell腳本..如何分配一個變量中,如果在shell腳本條件

下面是我的代碼..

if [[ -z "$MMBOX_PATH" || -z "$BACKUP_PATH" || -z "$REMOTE_SERVER" || -z "$LOG_PATH" ]] 
then 
    echo -e "Must Provide All Required Paths [$FLAG is Empty].." 
    exit 1 
fi 

的上面的代碼會運行,只要它發現空變量,但我也想知道哪個變量是空的(例如,在上面的代碼假設如果LOG_PATH變量是空的,那麼它應該顯示在回波輸出中而不是$ FLAG)

I嘗試以下代碼..

if [[ `FLAG='MMBOX_PATH'` && -z "$MMBOX_PATH" || `FLAG='BACKUP_PATH'` && -z "$BACKUP_PATH" || `FLAG='REMOTE_SERVER'` && -z "$REMOTE_SERVER" || `FLAG='LOG_PATH'` && -z "$LOG_PATH" ]] 
then 
    echo -e "Must Provide All Required Paths [$FLAG is Empty].." 
    exit 1 
fi 

但上面的代碼返回false,因此它不會打印回顯中的內容。

我也試圖保持標誌變量的條件執行過,但每次都在輸出返回「無」

if FLAG='MMBOX_PATH' && [[ -z "$MMBOX_PATH" ]] 
then 
    echo -e "Must Provide All Required Paths [$FLAG is Empty].." 
    exit 1 
fi 

在上述情況下,我得到FLAG =「MMBOX_PATH」但如果我再添加一個條件到如果不打印(也就是說,如果我檢查同樣的事情BACKUP_PATH,remote_server的..)

if FLAG='MMBOX_PATH' && [[ -z "$MMBOX_PATH" ]] && FLAG='LOG_PATH' && [[ -z "$LOG_PATH" ]] 
then 
    echo -e "Must Provide All Required Paths [$FLAG is Empty].." 
    exit 1 
fi 

在這種情況下沒有被打印即使MMBOX_PATH現在和LOG_PATH空。

注意:使用if條件每個變量都可以知道哪個變量是空的,但我不想用if-else條件擴展我的行我只是想知道,如果塊本身如何分配變量並打印一次條件爲真。

任何人都可以幫助我如何獲得空變量..? (/ bin/bash)

+1

使用case語句代替 – 123

+0

但這也會使代碼冗長。我必須爲每個變量編寫代碼 'case「$ MMBOX_PATH」in 「」)echo「MMBOX EMPTY」;; esac' 我只是想在塊內部使用,因爲我們已經在測試一個變量是否爲空或者在那段時間內沒有測試過,只是我想分配一些其他變量供以後使用。 –

回答

3

如果你所做的只是檢查存在與否,如果你可以使用一個函數。

check() { 
for i in "[email protected]";do 
    if [[ -z "${!i}" ]] 
    then 
     echo -e "Must Provide All Required Paths [\$$i is Empty].." 
     exit 1 
    fi 
done 
} 

check MMBOX_PATH BACKUP_PATH REMOTE_SERVER LOG_PATH 
+0

謝謝。它的工作.. –

+0

你使用的是什麼版本的'bash'? ''bash' 4有'-v'運算符,它告訴你該變量是否被設置,而不僅僅是非零長度:'if [[!! -v $ i]];然後' – chepner

+0

@chepner我使用bash 3。2,因爲它是與sles一起的版本。不知道OP。 – 123

1

殼牌已經提供了語法驗證一個變量的值,並退出如果沒有:

: ${MMBOX_PATH:?Must provide MMBOX_PATH} 
: ${BACKUP_PATH:?Must provide BACKUP_PATH} 
: ${REMOTE_SERVER:?Must provide REMOVE_SERVER} 
: ${LOG_PATH:?Must provide LOG_PATH} 

有沒有需要定義一個check函數做同樣的事情。

初始冒號是無所事事的命令; shell會評估其參數,並且:立即退出狀態0。參數擴展用於驗證指定的參數是否有值。如果沒有,則打印給定的錯誤消息。如果外殼不是交互式的,它也會以狀態1退出。

+0

雖然不是非常乾燥。 – 123

+0

這兩個都不是重新實現內置的shell功能。我認爲DRY可能會過度。 – chepner

+0

我贊成它,當它意味着不重寫相同的東西噸。如果你想改變警告信息,你將不得不改變每一個變量。事實上,你只包含了4個參數中的3個,並且顯着縮短了錯誤信息,這可能是對此的證明。此外,該函數並不模仿shell的行爲,if語句裏面有,如果我重寫它,我可能會使用這個語法。 – 123