回答:
使用できます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
例
$ ./in.sh dog
dollar 1 is either a cat or a dog or a mouse
$ ./in.sh hamster
none of the above
でksh
、bash -O extglob
またはzsh -o kshglob
、あなたはまた、拡張されたグロブパターンを使用することができます。
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
でbash
、ksh93
またはzsh
、あなたはまた、正規表現比較を使用することができます。
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シングルブラケットテスト内では無効です
[
POSIXですが、[[
bashの、kshの(どうやらそれはそこに由来しています、とのzshの拡張機能である。 case
例は、ほとんどすべてのPOSIX、けれどもある
case "$1" in
引用符で囲む必要はありません。そのトークンでは単語の分割やパス名の展開は行われません。
bashには「in」テストはありませんが、正規表現テスト(bourneにはありません)はあります。
if [[ $1 =~ ^(cat|dog|mouse)$ ]]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
通常、変数を使用して記述されます(引用の問題は少なくなります)。
regex='^(cat|dog|mouse)$'
if [[ $1 =~ $regex ]]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
古いBourneシェルの場合、大文字と小文字の一致を使用する必要があります。
case $1 in
cat|dog|mouse) echo "dollar 1 is either a cat or a dog or a mouse";;
esac
case
一致させたいペットの固定セットがある場合、aの使用は問題ありません。しかし、実行時にパターンを構築する必要がある場合case
は機能しません。拡張されたパラメーター内からの代替を解釈しないためです。
これはリテラル文字列のみに一致しますcat|dog|mouse
:
patt='cat|dog|mouse'
case $1 in
$patt) echo "$1 matches the case" ;;
esac
ただし、正規表現が一致する変数を使用できます。変数が引用されていない限り、変数内の正規表現演算子には特別な意味があります。
patt='cat|dog|mouse'
if [[ "$1" =~ ^($patt)$ ]]; then
echo "$1 matches the pattern"
fi
連想配列を使用することもできます。キーが存在するかどうかを確認することは、in
Bashが提供する演算子に最も近いものです。構文は少しいですが:
declare -A arr
arr[cat]=1
arr[dog]=1
arr[mouse]=1
if [ "${arr[$1]+x}" ]; then
echo "$1 is in the array"
fi
テストでステートメントを使用することもできますが、コードは少し複雑に見えます。case
if
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
またはわずかに短く、
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
これは、case
句のパターンマッチングを行うためだけに句を使用していif
ます。不要なtrue / falseテストが導入されます。
単に使用する方が良いです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
これをしないでください:
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
またはこれ:
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
...単にif
完全に合理的なcase
ステートメントの代わりにコードでステートメントを使用できるようにするために、より危険な問題を追加しているだけだからです。
eval
がcase
、その場合には文を、それがさらに発生しやすいエラーになります。
"$1"|"$2"|"$3"
。また、unix.stackexchange.com / a / 234415/85039 しかし、ええ、それは少し毛深いです。