我有两个阵列。
array=(
Vietnam
Germany
Argentina
)
array2=(
Asia
Europe
America
)
我想同时循环这两个数组,即在两个数组的第一个元素上调用一个命令,然后在第二个元素上调用相同的命令,依此类推。伪代码:
for c in $(array[*]}
do
echo -e " $c is in ......"
done
我该怎么做?
答案 0 :(得分:82)
从anishsane的回答和其中的评论我们现在知道你想要什么。这是使用for循环的 bashier 样式中的相同内容。请参阅Looping Constructs section in the reference manual。我也使用printf
代替echo
。
#!/bin/bash
array=( "Vietnam" "Germany" "Argentina" )
array2=( "Asia" "Europe" "America" )
for ((i=0;i<${#array[@]};++i)); 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
根据您的想法,您可能会考虑第二种可能性。但请注意,你不会轻易控制第二种可能性显示字段的顺序(好吧,它是一个关联数组,因此它并不是一个惊喜)。
答案 1 :(得分:26)
如果所有数组都正确排序,只需传递索引。
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
答案 2 :(得分:12)
你需要一个循环数组&amp;数组2
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
或者,您可以使用此选项(不带循环):
paste <(tr ' ' '\n' <<< ${array[*]}) <(tr ' ' '\n' <<< ${array2[*]}) | sed 's/\t/ is in /'
答案 3 :(得分:0)
如果两个变量是两个多行的字符串,如下所示:
listA=$(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"
答案 4 :(得分:0)
专门针对所问的问题(包含3个项目的数组):
for i in $(seq 0 2) ; do echo "${array1[$i]} is in ${array2[$i]}" ; done
答案 5 :(得分:0)
#!/bin/bash
read -p "Enter File name : " file
read -ra USERS <<< $(cut -d: -f1 ${file})
read -ra DIRS <<< $(cut -d: -f6 ${file})
if [ ${#USERS[@]} == ${#DIRS[@]} ]
then
echo "Same size arrays.."
THRO=$(expr ${#USERS[@]} - 1)
for i in `seq 0 ${THRO}`
do
useradd -G sftp_users -d /home/sftp${DIRS[$i]} -s /sbin/nologin ${USERS[$i]}
done
else
echo "need same size arrays.."
fi
对我来说,类似的东西行得通。我试图从另一台服务器的/ etc / passwd文件创建多个用户。不是通用解决方案,但可以达到目的。