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.