POSIX 셸의 Case 문의 변수가 여러 줄(대시)인지 여부를 캡처하고 싶습니다.
나는 이것을 시도했습니다 :
q='
'
case "$q" in
*$'\n'*) echo nl;;
*) echo NO nl;;
esac
nl
zsh로 반환되지만 대시 NO nl
로는 반환되지 않습니다.
감사해요.
답변1
쉘에는 dash
C 문자열( )이 없습니다 $'...'
. 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에서 테스트했습니다.