Bash: while 루프 번호 변수

Bash: while 루프 번호 변수

내 환경에는 다음 형식을 사용하여 정의된 유연한 수의 변수가 있을 수 있습니다.

Var1Value=A
Var2Value=B
Var3Value=C

이제 변수가 존재하는 한 변수를 반복하고 싶습니다. 의사코드에서:

i=1
while [exists "Var"$i"Value"]; do
 echo "found variable, now doing some more complex processing logic"
 #do some more stuff
 i=$((i + 1)) 
done

(배열을 사용하지 않고) bash에서 이 작업을 수행할 수 있나요?

답변1

사용하다이름 참조. 이는 다른 변수에 대한 포인터와 약간 유사하게 작동합니다(Bash 4.3 이상).

Var1Value=A
Var2Value=B
Var3Value=C
Var4Value=""

for (( i=1 ; ; i++ )); do
    n="Var${i}Value"                # the name of var
    declare -n p="$n"               # reference to the var
    [ "${p+x}" ] || break           # see if it exists
    echo "$n: '$p'"
done

"${p+x}"x가리키는 변수가 존재하는지 평가하므로 p설정되었지만 비어 있는 변수도 처리합니다.

또는 ${!n}명명된 변수를 참조하는 간접 변수 확장을 사용합니다 n.

for (( i=1 ; ; i++ )); do
    n="Var${i}Value"                # the name of var
    [ "${!n+x}" ] || break          # see if it exists
    echo "$n: '${!n}'"
done

하지만 실제로는 배열을 사용해야 합니다. 여기서 세 가지 선택 중 어느 것도 표준이 아니지만 배열이 가장 논리적입니다.

VarValue=( A B C )

for value in "${VarValue[@]}"; do
    # use "$value" here
    printf 'Value is "%s"\n' "$value"
done

또한보십시오:

답변2

이것은 작동하는 것 같습니다:

for ((i=1;i<=3;i++)); do
    eval echo "$"$(eval echo Var${i}Value)
done

무섭다는 농담도 있는데 eval...

답변3

변수가 설정되었는지 확인하려면 다음을 참조하세요."if" 문에 변수가 있는지 확인하는 방법은 무엇입니까?( [ -v "Var${i}Value" ]( ksh/ zsh/ bash) 또는 eval "[ -n \"\${Var${i}Value+set}\" ]"(POSIX)).

이제 이름이 패턴과 일치하는 변수를 반복하려면 zsh다음을 수행할 수 있습니다.

for varname in ${(Mk)parameters:#Var<->Value}; do
  something with "$varname" and its value: "${(P)varname}"
done

번호순으로 처리하려면 n매개변수 확장 플래그를 추가합니다( Mk로 변경 Mkn).

그리고 bash:

readarray -t list < <(compgen -v | grep -xE 'Var[[:digit:]]+Value')
for varname in "${list[@]}"; do
  something with "$varname" and its value: "${!varname}"
done

또는 readarray배열을 사용하지 않으려면 Split+glob으로 바꾸십시오.

IFS=$'\n' # split on newline
for varname in $(compgen -v | grep -xE 'Var[[:digit:]]+Value'); do
  something with "$varname" and its value: "${!varname}"
done

숫자 순서대로 처리하고 sortGNU라고 가정하고 sort출력 grepsort -V.

답변4

변수가 알려진 경우 For 루프를 사용할 수 있습니다.

예:

#!/bin/bash

for i in var1 var2 var3
        do
           echo " This is $i"
           #More commands.
        done

산출

 This is var1
 This is var2
 This is var3

관련 정보