![Bash 脚本中使用数组进行循环](https://linux22.com/image/1537995/Bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%E6%95%B0%E7%BB%84%E8%BF%9B%E8%A1%8C%E5%BE%AA%E7%8E%AF.png)
我想使用for
数组循环。我为此使用了以下命令:
#! /bin/bash
rm -f /orch/list
arrayVM=($(cat /orch/servers | grep $1 | awk '{print $1}'))
for i in $arrayVM
do
echo ${arrayVM[$i]}>>list
done
但当我检查list
文件时,只看到数组的第一个元素arrayVM
。我的命令有什么问题?
答案1
主要错误是将for i in $arrayVM
设置i
为中的第一个元素arrayVM
,因为没有索引。我很惊讶这不会在命令中给出错误echo
,除非第一个数组元素是数字。
您需要的是迭代形式for
:-
for (( i=0; i<${#arrayVM[*]}; ++i ))
do
echo ${arrayVM[$i]}>>list
done
然而,这没有必要冗长:更简单的是:-
for e in "${arrayVM[@]}"
do
echo $e>>list
done
这将e
依次分配给每个元素,而不枚举它们。
根据 Fedorqui 的回答,如果arrayVM
其他地方不需要,那么有一种更简单的方法来创建列表文件:-
cat /orch/servers | grep $1 | awk '{print $1}' >/orch/list
cat
或者,由于不必要:-
grep $1 </orch/servers | awk '{print $1}' >/orch/list
答案2
如果你不需要将数据存储在数组中,但你还想将每条记录用于其他用途,则可以使用流程替代:
while IFS= read -r value _;
do
echo "$value" >> list
done < <(grep "$1" /orch/servers)
我们read -r value _
将第一个字段存储在其中$value
,其余字段存储在丢弃变量中$_
。