bash脚本循环多个变量

时间:2013-09-12 19:50:11

标签: bash variables for-loop

我正在尝试写下面的内容

for i in {a..z} && j in {1..26}
do
echo "/dev/sd"$i"1               /disk$j                                 ext4     noatime        1 1" >> test
done

当然这不是正确的语法。有人可以用正确的语法帮助我吗?

2 个答案:

答案 0 :(得分:4)

为了通用,您可以使用' length'如下图所示。

#!/bin/bash

# Define the arrays
array1=("a" "b" "c" "d")
array2=("w" "x" "y" "z")

# get the length of the arrays
length=${#array1[@]}
# do the loop
for ((i=0;i<=$length;i++)); do
        echo -e "${array1[$i]} : ${array2[$i]}"
done

您也可以像以下

一样分配数组
array1=`awk -F" " '$1 == "CLIENT" { print $2 }' clientserver.lst`

答案 1 :(得分:3)

您可以使用数组:

A=({a..z}) B=({1..26})
for (( I = 0; I < 26; ++I )); do
    echo "/dev/sd${A[I]}               /disk${B[I]}                                 ext4     noatime        1 1" >> test
done

示例输出:

/dev/sda               /disk1                                 ext4     noatime        1 1
...
/dev/sdz               /disk26                                 ext4     noatime        1 1

更新

根据建议你可以使用B的值的索引:

A=('' {a..z})
for (( I = 1; I <= 26; ++I )); do
        echo "/dev/sd${A[I]}               /disk${I}                                 ext4     noatime        1 1" >> test
    done

此外,您可以使用printf进行一些格式化以获得更好的输出和更清晰的代码:

A=('' {a..z})
for (( I = 1; I <= 26; ++I )); do
    printf "%s%20s%15s%15s%4s%2s\n" "/dev/sd${A[I]}" "/disk${I}" ext4 noatime 1 1 >> test
done

此外,如果您不打算将数据附加到文件,但只在每组生成的行中写入一次,那么只需按块进行重定向:

A=('' {a..z})
for (( I = 1; I <= 26; ++I )); do
    printf "%s%20s%15s%15s%4s%2s\n" "/dev/sd${A[I]}" "/disk${I}" ext4 noatime 1 1
done > test