Apakah ada cara untuk melakukan hal seperti ini
int a = (b == 5) ? c : d;
menggunakan Bash?
bash
syntax
conditional-operator
En_t8
sumber
sumber
bash
memang memiliki sesuatu yang mirip dengan "operator ternary" namun dalambash
hal ini disebut "operator kondisional"expr?expr:expr
(lihatman bash
bagian goto "Evaluasi Aritmatika"). Ingat,bash
"operator kondisional" itu rumit dan memiliki beberapa gotcha.((...))
. Lihat Aritmatika Shell .$(( ))
aritmatika dan evaluasi aritmethic(( ))
. Lihat jugahttps://mywiki.wooledge.org/ArithmeticExpression
.Jawaban:
operator ternary
? :
hanyalah bentuk singkat dariif/else
Atau
sumber
=
operator menguji kesetaraan string, bukan kesetaraan numerik (mis.[[ 05 = 5 ]]
Salah). Jika Anda ingin perbandingan angka, gunakan-eq
saja.if/then/else
cond && op1 || op2
konstruk memiliki bug yang melekat: jikaop1
memiliki status keluar nol untuk alasan apa pun, hasilnya diam-diam akan menjadiop2
.if cond; then op1; else op2; fi
juga satu baris dan tidak memiliki cacat itu.Kode:
sumber
echo "$c"
perintah alias, multi-baris (sepertiecho 1; echo 2
), Anda harus menyertakannya dalam tanda kurung.&&
tidak akan memiliki status exit non-nol. Kalau tidak,a && b || c
akan "tiba-tiba" berjalanc
jikaa
berhasil tetapib
gagal.Jika kondisi hanya memeriksa apakah suatu variabel diset, bahkan ada bentuk yang lebih pendek:
akan menetapkan
a
nilaiVAR
jikaVAR
diatur, jika tidak maka akan menetapkan nilai default20
- ini juga bisa merupakan hasil dari ekspresi.Seperti yang ditulis oleh alex dalam komentar, pendekatan ini secara teknis disebut "Ekspansi Parameter".
sumber
a=${1:-'my-hyphenated-text'}
:-
)${VAR:-yes:-no}
.The
cond && op1 || op2
ekspresi disarankan dalam jawaban yang lain memiliki bug yang melekat: jikaop1
memiliki status nol keluar,op2
diam-diam menjadi hasilnya; kesalahan juga tidak akan tertangkap dalam-e
mode. Jadi, ungkapan itu hanya aman digunakan jikaop1
tidak pernah gagal (mis.:
,true
jika builtin, atau tugas variabel tanpa operasi yang bisa gagal (seperti divisi dan panggilan OS)).Perhatikan
""
kutipannya. Pasangan pertama akan mencegah kesalahan sintaksis jika$b
kosong atau memiliki spasi putih. Yang lain akan mencegah terjemahan semua spasi putih ke dalam ruang tunggal.sumber
[ "x$b" -eq "x" ]
digunakan untuk menguji string kosong secara khusus. Saya suka menggunakan sintaks yang digunakan oleh zsh ('PARAMETER EXPANSION' di halaman manual zshexpn) tapi saya tidak tahu banyak tentang portabilitasnya.sumber
(( ))
memperlakukan semua / semua string sebagai0
a=$(( b==5 ? c : d ))
Ini akan menghindari mengeksekusi bagian setelah || secara tidak sengaja ketika kode antara && dan || gagal
sumber
-e
mode:(set -o errexit; [ 5 == 5 ] && { false; true; echo "success"; } || echo "failure"; echo $?; echo "further on";)
->success 0 further on
:
bulit-in bukantrue
untuk menyimpanexec
-ing program eksternal.&&
..||
dan masih menangkap perintah yang gagal di antara mereka?&&
dan||
menurut definisi berlaku untuk seluruh perintah di depan mereka. Jadi, jika Anda memiliki dua perintah sebelumnya (terlepas dari bagaimana mereka digabungkan), Anda tidak dapat menerapkannya hanya untuk salah satu dari mereka dan bukan yang lain. Anda dapat meniruif
/then
/else
logika dengan variabel flag, tetapi mengapa repot jika adaif
/then
/else
pantas?The membiarkan mendukung perintah sebagian besar operator dasar yang satu akan membutuhkan:
Secara alami, ini hanya berfungsi untuk menetapkan variabel; tidak dapat menjalankan perintah lain.
sumber
Berikut adalah opsi lain di mana Anda hanya perlu menentukan variabel yang Anda tetapkan sekali, dan tidak masalah apakah penugasan Anda adalah string atau angka:
Hanya pemikiran saja. :)
sumber
[ test ]
. Jadi konstruksinya hanya aman untuk digunakan jika Anda "tahu" bahwa perintah tersebut tidak menghasilkan apa pun untuk stdout.VARIABLE="`[ test ] && echo \"VALUE_A\" || echo \"VALUE_B\"`"
.Tampaknya ini berfungsi untuk kasus penggunaan saya:
Contohnya
dan dapat digunakan dalam skrip seperti:
tiga barang
sumber
tern
bagian dari Bash? Mac sepertinya tidak memilikinyachmod 700 tern
dalam folder yang sama. Sekarang Anda akan memilikitern
perintah di terminal AndaKita dapat menggunakan tiga cara berikut dalam Shell Scripting untuk operator ternary:
sumber
Ada juga sintaks yang sangat mirip untuk kondisional ternary di bash:
Sayangnya, ini hanya bekerja dengan angka - sejauh yang saya tahu.
sumber
sumber
Anda dapat menggunakan ini jika Anda ingin sintaks yang sama
sumber
a=$(((b==5) ? : c : d))
-$((...))
diperlukan hanya ketika kami ingin menetapkan hasil aritmatika ke variabel lain.Berikut ini beberapa opsi:
1- Gunakan jika lain dalam satu baris, itu mungkin.
2- Tulis fungsi seperti ini:
gunakan skrip di dalam seperti ini
3- Terinspirasi dalam jawaban kasus, penggunaan satu baris yang lebih fleksibel adalah:
sumber
Inilah solusi umum, itu
Uji dengan perbandingan angka
a = $(if [ "$b" -eq 5 ]; then echo "$c"; else echo "$d"; fi)
Uji dengan perbandingan String
a = $(if [ "$b" = "5" ]; then echo "$c"; else echo "$d"; fi)
sumber
untuk menjawab:
int a = (b == 5) ? c : d;
cukup tulis:
ingat bahwa "ekspresi" sama dengan $ ((ekspresi))
sumber
Ini mirip dengan jawaban baik Vladimir . Jika "ternary" Anda adalah kasus "jika benar, string, jika salah, kosong", maka Anda dapat melakukannya:
sumber
Alternatif berorientasi string, yang menggunakan array:
yang keluaran:
sumber