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.)

Jonik
sumber

Jawaban:

17

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

case "$MYAPP_ENV" in
 PROD) SERVER_LOGIN="[email protected]" ;;
    *) SERVER_LOGIN="[email protected]" ;;
esac

Atau metode ini:

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