셸의 변수에 있는 변수를 구문 분석합니다.

셸의 변수에 있는 변수를 구문 분석합니다.

bash쉘에서 환경 변수를 사용해야 하며 다음을 수행해야 합니다 .

  • echo $ENVDEV스택에 따라 또는 로 해결됩니다 .STAGEPRD
  • echo $DEV_ACCOUNT숫자로 구문 분석합니다 echo $DEV_ACCOUNT.12345678

echo $ENV_ACCOUNT로 확인되어야 하는 명령에 사용해야 하는데 대신 12345678으로 확인됩니다 .DEV_ACCOUNT12345678

내가 사용하는 명령은 다음과 같습니다.

aws events put-targets --rule {{ stack_name | lower }}-hello-world \
    --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:$ENV_ACCOUNT:function:hello-world"

대신에 $ENV_ACCOUNT해결 되고 있습니다 . 예상되는 출력은 다음과 같습니다.DEV_ACCOUNT12345678

aws events put-targets --rule {{ stack_name | lower }}-hello-world \
    --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:12345678:function:hello-world"

내가 뭘 잘못했나요?

답변1

대문자 변수 이름은 일반적으로 사용하기에 안전하지 않습니다. $ENV예를 들어, 많은 껍질에서 특별합니다. 이러한 셸에서 해당 값은 특정 유형의 셸을 시작하기 전에 가져올 파일의 경로 이름이어야 합니다. 쉘은 POSIX 모드에서 사용됩니다 bash.$ENV

따라서 bash:

declare -A account
account["develop"]=12345678
account["staging"]=9128312
account["production"]=123123

mode=$run_mode

aws events put-targets \
    --rule {{ stack_name | lower }}-hello-world \
    --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:${account[$mode]}:function:hello-wolrd"

account그러면 개발, 준비 및 생산 모드에 대한 데이터를 보유하는 연관 배열이 설정됩니다 . 그런 다음 사용 중인 패턴을 정의하고 배열의 올바른 데이터로 명령을 실행합니다 account. 변수 는 문자열 또는 중 하나 를 포함하는 환경 변수 로 간주 run_mode됩니다 develop.stagingproduction

연관 배열은 bash4.0에서 도입되었습니다.

aws나는 당신이 작성한 명령을 사용했습니다 (줄 바꿈 및 account변수 추가 제외). 비록 그것이 당신이 기대한 대로 작동하지 않을 수도 있지만( 명령으로 실행하려고 {{ stack_name | lower }}-hello-world시도합니다 ). lower모르기 aws때문에 어떻게 보일지는 모르겠지만 참고하면 될 것 같습니다.


주소 지정mosvy 사용자의 의견에 대한 우려: 변수 DEV_ACCOUNT등이 환경 변수인 경우 해당 내용에 따라 올바른 변수를 선택해야 합니다 ENV.

declare -A account
account["DEV"]=$DEV_ACCOUNT
account["STAGE"]=$STAGE_ACCOUNT
account["PRD"]=$PRD_ACCOUNT

mode=$ENV

# the rest as before

답변2

나는 좋은 선생님을 반복합니다설명하다쉘 스크립트에서 모든 변수 이름을 대문자로 사용하지 않는 것과 관련하여. 이는 일반적으로 나쁜 생각이며 변수 이름이 기본 환경 변수와 충돌할 때 문제를 일으킬 수 있습니다. 나는 또한 그가 대답에서 설명한 대로 가장 좋은 방법은 연관 배열을 사용하는 것이라는 데 동의합니다.

어쨌든, 배열을 사용하는 대신 이 (잘못된) 방식을 고집한다면 다음을 수행해야 합니다.

varname="$env"_account
aws events put-targets --rule {{ stack_name | lower }}-hello-world \
    --targets "Id"="1","Arn"="arn:aws:lambda:us-west-2:${!varname}:function:hello-world"

${!var}구문은 이름이 지정된 변수의 값으로 확장됩니다 var. 예를 들어:

$ foo="foovar"
$ bar=foo
$ echo ${!bar}
foovar

하지만 진지하게, 그러지 마세요. 복잡하고, 번거롭고, 읽기 어렵고, 유지 관리가 어렵습니다. 연관 배열은 이러한 모든 문제를 해결해 줍니다.

답변3

내 문제에 대한 해결책을 게시한 모든 사람에게 감사드립니다. 내 문제를 해결하기 위해 bash 배열을 구현했습니다. 그런데 친구가 간단한 해결책을 제안했어요.

printenv `echo $ENV`_ACCOUNT

내 문제를 해결했습니다.

관련 정보