Bash'ta tek bir komutla kabuk değişkenlerine varsayılan değerler atama


685

Değişken ayarlanmadıysa, örneğin bir varsayılan atar bir bash (3.00) kabuk komut dosyası değişkenleri üzerinde bir sürü test var:

if [ -z "${VARIABLE}" ]; then 
    FOO='default'
else 
    FOO=${VARIABLE}
fi

Bir satırda bunu yapmak için bazı sözdizimi olduğunu hatırlıyorum, üçlü bir operatöre benzeyen bir şey, örneğin:

FOO=${ ${VARIABLE} : 'default' }

(bunun işe yaramayacağını biliyorum ama ...)

Ben deli miyim, yoksa böyle bir şey var mı?


1
Kabuk Parametresi Bash kabuk referansının genişleme bölümü iyi bir başlangıç yeridir : tiswww.case.edu/php/chet/bash/bashref.html#Shell-Expansions .
Kemin Zhou

1
Shell Parameter Expansion için Gnu.org belgeleri (ipucu: yapabileceğiniz başka birçok harika şey var!)
JDB hala Monica

Yanıtlar:


1230

Yayınladığınıza çok yakın, aslında:

FOO=${VARIABLE:-default}  # If variable not set or null, use default.

Ya da, hangi atar defaultiçin VARIABLEde:

FOO=${VARIABLE:=default}  # If variable not set or null, set it to default.

64
Bunu belgelerde bulmak isteseydim, bir google ne işe yarar? $ {: -} gibi özel karakterlerle googling yapmak çok kolay değil.
Joshua Olson

20
Solarmist'e yanıt olarak: "bash değişken atama varsayılanı" bu sayfaya gelmeme izin ver ve bash'ın manuel değişkenini 'değişken ass' ile
aradığımda

57
Bunun bash'e özgü olmadığını ve tüm kabuk ailesi ile çalışacağını unutmayın. Genel komut dosyaları için güvenlidir.
Jocelyn delalande

16
@solarmist Anahtar kelime ve yardımcıları hakkında daha fazla bilgi edinmek istiyorsanız, "bash parametresi genişletme" dir.
duleshi


290

Komut satırı bağımsız değişkenleri için:

VARIABLE=${1:-DEFAULTVALUE}    

VARIABLEkomut dosyasına iletilen 1. bağımsız değişkenin değerine veya DEFAULTVALUEböyle bir bağımsız değişken geçirilmemişse değerine atanır .


245

Değişken aynıysa, o zaman

: "${VARIABLE:=DEFAULT_VALUE}"

tanımlı değilse VARIABLE öğesine DEFAULT_VALUE değerini atar. Çift tırnak işaretleri, kelime dağınıklığını ve sözcük bölünmesini önler.

Ayrıca Bash kılavuzundaki Bölüm 3.5.3, Kabuk Parametre Genişletme bölümüne bakın .


27
Bu zor hile benim için belli değildi: $ {..} AMA genişlemesini yemek için no-effect builtin kullanarak VARIABLE set bırakarak. Şimdiye kadar bunu yapıyordum: VARIABLE = "$ {VARIABLE: -DEFAULT_VALUE}" ve VARIABLE'ı iki kez kullanmak için cesur hissediyorum.
dino

BU HER ZAMAN BASH-BUILTIN DEĞİŞKENLERİ İÇİN ÇALIŞMIYOR. Çok çok garip. Şu anda bana bilinenlerHISTTIMEFORMAT
Otheus

birden çok varsayılan değeri nasıl ayarlayabilirim? ": $ {VARIABLE: = DEFAULT_VALUE}: $ {VARIABLE2: = DEFAULT_VALUE2}" denedim ama bu işe yaramıyor gibi görünüyor ...
Hans

8
@Hans: İki nokta üst üste (hiçbir şey yapmayan) komuttur ve bu nedenle yalnızca bir kez gereklidir. Ör.: ${FOO:=DEFAULT1} ${BAR:=DEFAULT2}
Patrik

36

Varsayılan değer gibi bile başka bir değişkenin değerini kullanabilirsiniz

bir dosyaya sahip olmak defvalue.sh

#!/bin/bash
variable1=$1
variable2=${2:-$variable1}

echo $variable1
echo $variable2

./defvalue.sh first-value second-valueçıktıyı çalıştır

first-value
second-value

ve çalıştırma ./defvalue.sh first-valueçıktısı

first-value
first-value

28

bkz burada 3.5.3 (kabuk parametresi genişleme) altında

yani senin durumunda

${VARIABLE:-default}

26

Sorunuza cevap vermek ve tüm değişken ikamelerde

echo "$\{var}"
echo "Substitute the value of var."


echo "$\{var:-word}"
echo "If var is null or unset, word is substituted for var. The value of var does not change."


echo "$\{var:=word}"
echo "If var is null or unset, var is set to the value of word."


echo "$\{var:?message}"
echo "If var is null or unset, message is printed to standard error. This checks that variables are set correctly."


echo "$\{var:+word}"
echo "If var is set, word is substituted for var. The value of var does not change."

18

FWIW, şöyle bir hata mesajı sağlayabilirsiniz:

USERNAME=${1:?"Specify a username"}

Bu, böyle bir mesaj görüntüler ve kod 1 ile çıkar:

./myscript.sh
./myscript.sh: line 2: 1: Specify a username

Her şeye daha eksiksiz bir örnek:

#!/bin/bash
ACTION=${1:?"Specify 'action' as argv[1]"}
DIRNAME=${2:-$PWD}
OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}}

echo "$ACTION"
echo "$DIRNAME"
echo "$OUTPUT_DIR"

Çıktı:

$ ./script.sh foo
foo
/path/to/pwd
/tmp

$ export HOMEDIR=/home/myuser
$ ./script.sh foo
foo
/path/to/pwd
/home/myuser
  • $ACTION ilk bağımsız değişkenin değerini alır ve boşsa çıkar
  • $DIRNAME 2. bağımsız değişkendir ve varsayılan olarak geçerli dizindir
  • $OUTPUT_DIR3. bağımsız değişken veya $HOMEDIR(tanımlanmışsa) başka bir ifadedir /tmp. Bu OS X üzerinde çalışıyor, ancak taşınabilir olduğu konusunda olumlu değilim.

17

Sonra 'if' yapınızı daha tersine ifade etmenin bir yolu var:

FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}

10

İşte bir örnek

#!/bin/bash

default='default_value'
value=${1:-$default}

echo "value: [$value]"

bunu script.sh olarak kaydedin ve çalıştırılabilir yapın. paramsız koş

./script.sh
> value: [default_value]

param ile koş

./script.sh my_value
> value: [my_value]
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.