我有两个变量
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
这假设两个原始变量具有相同数量的元素。
如果您的变量有不同的拆分单词的方式(例如逗号),那么您将必须使用不同的方法将字符串拆分为数组。