단어 목록과 함께 if 문 사용하기

단어 목록과 함께 if 문 사용하기

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

정규식 주위에는 따옴표가 있을 수 없으며 하위 문자열이 일치를 트리거할 수 없도록 하기 위해 ^및 앵커 사이에 단어 대체 단어가 포함됩니다(예: 그렇지 않으면 패턴에 의해 캡처됨 ).$yessiryes

답변2

해당 버전은 etc 와 일치하는 - 의 모든 하위 문자열을 캡처하므로 여기만큼 신뢰할 if수 없습니다 . caseyesmaybebananabbebana

#!/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

관련 정보