많은 언어에서는 Case 문 내에서 변수 할당을 여러 번 반복하는 대신 Case/Switch 문의 결과를 변수에 할당하는 것이 가능합니다. Bash 쉘에서 유사한 작업을 수행할 수 있습니까?
color_code=$(case "$COLOR" in
(red) 1;;
(yellow) 2;;
(green) 3;;
(blue) 4;;
esac)
(또는 다른 쉘에서?)
답변1
이 variable=$(...)
구성은 모든 명령의 표준 출력을 가져 $(...)
와서 에 할당 합니다 variable
. 따라서 variable
원하는 방식으로 할당하려면 해당 값을 표준 출력으로 보내야 합니다. 이 작업은 다음 명령을 사용하여 쉽게 수행할 수 있습니다 echo
.
color_code=$(case "$COLOR" in
red) echo 1;;
yellow) echo 2;;
green) echo 3;;
blue) echo 4;;
esac)
bash
이는 다른 모든 POSIX 쉘 에서 작동합니다 .
선택적 왼쪽 괄호
POSIX 표준에 따르면 case
명령문의 여는 괄호는 선택 사항이며 다음 사항도 적용됩니다.
color_code=$(case "$COLOR" in
(red) echo 1;;
(yellow) echo 2;;
(green) echo 3;;
(blue) echo 4;;
esac)
Gilles가 의견에서 지적했듯이 모든 쉘이 $(...)
이 두 가지 형식의 조합을 허용하는 것은 아닙니다. 인상적으로 자세한 호환성 표를 참조하십시오."$( )" 명령을 포함된 ")"로 대체.
답변2
color_code=$(…)
명령의 출력을 …
변수에 할당 color_code
하고 마지막 개행 문자를 제거합니다. 따라서 일부 출력을 생성해야 합니다. 작성한 코드는 1
명령으로 실행을 시도합니다.
이 관용구를 사용할 수 있습니다. 지원되는 값이 없으면 color_code
비어 있습니다.$COLOR
color_code=$(case "$COLOR" in
(red) echo 1;;
(yellow) echo 2;;
(green) echo 3;;
(blue) echo 4;;
esac)
그러나 이것은 그다지 관용적이지 않습니다. 쉘 언어는 간단한 명령의 간단한 조합을 지향합니다. 이런 종류의 대규모 명령 대체는 어색합니다. 명령 대체는 직접 방법보다 느린 하위 쉘을 생성합니다.
case "$COLOR" in
red) color_code=1;;
yellow) color_code=2;;
green) color_code=3;;
blue) color_code=4;;
esac
두 방법의 주요 의미상 차이점은 $(…)
하위 쉘이 생성되므로 내부적으로 수행되는 모든 할당, 종료, 리디렉션 등이 외부에는 영향을 미치지 않는다는 것입니다.