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.