我有 2 个数组要同时在 bash 脚本中处理。第一个数组包含某种标签。第二个数组包含值,如下所示
LABELS=(label1 label2 label3 labe4 )
VALUES=(91 18 7 4)
需要的是:一个循环,它将回显 LABELS 数组 & 中的索引项,并在 VALUES 数组中该项的相应值前面,如下所示
label1 91
label2 18
label3 7
label4 4
我猜嵌套循环不起作用,我在下面尝试过,但它不会按语法工作
for label in {LABELS[@]} && value in {VALUES[@]}
do
echo ${label} ${value}
done
只需使用数字索引并通过索引引用数组元素:
或者,如果您使用的是相对较新的(>= 版本 4)bash 或其他支持关联数组的 shell,只需使用单个数组即可:
我将变量名称更改为小写,因为在 shell 脚本中对局部变量使用大写字母是不好的做法,因为全局环境变量按约定大写,因此在脚本中使用大写字母可能会导致变量名称冲突。
由于您的两个数组具有完全相同的索引(0、1、2 和 3),因此您可以使用
${!array[@]}
迭代其中一个数组的索引(AKA 键)并使用该迭代器访问两个数组中的值。这适用于“索引数组”(即整数索引)和“关联数组”(字符串索引)。
例如
输出:
顺便说一句,您还可以使用这样的循环来填充关联数组,这在您不能同时读取键和值的情况下很有用,就像您的两个手动定义的数组一样:
输出:
从现在开始,您的脚本可以使用关联数组
$LV
直接访问键中的值,例如您还可以使用 C 风格的 for 循环,如 @terdon 和 @NickMatteo 的答案(从 0 循环到数组的长度),但这仅适用于数组索引是数字且连续且数组中没有间隙(未定义索引)的情况.
在许多/大多数情况下,这很好,因为数组通常是用连续的索引号定义的,但在其他情况下,它不会按预期工作 - 例如,如果为 1、3、5、7、11、13、17
$array
定义了索引然后${#array[@]}
将返回 7 并且这样的循环将从 0..6 (如果您使用<=
而不是<
作为测试条件,则为 0..7 )而不是数组中的实际索引列表进行迭代。例如:
只需遍历索引。例如
而不是
echo
,您可以使用printf
更多的格式控制,例如排列最多 6 个字母和最多 3 位数字的标签。
对于那些不必使用
bash
,zsh
使用其${arrayA:^arrayB}
数组压缩运算符的人:虽然你甚至不需要循环:
print
他们在r
olumns上交叉。a
2
C
不过,在这里你也可以这样做:
对于olumns上
print
的这两个数组r
aw (此处省略)。2
C
-a
请注意,您可以使用以下方法从这两个数组中创建一个关联数组(听起来在这里更有意义):
如果标签或值可能包含空字符串,您宁愿使用:
保存它们。
接着:
对于
print
k
eys 和 aluesv
awr
,a
在2
C
olumns 上交叉,或保留空键/值:或者:
或者:
但请注意,关联数组项的展开顺序未指定。
将其中一个数组复制到一组位置参数,然后
$1
在循环中使用以访问其中的第一个。使用shift
,第一个位置参数从列表中移出,之前的第二个元素变成了第一个。这避免了使用索引来获取循环内的数组元素。
输出(制表符分隔):