2013-10-14 70 views

回答

2

取決於你希望它可能足以爲A提供一個默認值什麼,B

arr=("${A:-one}" "${B:-two}") 
3

在擴大,可能是未設置一個shell變量,您有以下選項:您可以替換默認爲未設定的價值;您可以將變量設置爲默認值,然後替換它;或者你可以提出一個錯誤。

下面是bash的手冊的細節:

${parameter:-word}
使用默認值。如果參數未設置或爲空,則將替換單詞的擴展名 。否則,參數值將被替換爲 。

${parameter:=word}
分配默認值。如果參數未設置或爲空,則字的擴展將被分配給參數。然後代入參數 的值。以這種方式可能不會分配位置參數和特殊參數 。

${parameter:?word}
如果爲空或未設置,則顯示錯誤。如果參數爲空或未設置,則 單詞的擴展(如果單詞爲 ,則該單詞爲 不存在)的擴展會寫入標準錯誤,並且shell將不會退出。否則,將替換參數 的值。

所以如果你想提出一個錯誤,最簡單的用法如下。您可以在問號後添加自定義消息:

% echo ${UNSET?} 
-bash: UNSET: parameter null or not set 
0
unset A B 
arr=("$A" "$B") 
set | grep ^arr= 

arr=([0]="" [1]="") 

好了,你可以通過使用一個循環檢查的所有值:

for ((_i=0;_i<${#arr[@]};_i++));do 
    [ -n "${arr[_i]}" ] || { 
     printf -v _v %03o $((65+_i)) 
     printf "empty $%b\n" \\$_v 
    } 
    done 
empty $A 
empty $B 

A="aa bb" 
arr=("$A" "$B") 
set | grep ^arr= 
arr=([0]="aa bb" [1]="") 
for ((_i=0;_i<${#arr[@]};_i++));do 
    [ -n "${arr[_i]}" ] || { 
     printf -v _v %03o $((65+_i)) 
     printf "empty $%b\n" \\$_v 
    } 
    done 
empty $B 
0

有產生錯誤外殼選項在任何使用未設置的變量,但它可能對您的使用情況太普遍。

$ set -u 
$ A=6 
$ arr=($A $B) 
bash: B: unbound variable