Tugas bersyarat berdasarkan variabel lingkungan


11

Dalam skrip bash, saya menetapkan variabel lokal sehingga nilainya tergantung pada variabel lingkungan global eksternal ( $MYAPP_ENV).

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

Apakah ada cara yang lebih pendek (belum bersih) untuk menulis tugas di atas? (Agaknya menggunakan semacam operator kondisional / inline jika.)

Jawaban:


17

Anda juga bisa menggunakan case / switch in bashuntuk melakukan ini:

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

Atau metode ini:

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

2
Pernyataan kasus jauh lebih mudah dibaca daripada menjejalkan semuanya ke dalam satu baris (yang dapat berakhir dengan bencana jika perintah kedua bisa gagal, dalam hal ini, itu baik-baik saja, tetapi memasuki kebiasaan itu bisa mahal). Ini adalah metode terbaik ketika menangani kasus-kasus seperti ini.
Chris Down

@Jonik - harap terima salah satu jawaban jika memenuhi kebutuhan Anda sehingga orang lain tahu bahwa masalah Anda telah teratasi. Terima kasih.
slm

Saya kira pernyataan kasus adalah yang terbersih dari opsi yang disajikan, bahkan jika itu bukan apa yang saya cari. Oh well, sintaks Bash canggung, tidak bisa mengelak. :)
Jonik

1
@Jonik - itu adalah temuan saya juga. Percayalah, saya sudah mencari alternatif, saya lebih suka garis lebar yang melakukan banyak daripada program panjang, dan jika / maka / selain itu sangat cocok untuk selera saya juga.
slm

9

Mencoba:

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

Jika tugas Anda berupa angka, Anda dapat menggunakan bashoperasi ternary:

(( assign_condition ? value_when_true : value_when_false ))

1
Yang pertama bukan ternary. true && false || echo "if this was ternary, this wouldn't be executed"
Chris Down

@ Chris - benar, tapi itu masih merupakan jawaban praktis yang baik meskipun terminologinya kurang tepat.
cas

@CraigSanders Terminologi itu penting - saya melihat ini terlalu sering digunakan dalam skrip ketika perintah kedua bisa gagal.
Chris Down

@ChrisDown: Lakukan pengeditan untuk jawabannya, apakah lebih baik sekarang?
cuonglm

1
Lol selama 2,5 tahun untuk mengedit cuonglm!
iruvar

4

Anda dapat menggunakan &&dan ||operator

[ "$MYAPP_ENV" == "PROD" ] && SERVER_LOGIN=foobar123@prod.example.com || SERVER_LOGIN=foobar987@test.example.com
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.