我有两个数组。
array=(
Vietnam
Germany
Argentina
)
array2=(
Asia
Europe
America
)
我希望同时遍历这两个数组,即对这两个数组的第一个元素执行一条命令,然后对第二个元素执行相同的命令,以此类推。伪代码:
for c in ${array[*]}
do
echo -e " $c is in ......"
done
我该怎么做呢?
我有两个数组。
array=(
Vietnam
Germany
Argentina
)
array2=(
Asia
Europe
America
)
我希望同时遍历这两个数组,即对这两个数组的第一个元素执行一条命令,然后对第二个元素执行相同的命令,以此类推。伪代码:
for c in ${array[*]}
do
echo -e " $c is in ......"
done
我该怎么做呢?
从anishsane的回答和其中的评论中,我们现在知道了你想要什么。这里是同样的内容,使用for循环以更bash方式呈现。请参阅循环结构部分的参考手册。我还使用printf
而不是echo
。
#!/bin/bash
array=( "Vietnam" "Germany" "Argentina" )
array2=( "Asia" "Europe" "America" )
for i in "${!array[@]}"; do
printf "%s is in %s\n" "${array[i]}" "${array2[i]}"
done
另一种可能性是使用关联数组:
#!/bin/bash
declare -A continent
continent[Vietnam]=Asia
continent[Germany]=Europe
continent[Argentina]=America
for c in "${!continent[@]}"; do
printf "%s is in %s\n" "$c" "${continent[$c]}"
done
根据您想要做什么,您也可以考虑这第二种可能性。但是请注意,您在第二种可能性中不会轻易地控制字段的显示顺序(嗯,它是一个关联数组,所以这并不令人意外)。
array=(
Vietnam
Germany
Argentina
)
array2=(
Asia
Europe
America
)
for index in ${!array[*]}; do
echo "${array[$index]} is in ${array2[$index]}"
done
Vietnam is in Asia
Germany is in Europe
Argentina is in America
i=0
while [ $i -lt ${#array[*]} ]; do
echo ${array[$i]} is in ${array2[$i]}
i=$(( $i + 1));
done
Vietnam is in Asia
Germany is in Europe
Argentina is in America
编辑:不要使用以下基于tr
的实现方式。它不适用于包含空格的数组元素。为了保持评论的相关性,不予删除。请参考Glenn Jackman的评论而非下面的回答。
/编辑
另外,你可以使用这个选项(无需循环):
paste <(tr ' ' '\n' <<< ${array[*]}) <(tr ' ' '\n' <<< ${array2[*]}) | sed 's/\t/ is in /'
paste <(printf "%s\n" "${array[@]}") <(printf "%s\n" "${array2[@]}") | sed 's/\t/ is in /'
- glenn jackman针对所提出的问题(包含3个元素的数组):
for i in $(seq 0 2) ; do
echo "${array1[$i]} is in ${array2[$i]}"
done
for i in 0 1 2; do
... - ShreevatsaRfor i in {0..2}; do
- noslistA=$(echo -e "Vietnam\nGermany\nArgentina")
listB=$(echo -e "Asia\nEurope\nAmerica")
while read strA <&3 && read strB <&4; do
echo "$strA is in $strB"
done 3<<<"$listA" 4<<<"$listB"
我在这里添加答案有两个原因。首先,imo错误地标记为重复(Looping over pairs of values in bash)导致了这里。
其次,尽管情况略有不同,但此答案为该主题增加了一些有价值的知识。
在这个问题中,有两个数组需要迭代,在重复项中只是简单地迭代连接的值,因此迭代值对。
这是我发现有用的从值对数组中迭代值对:
PAIRS=("Vietnam Asia" \
"Germany Europe" \
"Argentina America")
for pair in "${PAIRS[@]}"
do
set -- $pair
echo "$1 is in $2"
done
set -- e
,它只是将越南和亚洲作为第一和第二个参数添加到此情况下的第一次迭代中。