Bash脚本循环多个变量

3
我正在尝试编写类似以下的内容。
for i in {a..z} && j in {1..26}
do
echo "/dev/sd"$i"1               /disk$j                                 ext4     noatime        1 1" >> test
done

当然,这不是正确的语法。请问有人能帮我提供正确的语法吗?

不清楚您想要实现什么。ij是否“锁步”移动(即,a1,然后是b2等),以便您有26个选项,还是它们是独立的,给您26x26个选项? - lurker
1
这个问题之前已经被问过了:https://dev59.com/KGgu5IYBdhLWcg3wloG_ - Hai Vu
2个回答

6
为了通用性,您可以像下面展示的那样使用 "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
由于不允许进行一个字符的编辑,请修复 for 循环。你应该使用 < 而不是 <=。除此之外,我认为这个答案是最好的,谢谢你的帮助! - Gallaecio

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

2
你实际上不需要 B,因为 ${B[I]} == I - chepner
2
@chepner 实际上索引从0开始,但我可以根据此进行更新,谢谢。 - konsolebox
1
哦,等等,我的意思是 ${B[I]} == I+1!好发现 :) - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接