Case 문 외부의 변수 할당

Case 문 외부의 변수 할당

많은 언어에서는 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

두 방법의 주요 의미상 차이점은 $(…)하위 쉘이 생성되므로 내부적으로 수행되는 모든 할당, 종료, 리디렉션 등이 외부에는 영향을 미치지 않는다는 것입니다.

관련 정보