3개의 다른 변수를 사용하고 다른 변수의 설정에 따라 하나의 변수만 반환하는 bash 스크립트를 만들고 싶습니다. 그러므로 만일
TESTA_HOST=test1.google.com
TESTB_HOST=test2.google.com
TESTC_HOST=test3.google.com
M_INDEX=2
우리는 배열로 끝나는 모든 환경 변수를 검색하고 _HOST
이를 인덱스와 비교하는 데 사용할 수 있습니다.
HOSTS="$(compgen -A variable | grep _HOST)"
export MAIN_URI="${HOSTS[M_INDEX]}"
echo $MAIN_URI
예상되는 출력은 test3.google.com
변수 내용이 아닌 변수 이름만 반환하기 때문에 작동하지 않는다는 것입니다. 내가 여기서 무엇을 놓치고 있는 걸까요?
답변1
이것,
HOSTS="$(compgen -A variable | grep _HOST)"
HOSTS
단일 문자열로 설정
테스트 호스트[새 팀]TESTB_HOST[새 팀]테스트 호스트
인덱싱은 그다지 유용하지 않으며 ${HOSTS[0]}
와 동일하며 비어 있습니다.${HOSTS}
${HOSTS[1]}
대신에 할당하면
HOSTS=( $(compgen -A variable | grep _HOST) )
그런 다음 출력은 compgen
토큰화되고(전역으로 확장됨) HOSTS
결과를 포함하는 배열이 됩니다. 이 배열의 값은 변수의 이름이며 해당 값을 얻으려면 간접 참조가 필요합니다. 이는 이제 "포인팅" 변수의 값으로 확장됩니다 index
.
"${!HOSTS[M_INDEX]}"
배열 할당에서는 기본값이 있고 IFS
변수에 공백이나 와일드카드가 포함될 수 없다고 가정합니다.
변수에 이름이 지정된 경우 HOST_this
( HOST_that
앞에 고정 부분이 있음) 해당 변수를 생성하는 이름 목록을 사용 하고 또는 토큰 화를 "${!HOST_@}"
포함하지 않고 배열에 직접 할당 할 수 있습니다 .compgen
grep