변수에 조건부로 값을 할당하는 것이 작동하지 않습니다.

변수에 조건부로 값을 할당하는 것이 작동하지 않습니다.

저는 쉘 스크립팅을 처음 접했습니다. 조건부로 변수를 할당하는 간단한 스크립트를 작성했습니다.

#!/bin/sh

my_env=$1

if (my_env=="dev"); then
  MY_TYPE="dev type"
elif (my_env=="stg"); then
  MY_TYPE="stg type"
elif (my_env=="prod"); then
  MY_TYPE="prod type"
fi
echo $MY_TYPE

내가 그것을 실행할 때 :

$shell ./my_script.sh dev

그것은 인쇄됩니다: dev type, 이는 정확합니다.

그 후 다시 실행합니다.

$shell ./my_script.sh stg

또한 출력됩니다 dev type. 왜 인쇄할 수 없나요 stg type? ? 내 조건부 논리에 어떤 문제가 있나요?

답변1

언어 는 언어가 sh아니며 C, 한 언어에서 작동하는 것이 다른 언어에서도 작동할 것이라고 기대할 수 없습니다.

sh첫 번째는 명령줄 해석기입니다. 대부분의 작업은 셸에서 호출된 명령을 통해 수행됩니다.

[예를 들어 조건부 테스트를 평가하기 위해 aka라는 전용 명령이 있습니다 test. // if는 구문 구조이지만 then해당 동작은 및 사이의 명령 목록의 성공 또는 실패에 따라 달라집니다.fishifthen

변수의 내용을 명령에 전달하려면 구문이 필요합니다 $var. 명령 에 echo foo전달된 경우 변수 의 내용을 (중요한 따옴표 에 유의하세요(심지어fooechoecho "$foo"$fooecho[명령의 경우 중요) sh불행한 버그 기능을 해결하기 위해).

sh서브쉘을 실행 하여 그 안의 코드가 (...)별도의 환경(대부분의 sh구현에서는 서브프로세스) 에서 해석되고 my_env=="dev"동일한 1이 변수에 할당되면 성공적으로 수행되므로 서브쉘도 마찬가지입니다. 성공하면 해당 부분이 실행됩니다.my_env="=dev"=dev$my_envthen

올바른 구문은 다음과 같습니다.

#!/bin/sh -

my_env="$1"

if [ "$my_env" = dev ]; then
  MY_TYPE="dev type"
elif [ "$my_env" = stg ]; then
  MY_TYPE="stg type"
elif [ "$my_env" = prod ]; then
  MY_TYPE="prod type"
fi
printf '%s\n' "$MY_TYPE"

여기서는 ( s case와 유사한) 구성을 사용하는 것이 더 좋습니다 .Cswitch

#! /bin/sh -
my_env=${1?Missing type argument}

case $my_env in
  (dev | stg | prod)
    MY_TYPE="$my_env type"
    ;;
  (*)
    printf >&2 '%s\n' "Unsupported type: $my_env"
    exit 1
esac

printf 'MY_TYPE = %s\n' "$MY_TYPE"

$my_env또한 허용된 세트에 없는 경우 실패한 종료 상태로 종료하는 포괄적인 방법을 참조하여 $MY_TYPE아래에서 초기화되지 않은 사용을 피하고 ${1?error}스크립트에 최소한 하나의 인수가 전달되었는지 확인하고 그렇지 않은 경우 사용자에게 오류를 보고하는 빠른 방법으로 .


¹ or my_env='=dev'or my_env==devor my_env='='"d"e\v, 그러나 my_env'==dev'nor 는 아님 $my_dev==dev, 중요한 부분은 첫 번째 것이 =리터럴이고 따옴표가 없고 나머지는 리터럴이고 따옴표가 없으며 유효한 변수 이름이라는 것입니다. 변수 할당 순서로 생각하세요. 라는 명령 my_env'==dev'을 실행하려고 시도 my_env==dev하지만 찾지 못할 수도 있습니다.

관련 정보