내 환경에는 다음 형식을 사용하여 정의된 유연한 수의 변수가 있을 수 있습니다.
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
숫자 순서대로 처리하고 sort
GNU라고 가정하고 sort
출력 grep
을 sort -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