답변:
당신은 사용할 수 있습니다 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
절 을 사용하고 있습니다. 불필요한 참 / 거짓 테스트를 소개합니다.
그냥 사용하는 것이 좋습니다 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 그러나 예, 약간 털이 있습니다.