programA
그래서 나는 다음과 같은 출력을 제공하는 프로그램(가령 )을 가지고 있습니다 : yes
, no
, maybe
, probably
, possibly
, impossible
, banana
.
나는 그 출력을 기반으로 무엇인가를 수행하는 스크립트를 만들고 싶습니다. yes
, maybe
및 만 고려하면 된다고 가정해 보겠습니다 banana
.
지금까지 내가 해야 할 일은 case
다음과 같이 사용하는 것 뿐이다.
case $program_output in
yes) echo "good word: $program_output" ;;
maybe) echo "good word: $program_output" ;;
banana) echo "good word: $program_output" ;;
*) echo "bad word: $program_output" ;;
esac
하지만 최근에 이 문장을 가지고 놀다가 if
다음과 같이 하면 훨씬 더 빠르게 할 수 있다는 것을 알았습니다.
if [[ "yesmaybebanana" =~ ${program_output} ]]; then
echo "good word: ${program_output}"; else echo "bad word: ${program_output}";
fi
제가 그 말을 사용하면 안되는 이유가 있나요 if
? 이 경우 $program_output
공백이 포함될 수 없으며 출력할 수 있는 단어 목록이 제한됩니다.
답변1
bash
정규식 함수를 사용하려는 경우 (하지만 bash
특정 함수이므로 이식 가능하지 않음) 최소한 올바른 "OR" 유형 연산자를 사용하여 AND를 강제 실행해야 합니다.하나다음과 같은 단어가 허용됩니다.
if [[ $program_output =~ ^(yes|maybe|banana)$ ]]
then
echo "Good word: $program_output"
else
echo "Bad word: $program_output"
fi
정규식 주위에는 따옴표가 있을 수 없으며 하위 문자열이 일치를 트리거할 수 없도록 하기 위해 ^
및 앵커 사이에 단어 대체 단어가 포함됩니다(예: 그렇지 않으면 패턴에 의해 캡처됨 ).$
yessir
yes
답변2
해당 버전은 etc 와 일치하는 - 의 모든 하위 문자열을 캡처하므로 여기만큼 신뢰할 if
수 없습니다 .
case
yesmaybebanana
b
bebana
#!/usr/bin/env bash
program_output='bebana'
if [[ "yesmaybebanana" =~ ${program_output} ]]; then echo "good word: ${program_output}"; else echo "bad word: ${program_output}"; fi
산출:
good word: bebana
그리고 이식성이 없습니다. 대시로 실행해 보세요.
$ dash ./a.sh
./a.sh: 6: ./a.sh: [[: not found
bad word: bebana
case
한 줄에 여러 단어를 사용하면 버전을 크게 단순화 할 수 있습니다 .
case $program_output in
yes | maybe | banana) echo "good word: $program_output" ;;
*) echo "bad word: $program_output" ;;
esac
답변3
배쉬의확장 모드여기에서도 일하고 있습니다:
if [[ $program_output == @(yes|maybe|banana) ]]
then
echo "program output is one of yes, maybe, banana"
fi