Ortam değişkenine dayalı koşullu atama


11

Bir bash betiğinde, değer bir dış, genel ortam değişkenine ( $MYAPP_ENV) bağlı olacak şekilde yerel bir değişken atarım .

if [ "$MYAPP_ENV" == "PROD" ]
then
    SERVER_LOGIN=foobar123@prod.example.com
else
    SERVER_LOGIN=foobar987@test.example.com
fi

Yukarıdaki ödevi yazmanın daha kısa (ama temiz) bir yolu var mı? (Muhtemelen eğer bir tür koşullu operatör / satır içi kullanıyorsanız.)

Yanıtlar:


17

Bunu bashyapmak için bir vaka / geçiş de kullanabilirsiniz :

case "$MYAPP_ENV" in
 PROD) SERVER_LOGIN="foobar123@prod.example.com" ;;
    *) SERVER_LOGIN="foobar987@test.example.com" ;;
esac

Veya bu yöntem:

[ "$MYAPP_ENV" = PROD ] &&
   SERVER_LOGIN=foobar123@prod.example.com ||
   SERVER_LOGIN=foobar987@test.example.com

2
Bir vaka ifadesi, hepsini tek bir satıra sıkıştırmaktan çok daha okunabilirdir (ikinci komut başarısız olursa felaketle sonuçlanabilir, bu durumda, iyidir, ancak bu alışkanlığa girmek pahalı olabilir). Bu gibi vakalarla uğraşırken en iyi yöntem budur.
Chris Down

@Jonik - başkalarının sorununuzu çözdüğünü bilmesi için lütfen gereksinimlerinizi karşılıyorsa cevaplardan birini kabul edin. Teşekkürler.
slm

Vaka ifadesi tam olarak aradığım şey olmasa bile sunulan seçeneklerin en temiz olduğunu tahmin ediyorum. Oh, Bash sözdizimi garip, bunun üstesinden gelemiyor. :)
Jonik

1
@Jonik - bu da benim bulgularımdı. İnan bana alternatifler aradım, uzun programlar yerine çok şey yapan geniş satırları tercih ediyorum ve if / then / else da benim zevklerim için çok ayrıntılı.
slm

9

Deneyin:

[ condition ] && var=value_when_true || var=value_when_false

Ödeviniz sayısalsa bashüçlü işlemi kullanabilirsiniz :

(( assign_condition ? value_when_true : value_when_false ))

1
Birincisi üçlü değildir. true && false || echo "if this was ternary, this wouldn't be executed"
Chris Down

@chris - true, ancak terminoloji tam olarak doğru olmasa bile hala iyi bir pratik cevap.
cas

@CraigSanders Terminoloji önemlidir - ikinci komut başarısız olduğunda komut dosyalarında bu çok sık kullanılır.
Chris Down

@ChrisDown: Cevaba düzenleme yapın, şimdi daha iyi mi?
cuonglm

1
Cuonglm düzenlemesi için aldı 2.5 yıl boyunca Lol!
iruvar

4

&&Ve ||operatörlerini kullanabilirsiniz

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
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.