bash varsayılan değeri ata


135

$ {parameter: = word} Varsayılan Değerleri Ata. Parametre ayarlanmamış veya boş ise, word'ün genişlemesi parametreye atanır. Daha sonra parametrenin değeri ikame edilir. Konumsal parametreler ve özel parametreler bu şekilde atanamaz.

Uzun ${LONG_VARIABLE_NAME:=hello}yerine yazmak için bu özelliği kullanabileceğimi düşündüm LONG_VARIABLE_NAME=${LONG_VARIABLE_NAME:-hello}ama şimdi bash da 'merhaba' çalıştırmaya çalışıyor ve bu da bulunamadı bir komut veriyor. Bundan kaçınmanın bir yolu var mı? Yoksa ikincisine bağlı kalmam mı gerekecek? Birisi varsayılan atamanın gerçekten yararlı olduğu bir örnek verebilir mi?


13
Metinden alıntı yaparken, kaynağa bir bağlantı eklemek yararlıdır.
Jonathon Reinhart

Yanıtlar:


202

İki nokta üst üste kullanın:

: ${A:=hello}

İki nokta üst üste, hiçbir şey yapmayan ve argümanlarını görmezden gelen boş bir komuttur. Bash içine yerleştirilmiştir, bu nedenle yeni bir süreç yaratılmaz.


94
Yardım edemem ama gözlemlemek o : ${A:=hello}kadar uzun A=${A:-hello}. Görünüşe göre ikincisi biraz daha az ezoterik ve amacı daha açık. :Temelde işlemsiz olan kullanmak , OP'nin daha önce yaptığı gibi kulağa hoş geliyor.
Dan Molding

5
@camh: Kabul edildi. Varsayılanları başlatmak için çok sayıda değişkeniniz varsa ve bunların uzun adları varsa, :yaklaşım hem yazarken hem de okumak için tercih edilirdi. Evet, burası Bash'in biraz iyileştirme yapabileceği bir alan gibi görünüyor.
Dan Molding

17
@DanMoulding: Peki ya : ${VERY_LONG_VARIABLE_NAME:=hello}vs.: VERY_LONG_VARIABLE_NAME=${VERY_LONG_VARIABLE_NAME:-hello}. Umarım kodunuzda açıklayıcı değişken adları kullanırsınız :)
pihentagy

18
Sadece kısa, fakat daha az hata: VERY_LONG_VARIABLE_NAME=${VERY_LOGN_VARIABLE_NAME:-hello}. Hata.
chepner

5
A=$A:-helloYaklaşımın bir avantajı, birlikte çalıştırıldığında kendi kendini belgelemesidir set -x. Yani, atama olduğu gibi yazdırılır, A=hellooysa null komutu yalnızca değeri ( hello) yazdırır .
lmsurprenant

109

Örnekler için lütfen http://www.tldp.org/LDP/abs/html/parameter-substitution.html adresine bakın

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

Parametre ayarlanmadıysa varsayılanı kullanın. Aramadan sonra parametre hala ayarlanmamıştır.
Her iki form da neredeyse eşdeğerdir. Ekstra :, yalnızca parametre bildirildiğinde bir fark yaratır, ancak boş ise.

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}

Parametre ayarlanmadıysa, parametre değerini varsayılana ayarlayın.
Her iki form da neredeyse eşdeğerdir. The: yalnızca parametre bildirildiğinde ve boş olduğunda bir fark yaratır

# 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}

Parametre ayarlanmışsa alt_value kullanın, aksi takdirde boş dizge kullanın. Aramadan sonra parametre değeri değişmez.
Her iki form da neredeyse eşdeğerdir. The: yalnızca parametre bildirildiğinde ve boş olduğunda bir fark yaratır

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

20

Varsayılan değer parametresi genişletmesi genellikle aşağıdaki örnek gibi derleme betikleri için kullanışlıdır. Kullanıcı betiği olduğu gibi çağırırsa, perl yerleşik olmayacaktır. Kullanıcının yerleşik olması için açıkça WITH_PERL"hayır" dışında bir değere ayarlaması gerekir.

$ 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 olmadan inşa edin

$ ./defvar.sh
not building with perl

Perl ile oluşturun

$ WITH_PERL=yes ./defvar.sh
building with perl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.