Alpine `sh`의 if 블록에서 패턴 일치

Alpine `sh`의 if 블록에서 패턴 일치

다음 bash 표현식을 복사하는 방법:

if [[ "$foo" =~ (bar|spam) ]]; then
  echo "True"
fi

알프스에서 /bin/sh?

그대로 입력하면 오류가 발생합니다.

/bin/sh: syntax error: unexpected "(" (expecting "then")

답변1

foo쉘 변수에 하위 문자열이 포함되어 있는지 bar여부 를 테스트하려면 spam표준 case ... esac명령문을 사용하여 이를 수행할 수 있습니다.

case $foo in
    *bar*|*spam*) echo True
esac

'만능' 케이스를 원할 경우 끝에 패턴이 있는 별도의 케이스를 사용하세요 *.

case $foo in
    *bar*|*spam*) echo True ;;
    *) echo False
esac

사용된 패턴은 case ... esac정규식이 아닌 쉘 와일드카드 패턴입니다. 따라서 패턴은 전체 문자열과 일치해야 하므로 *각 하위 문자열 주위를 사용하여 양쪽에 추가 문자를 허용합니다. 문의 각 사례에는 구분된 패턴 목록과 목록의 패턴이 일치할 때 실행되는 문의 목록이 case ... esac사용됩니다 . |사례에 대한 설명은 다음으로 종료됩니다 ;;(마지막 사례에서는 생략 가능). 쉘은 일치하는 패턴을 사용하여 첫 번째 경우의 코드를 실행합니다.

위의 두 번째 코드 블록을 다음과 같이 작성할 수도 있습니다.

case $foo in (*bar*|*spam*) echo True ;; (*) echo False; esac

패턴의 여는 괄호는 항상 선택 사항입니다.

답변2

Discord의 누군가가 이 문제를 해결하는 데 도움을 주었습니다.

다음 명령문을 사용하여 질문의 일부를 재현할 수 있습니다 case.

case "$foo" in
(bar|spam) echo "True";;
esac

답변3

당신은 그것을 사용할 수 있습니다 :

#!/bin/sh
if [ "$foo" = bar ] || [ "$foo" = spam ]; then
  echo "True"
fi

관련 정보