$ 기호가 포함된 변수 인쇄

$ 기호가 포함된 변수 인쇄

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

중복을 줄이기 위해 작업을 다른 루프에 넣을 수 있습니다.vNfor

물론 값을 한 번 표시하는 것 외에 v1및 를 사용하지 않는 경우 변수 및 를 실행하고 건너뛸 수 있습니다 .v2aws ... | awkecho

답변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번 대신 한 번 호출되고 , awk8번 대신 한 번 호출됩니다.

배열에 넣으려면 다음을 수행하십시오.

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]}" )

관련 정보