awscli를 포함하는 bash 스크립트가 있습니다. for 루프에서 생성된 변수를 인쇄하려고 합니다. for 루프 때문에 인쇄하려는 변수에 $ 기호가 포함되어 있습니다. 값을 인쇄할 수 없습니다. 아래 스크립트를 공유했습니다. 이 스크립트의 출력은 for 루프에서 생성된 숫자입니다. 명령에서 생성된 값을 인쇄하고 싶습니다.
#!/bin/bash
declare -i counter=11
declare -i counter2=14
for i in {1..2}
do
declare v1$i=$(aws iam get-group --group-name VideoEditors | awk -v counter1=$counter 'NR==counter1' | awk -F\" '{print $4}')
counter=$counter+7
declare v2$i=$(aws iam get-group --group-name VideoEditors | awk -v counter3=$counter2 'NR==counter3' | awk -F\" '{print $4}')
counter2=$counter2+7
echo $v1$i
echo $v2$i
done
답변1
변수를 올바르게 인덱싱할 수 있도록 대신 배열을 사용하십시오.
#!/bin/bash
declare -ai counters=(11 14) # indexes start from 0
v1=()
v2=()
for i in {1..2}; do
v1[$i]=$(aws iam get-group --group-name VideoEditors | awk -v counter1="$counter" 'NR==counter1' | awk -F\" '{print $4}')
counters[0]+=7
v2[$i]=$(aws iam get-group --group-name VideoEditors | awk -v counter3="$counter2" 'NR==counter3' | awk -F\" '{print $4}')
counters[1]+=7
echo "${v1[$i]}"
echo "${v2[$i]}"
done
중복을 줄이기 위해 작업을 다른 루프에 넣을 수 있습니다.vN
for
물론 값을 한 번 표시하는 것 외에 v1
및 를 사용하지 않는 경우 변수 및 를 실행하고 건너뛸 수 있습니다 .v2
aws ... | awk
echo
답변2
귀하의 코드가 무엇을 달성해야 하는지는 모르겠지만, 그 기능은 다음과 같습니다.
첫 번째 반복에서(i가 1일 때) 변수 v11 및 v12를 선언하고 일부 내용을 여기에 할당한 다음 $v1$i를 화면에 인쇄합니다.
v1은 존재하지 않으며 $i는 i의 값이므로 첫 번째 루프에서 "None"을 얻고 출력에 1을 추가해야 합니다.
그런 다음 두 번째 반복에서 - i가 2와 같을 때 - 같은 이유로 2의 두 배입니다.
awk 등호 다음에 수행하는 작업은 결과와 아무 관련이 없습니다.
이 문제를 해결하려면 배열을 사용하고 $i를 배열의 인덱스로 사용하는 것이 좋습니다.
답변3
"
명령 출력의 11, 17, 18, 21행에 네 번째로 구분된 필드를 인쇄하려는 것 같습니다 aws
.
aws iam get-group --group-name VideoEditors |
awk -F '"' 'NR == 11 || NR == 17 || NR == 18 || NR == 21 { print $4 }'
aws
이는 4번 대신 한 번 호출되고 , awk
8번 대신 한 번 호출됩니다.
배열에 넣으려면 다음을 수행하십시오.
readarray -t output < <(
aws iam get-group --group-name VideoEditors |
awk -F '"' 'NR == 11 || NR == 17 || NR == 18 || NR == 21 { print $4 }' )
이제 배열에는 인덱스 0부터 시작하여 output
각 요소에 대해 하나의 데이터 행이 포함됩니다 .awk
해당 배열을 두 부분으로 분할하여 한 배열에 요소 0과 2를, 다른 배열에 요소 1과 3을 가져오려는 경우:
v1=( "${output[0]}" "${output[2]}" )
v2=( "${output[1]}" "${output[3]}" )