具有多个变量的“for i in”循环

具有多个变量的“for i in”循环

我有两个变量

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

如果这些变量可能包含空值:

var1=('' 2 3)
var2=('Bob XIV' Tom '')
for i j in "${(@)var1:^var2}"; do
  printf '%q, %q\n' "$i" "$j"
done

(或者"${var1[@]:^var2}",重点是获得与"$@"Bourne shell 或"${array[@]}"Korn shell 的参数扩展类似的行为,其中元素被单独逐字传递,就好像引用包括空元素一样)

${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

在bash中

$ 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

这假设两个原始变量具有相同数量的元素。

如果您的变量有不同的拆分单词的方式(例如逗号),那么您将必须使用不同的方法将字符串拆分为数组。

相关内容