저는 쉘 스크립팅을 처음 접했습니다. 조건부로 변수를 할당하는 간단한 스크립트를 작성했습니다.
#!/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
해당 동작은 및 사이의 명령 목록의 성공 또는 실패에 따라 달라집니다.fi
sh
if
then
변수의 내용을 명령에 전달하려면 구문이 필요합니다 $var
. 명령 에 echo foo
전달된 경우 변수 의 내용을 (중요한 따옴표 에 유의하세요(심지어foo
echo
echo "$foo"
$foo
echo
[
명령의 경우 중요) sh
불행한 버그 기능을 해결하기 위해).
sh
서브쉘을 실행 하여 그 안의 코드가 (...)
별도의 환경(대부분의 sh
구현에서는 서브프로세스) 에서 해석되고 my_env=="dev"
동일한 1이 변수에 할당되면 성공적으로 수행되므로 서브쉘도 마찬가지입니다. 성공하면 해당 부분이 실행됩니다.my_env="=dev"
=dev
$my_env
then
올바른 구문은 다음과 같습니다.
#!/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
와 유사한) 구성을 사용하는 것이 더 좋습니다 .C
switch
#! /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==dev
or my_env='='"d"e\v
, 그러나 my_env'==dev'
nor 는 아님 $my_dev==dev
, 중요한 부분은 첫 번째 것이 =
리터럴이고 따옴표가 없고 나머지는 리터럴이고 따옴표가 없으며 유효한 변수 이름이라는 것입니다. 변수 할당 순서로 생각하세요. 라는 명령 my_env'==dev'
을 실행하려고 시도 my_env==dev
하지만 찾지 못할 수도 있습니다.