POSIX는 Case 문에서 개행을 캡처합니다.

POSIX는 Case 문에서 개행을 캡처합니다.

POSIX 셸의 Case 문의 변수가 여러 줄(대시)인지 여부를 캡처하고 싶습니다.

나는 이것을 시도했습니다 :

q='
'
case "$q" in
    *$'\n'*) echo nl;;
    *) echo NO nl;;
esac

nlzsh로 반환되지만 대시 NO nl로는 반환되지 않습니다.

감사해요.

답변1

쉘에는 dashC 문자열( )이 없습니다 $'...'. C 문자열은 POSIX 표준의 확장입니다. 리터럴 줄바꿈을 사용해야 합니다. 개행 문자를 변수에 저장하면 더 쉽고 보기에도 좋습니다.

#!/bin/dash

nl='
'

for string; do

    case $string in
        *"$nl"*)
            printf '"%s" contains newline\n' "$string"
            ;;
        *)
            printf '"%s" does not contain newline\n' "$string"
    esac

done

스크립트에 제공된 각 명령줄 인수에 대해 개행 문자가 포함되어 있는지 확인합니다. case문( )에 사용된 변수에는 $string따옴표가 필요하지 않으며 ;;마지막 레이블 case뒤에도 필요하지 않습니다 .

테스트( 보조 프롬프트가 나오는 대화형 zsh셸 에서):dquote>

$ dash script.sh "hello world" "hello
dquote> world"
"hello world" does not contain newline
"hello
world" contains newline

답변2

변수에 할당할 때와 마찬가지로 리터럴 줄 바꿈(따옴표)을 패턴으로 포함할 수 있습니다.

q='
'
case "$q" in
    *'
'*) echo nl;;
    *) echo NO nl;;
esac

이로 인해 형식이 보기 흉해집니다(당신은할 수 없다닫는 따옴표를 들여쓰지만 완전히 이식 가능해야 합니다. bash, zsh, ksh 및 dash에서 테스트했습니다.

관련 정보