Saya mencari operator "dalam" yang bekerja seperti ini:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
Ini jelas pernyataan yang jauh lebih pendek dibandingkan dengan, katakanlah, menggunakan beberapa tes "atau".
bash
shell-script
bourne-shell
mrjayviper
sumber
sumber
=~
tidak valid di dalam tes braket tunggal POSIX[
adalah POSIX, tetapi[[
merupakan fitur bash, ksh (tampaknya ini berasal dari sana, dancase
contoh zsh. Contohnya adalah yang paling POSIX dari semua,case "$1" in
tidak perlu dikutip, tidak ada pemisahan kata atau perluasan pathname dilakukan dalam token itu.Tidak ada tes "in" di bash, tetapi ada tes regex (tidak di bourne):
Dan biasanya ditulis menggunakan variabel (lebih sedikit masalah dengan penawaran):
Untuk shell Bourne yang lebih lama Anda harus menggunakan korek api:
sumber
Menggunakan sebuah
case
baik-baik saja dan baik jika Anda memiliki satu set hewan peliharaan yang ingin Anda lawan. Tapi itu tidak akan berfungsi jika Anda perlu membangun pola dalam runtime, karenacase
tidak menafsirkan pergantian dari dalam parameter yang diperluas.Ini hanya akan cocok dengan string literal
cat|dog|mouse
:Namun, Anda dapat menggunakan variabel dengan kecocokan ekspresi reguler. Selama variabel tidak dikutip, setiap operator regex di dalamnya memiliki makna khusus.
Anda juga bisa menggunakan array asosiatif. Memeriksa apakah ada kunci dalam satu adalah hal terdekat dengan
in
operator yang diberikan Bash. Meskipun sintaksnya agak jelek:(
${arr[$1]+x}
perluasx
jikaarr[$1]
disetel, kosongkan sebaliknya. )sumber
Anda bisa menggunakan
case
pernyataan dalamif
tes, tetapi kode itu akan terlihat sedikit berbulu:atau sedikit lebih pendek,
Ini menggunakan
case
klausa hanya untuk melakukan pencocokan pola untukif
klausa. Ini memperkenalkan tes benar / salah yang tidak perlu.Lebih baik menggunakan
case
:Jangan lakukan ini:
atau ini:
... karena Anda hanya menambahkan cruft yang lebih berbahaya, hanya untuk dapat menggunakan
if
pernyataan dalam kode Anda sebagai pengganticase
pernyataan yang masuk akal .sumber
eval
satucase
pernyataan dalam kasus itu, dan itu akan lebih rentan terhadap kesalahan."$1"|"$2"|"$3"
. Juga unix.stackexchange.com/a/234415/85039 Tapi ya, ini sedikit berbulu.grep
pendekatan.-q
untuk menghindari output ke layar (lebih cepat mengetik dari>/dev/null
).-E
untuk ekspresi reguler yang diperluas(cat|dog|mouse)
perlu aspek ini.^(cat|dog|mouse)$
cocok dengan semua garis yang dimulai (^
) dengan kucing, anjing atau tikus ((cat|dog|mouse)
) diikuti oleh ujung garis ($
)sumber