두 가지 변수가 있습니다
VAR1="1 2 3"
VAR2="Bob Tom Kate"
다음과 같은 내용을 에코하고 싶지만 루프에서 여러 변수를 사용하는 방법을 모르겠습니다.
1 for Bob
2 for Tom
3 for Kate
내가 할 수 있는 일은:
(
for i in $VAR1; do
echo "$i"
done
)
답변1
zsh에서:
var1=(1 2 3)
var2=(Bob Tom Kate)
for i j in ${var1:^var2}; do
printf '%q, %q\n' $i $j
done
이러한 변수에 null 값이 포함될 수 있는 경우:
var1=('' 2 3)
var2=('Bob XIV' Tom '')
for i j in "${(@)var1:^var2}"; do
printf '%q, %q\n' "$i" "$j"
done
(또는 참조에 빈 요소가 포함된 것처럼 요소가 개별적으로 그대로 전달되는 Bourne 쉘 또는 Korn 쉘의 매개변수 확장과 유사한 동작을 "${var1[@]:^var2}"
얻는 것이 요점입니다 )"$@"
"${array[@]}"
${a:^b}
압축된 배열입니다매개변수 확장 연산자. ${a:^^b}
배열에 동일한 수의 요소가 없는 경우 더 짧은 배열의 요소를 재사용하는 변형도 있습니다.
zsh에서는 가능하면 인덱스로 배열 요소를 역참조하지 않는 것이 가장 좋습니다. 이는 현재 버전에서 매우 비효율적이며, 특히 대규모 배열의 경우 주로 zsh가 배열의 크기를 기록하지 않기 때문에 액세스가 발생하더라도N첫 번째 요소는 C 배열의 인덱스이므로 즉각적이어야 하며, zsh는 여전히 확인해야 합니다.N배열의 끝을 초과하지 않았으며 이전 n - 1개 요소를 계속 확인해야 합니다.
3개 이상의 배열을 반복하려면 다음을 수행해야 합니다.
n=$#var1
for (( i = 1; i <= n; i++ ))
printf '%q, %q, %q\n' "$var1[i]" "$var2[i]" "$var3[i]"
이는 ksh93 또는 bash의 해당 코드보다 훨씬 느립니다.
n=${#var1[@]}
for (( i = 0; i < n; i++ )) {
printf '%q, %q, %q\n' "${var1[i]}" "${var2[i]}" "${var3[i]}"
}
답변2
배쉬에서
$ function assoc() { for i in $VAR1; do echo "$i for $1" ; shift; done ; }
$ assoc $VAR2
1 for Bob
2 for Tom
3 for Kate
답변3
변수를 배열로 변환하여 사용하세요.
#!/bin/bash
VAR1="1 2 3"
VAR2="Bob Tom Kate"
# since you have spaces in the original string, then a simple paranthesis will work
arr1=($VAR1)
arr2=($VAR2)
for (( i=0; i<${#arr1[@]}; i++ ))
do
echo ${arr1[$i]} for ${arr2[$i]}
done
이는 두 원래 변수의 요소 수가 동일하다고 가정합니다.
변수에 단어를 분할하는 방법(예: 쉼표)이 있는 경우 다른 방법을 사용하여 문자열을 배열로 분할해야 합니다.