bash
쉘에서 환경 변수를 사용해야 하며 다음을 수행해야 합니다 .
echo $ENV
DEV
스택에 따라 또는 로 해결됩니다 .STAGE
PRD
echo $DEV_ACCOUNT
숫자로 구문 분석합니다echo $DEV_ACCOUNT
.12345678
echo $ENV_ACCOUNT
로 확인되어야 하는 명령에 사용해야 하는데 대신 12345678
으로 확인됩니다 .DEV_ACCOUNT
12345678
내가 사용하는 명령은 다음과 같습니다.
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_ACCOUNT
12345678
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
.staging
production
연관 배열은 bash
4.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
내 문제를 해결했습니다.