2010-12-14 68 views
82

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

我想我可以使用此功能來寫${LONG_VARIABLE_NAME:=hello}而不是更長LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello},但現在還打壞試圖執行「你好」這給了沒有找到一個命令。任何方式來避免這種情況?或者我會不得不堅持後者?有人可以舉一個例子,指定默認值實際上有用嗎?

+10

引用文本時,包含指向源的鏈接很有幫助。 – 2015-06-11 15:19:20

回答

137

使用冒號:

: ${A:=hello} 

結腸是空命令,什麼也不做,而忽略它的參數。它被內置到bash中,因此不會創建新的進程。

+58

我忍不住注意到':$ {A:= hello}'和'A = $ {A:-hello}'一樣長。它似乎也是後者不那麼深奧,其意圖更清楚。使用':',基本上是沒有任何操作的,與OP之前做的方式相比,似乎很不方便。 – 2014-02-12 22:51:35

+0

@DanMoulding:我認爲這兩種解決方案都不令人滿意。我不喜歡第二種形式的口吃,所以我稍微喜歡在腳本開始處運行':'行來設置默認值。 (另外,它們對於單個字符變量名稱只有相同的長度)。 – camh 2014-02-13 10:12:41

+2

@camh:同意。我可以看到在哪裏,如果你有很多變量要初始化爲默認值,並且它們有很長的名字,':'方法對於打字和閱讀都是可取的。是的,這似乎是Bash可以使用一點改進的一個領域。 – 2014-02-13 15:02:36

14

默認值參數擴展在構建腳本中通常很有用,如下面的示例。如果用戶只是調用原來的樣子,Perl將不會建在腳本中。用戶必須明確設置WITH_PERL比「沒有」把它建在其他的值。

$ cat defvar.sh 
#!/bin/bash 

WITH_PERL=${WITH_PERL:-no} 

if [[ "$WITH_PERL" != no ]]; then 
    echo "building with perl" 
    # ./configure --enable=perl 
else 
    echo "not building with perl" 
    # ./configure 
fi 

構建沒有 Perl的

$ ./defvar.sh 
not building with perl 

構建的Perl

$ WITH_PERL=yes ./defvar.sh 
building with perl 
+0

感謝您的回答。 – zedoo 2010-12-14 09:41:40

31

請看http://www.tldp.org/LDP/abs/html/parameter-substitution.html舉例

${parameter-default}, ${parameter:-default} 

如果未設置參數,請使用默認值。通話結束後,參數仍未設置。
這兩種形式幾乎相同。額外的:僅在聲明參數時纔有所作爲,但爲空。

unset EGGS 
echo 1 ${EGGS-spam} # 1 spam 
echo 2 ${EGGS:-spam} # 2 spam 

EGGS= 
echo 3 ${EGGS-spam} # 3 
echo 4 ${EGGS:-spam} # 4 spam 

EGGS=cheese 
echo 5 ${EGGS-spam} # 5 cheese 
echo 6 ${EGGS:-spam} # 6 cheese 

${parameter=default}, ${parameter:=default} 

如果未設置參數,將參數值設置爲default。
兩種形式幾乎相同。的:使得僅在參數已被宣佈爲差爲空

# sets variable without needing to reassign 
# colons suppress attempting to run the string 
unset EGGS 
: ${EGGS=spam} 
echo 1 $EGGS  # 1 spam 
unset EGGS 
: ${EGGS:=spam} 
echo 2 $EGGS  # 2 spam 

EGGS= 
: ${EGGS=spam} 
echo 3 $EGGS  # 3  (set, but blank -> leaves alone) 
EGGS= 
: ${EGGS:=spam} 
echo 4 $EGGS  # 4 spam 

EGGS=cheese 
: ${EGGS:=spam} 
echo 5 $EGGS  # 5 cheese 
EGGS=cheese 
: ${EGGS=spam} 
echo 6 $EGGS  # 6 cheese 

${parameter+alt_value}, ${parameter:+alt_value} 

如果參數設置,使用alt_value,否則使用空字符串。通話結束後,參數值不變。
兩種形式幾乎相同。 The:僅在聲明參數時纔有所作用,且爲空

unset EGGS 
echo 1 ${EGGS+spam} # 1 
echo 2 ${EGGS:+spam} # 2 

EGGS= 
echo 3 ${EGGS+spam} # 3 spam 
echo 4 ${EGGS:+spam} # 4 

EGGS=cheese 
echo 5 ${EGGS+spam} # 5 spam 
echo 6 ${EGGS:+spam} # 6 spam 
+2

這不是非常清楚,不幸的是:( – 2017-08-30 22:54:34