다음과 같이 작동하는 "in" 연산자를 찾고 있습니다.
if [ "$1" in ("cat","dog","mouse") ]; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
이는 분명히 여러 "or" 테스트를 사용하는 것보다 훨씬 짧은 명령문입니다.
답변1
당신은 그것을 사용할 수 있습니다 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
확장된 glob 패턴을 사용할 수도 있습니다.
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
답변2
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
답변3
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
답변4
grep
방법.
if echo $1 | grep -qE "^(cat|dog|mouse)$"; then
echo "dollar 1 is either a cat or a dog or a mouse"
fi
-q
화면에 출력되는 것을 방지합니다( 를 입력하는 것보다 빠릅니다>/dev/null
).-E
이는 확장 정규식에(cat|dog|mouse)
필요합니다 .^(cat|dog|mouse)$
^
고양이, 개, 쥐( )로 시작(cat|dog|mouse)
하고 그 뒤에 줄의 끝( )$
이 오는 모든 줄 과 일치합니다 .