Böyle bir şey çalışır bir "in" operatörü arıyorum:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
Açıkçası, birkaç "veya" testi kullanmakla karşılaştırıldığında çok daha kısa bir ifade.
Böyle bir şey çalışır bir "in" operatörü arıyorum:
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
Açıkçası, birkaç "veya" testi kullanmakla karşılaştırıldığında çok daha kısa bir ifade.
Yanıtlar:
Kullanabileceğiniz case
...esac
$ cat in.sh
#!/bin/bash
case "$1" in
"cat"|"dog"|"mouse")
echo "dollar 1 is either a cat or a dog or a mouse"
;;
*)
echo "none of the above"
;;
esac
Ör.
$ ./in.sh dog
dollar 1 is either a cat or a dog or a mouse
$ ./in.sh hamster
none of the above
İle ksh
, bash -O extglob
veya zsh -o kshglob
, ayrıca uzun bir topak deseni kullanabilirsiniz:
if [[ "$1" = @(cat|dog|mouse) ]]; then
echo "dollar 1 is either a cat or a dog or a mouse"
else
echo "none of the above"
fi
İle bash
, ksh93
veya zsh
, ayrıca bir normal ifade karşılaştırma kullanabilirsiniz:
if [[ "$1" =~ ^(cat|dog|mouse)$ ]]; then
echo "dollar 1 is either a cat or a dog or a mouse"
else
echo "none of the above"
fi
=~
POSIX tek braket testi içinde geçerli değildir
[
POSIX olmakla [[
genişletilmiş görünüşe oradan kökenli oluyor Bash özelliği, Ksh (ve zsh olduğunu. case
örnek olsa en önemlisi POSIX olduğu
case "$1" in
değerinin tırnak içine alınmasına gerek yoktur , bu jetonda sözcük bölme veya yol adı genişletmesi yapılmaz.
Bash'da bir "inç" testi yoktur, ancak regex testi vardır (bourne'da değil):
if [[ $1 =~ ^(cat|dog|mouse)$ ]]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
Ve genellikle bir değişken kullanılarak yazılır (alıntı ile daha az sorun):
regex='^(cat|dog|mouse)$'
if [[ $1 =~ $regex ]]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
Eski bir Bourne kabuğu için bir vaka eşleşmesi kullanmanız gerekir:
case $1 in
cat|dog|mouse) echo "dollar 1 is either a cat or a dog or a mouse";;
esac
case
Karşı kullanmak istediğiniz sabit bir evcil hayvan kümeniz varsa a kullanmak iyi ve iyidir. Ancak, deseni case
genişletilmiş parametreler içindeki alternatifi yorumlamadığı için çalışma zamanında desen oluşturmanız gerekirse işe yaramaz .
Bu yalnızca değişmez dizeyle eşleşir cat|dog|mouse
:
patt='cat|dog|mouse'
case $1 in
$patt) echo "$1 matches the case" ;;
esac
Bununla birlikte, normal ifade eşleşmesine sahip bir değişken kullanabilirsiniz. Değişken belirtilmediği sürece, içindeki herhangi bir normal ifade operatörünün özel anlamları vardır.
patt='cat|dog|mouse'
if [[ "$1" =~ ^($patt)$ ]]; then
echo "$1 matches the pattern"
fi
İlişkilendirilebilir diziler de kullanabilirsiniz. Birinde bir anahtar olup olmadığını kontrol etmek in
, Bash'in verdiği operatöre en yakın şeydir . Sözdizimi biraz çirkin olsa da:
declare -A arr
arr[cat]=1
arr[dog]=1
arr[mouse]=1
if [ "${arr[$1]+x}" ]; then
echo "$1 is in the array"
fi
( ${arr[$1]+x}
Genişler x
halinde arr[$1]
ayarlanır, aksi takdirde boşaltın. )
Sen olabilir bir kullanmak case
bir in deyimi if
testi, ancak kod biraz tüylü görünecektir:
if case "$1" in (cat|dog|mouse) true ;; (*) false; esac; then
printf '"%s" is one of cat, dog or mouse\n' "$1"
else
printf '"%s" is unknown\n' "$1"
fi
veya biraz daha kısa,
if ! case "$1" in (cat|dog|mouse) false; esac; then
printf '"%s" is one of cat, dog or mouse\n' "$1"
else
printf '"%s" is unknown\n' "$1"
fi
Bu, case
yalnızca cümle için desen eşleşmesini yapmak için bir if
cümle kullanıyor. Gereksiz bir doğru / yanlış testi sunar.
Sadece kullanmak daha iyidir case
:
case "$1" in
cat|dog|mouse)
printf '"%s" is one of cat, dog or mouse\n' "$1"
;;
*)
printf '"%s" is unknown\n' "$1"
esac
Bunu yapma:
is_one_of () {
eval "case $1 in ($2) return 0; esac"
return 1
}
if is_one_of "$1" 'cat|dog|mouse'; then
printf '"%s" is one of cat, dog or mouse\n' "$1"
else
printf '"%s" is unknown\n' "$1"
fi
veya bu:
is_one_of () (
word=$1
shift
IFS='|'
eval "case $word in ($*) return 0; esac"
return 1
)
if is_one_of "$1" cat dog mouse; then
printf '"%s" is one of cat, dog or mouse\n' "$1"
else
printf '"%s" is unknown\n' "$1"
fi
... çünkü daha if
makul bir case
ifade yerine kodunuzda bir ifade kullanabilmek için sadece daha tehlikeli bir ürün ekliyorsunuz .
eval
arasında case
bu durumda açıklamada, ve hatta daha yatkın hatalar olacaktır.
"$1"|"$2"|"$3"
. Ayrıca unix.stackexchange.com/a/234415/85039 Ama evet, biraz kıllı.
grep
yaklaşmak.
if echo $1 | grep -qE "^(cat|dog|mouse)$"; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
-q
ekrana herhangi bir çıktıdan kaçınmak için >/dev/null
).-E
genişletilmiş düzenli ifadeler için (cat|dog|mouse)
yönler buna ihtiyaç duyar.^(cat|dog|mouse)$
^
kedi, köpek veya fare ( ) ile başlayan ( ) ve (cat|dog|mouse)
ardından çizgi ( $
) ile başlayan tüm satırlarla eşleşir