2015-12-11 35 views
0

我知道有可能遍歷bash中的少數幾個數組用於循環或任何類似echo(Brace Expansion)的命令。bash腳本 - 在for循環中同時迭代兩個(或多個)範圍

for i in {1..4} {a..d} 
    echo $i 

# or 
echo {1..4} {a..d} 

# output: 1 2 3 4 a b c d 

但是,它可以同時遍歷數組來得到類似結果:

# output: 1 a 2 b 3 c 4 d 

比如我需要使用SSH三個範圍與名稱服務器像server-a1.com,服務器 - b1.com,server-c1.com,並且需要在所有的第一時間執行操作,而不是在所有秒鐘等等。

+0

我將短語'1 A 2 B 3 C'如'僅第一第一,僅次於第二等on'而不是'所有的首創,然後對所有的秒等' – sjsam

回答

2

您可以生成所有

echo {1..4}{a..d} 

組合如果您選擇每個第五,你會得到你想要的東西:

all=({1..4}{a..d}) 
for ((i=0 ; i<${#all[@]} ; i++)) ; do 
    ((!(i % 5))) && echo ${all[i]} 
done 
+1

Innovative&cool;)是否有可能用計算值而不是5來推廣它,以便該腳本適用於{1..5} {a..e}','{1。 .6} {a..f}'等等? – sjsam

+0

@sjsam:如果兩個列表的大小相同,則可以使用大小+ 1或'bc <<<「1 + sqrt($ {#all [@]})」'。 – choroba

+0

謝謝,感謝:) – sjsam

0

這將做你想做的:

a=({1..4}) 
b=({a..d}) 
for ((i=0; i<${#a[@]}; i++)); do 
    echo -n "${a[i]} ${b[i]} " 
done 

範圍擴展放入兩個數組中。第一個數組的索引用於引用這兩個數組。

1
#!/bin/bash 
a=({1..4}) b=({a..d}) i=0    ### Initial values 

for ((i=0; i<4; i++)) ; do     ### Loop over elements 
     printf '%s %s ' "${a[i]}" "${b[i]}" ### Print pairs of values. 
done 
echo 

$ ./script.sh 
1 a 2 b 3 c 4 d