3

我正在尝试编写类似以下的内容

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

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

4

2 回答 2

6

为了通用,您可以使用“长度”,如下所示。

#!/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`
于 2014-04-09T07:21:19.183 回答
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
于 2013-09-12T19:53:18.423 回答