![bash + 인스턴스 번호를 사용하여 배열 변수를 정의하는 방법](https://linux55.com/image/65254/bash%20%2B%20%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%20%EB%B2%88%ED%98%B8%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%B0%B0%EC%97%B4%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%A0%95%EC%9D%98%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
machine1이라는 변수를 machine$counter(counter=1인 동안)로 정의할 수 있습니까?
예를 들어 다음 파일을 만들고 /tmp/config.txt
machine1을 배열로 설정했습니다.
$ more /tmp/config.txt
machine1=( linux_server critical 1.1.1.1 )
machine2=( linux_server critical 1.1.1.2 )
.
.
그런 다음 다음과 같은 간단한 스크립트를 작성하여 /tmp/config.txt
다음과 같이 기계 배열을 인쇄해 보았습니다.
$ more read.config.bash
#!/bin/bash
source /tmp/config.txt
counter=1
echo ${machine$counter[0]}
echo ${machine$counter[1]}
echo ${machine$counter[2]}
.
.
그러나 스크립트를 실행하면 다음과 같은 결과가 나타납니다.
$ ./read.config.bash
./read.config.bash: line 6: ${machine$counter[0]}: bad substitution
./read.config.bash: line 7: ${machine$counter[1]}: bad substitution
./read.config.bash: line 8: ${machine$counter[2]}: bad substitution
이 문제에 대한 해결책은 무엇입니까?
답변1
eval
명령을 사용하십시오 .
eval "echo \${machine${counter[0]}}"
첫 번째 항목은 이스케이프 처리되므로 $
문자열이 처리되기 전에 평가되지 않습니다.eval
작동 방식은 eval
마치 명령 프롬프트에 명령을 입력하는 것처럼 명령을 실행하는 것입니다. 차이점은 실행되는 명령을 프로그래밍 방식으로 구성할 수 있다는 것입니다.
따라서 귀하의 시나리오 eval
에서 명령을 실행할 때 명령은 다음과 같습니다.실제로실행은 다음과 같습니다. echo ${machineBLAH}
.내부 변수 대체가 쉘에서만 수행되었습니다.앞으로 eval
달리다.
자세한 내용은 다음 문서를 참조하세요.Bash의 "eval" 명령은 무엇입니까?.
답변2
사용을 피할 수 있습니다eval
source /tmp/config.txt
counter=1
line0="machine$counter[0]"
echo ${!line}
echo
루프를 통해 호출하는 것이 더 좋습니다
for counter in 1 2 3
do
line="machine$counter[@]"
for element in "${!line}"
do
echo $element
done
done