用于带有两个变量的循环

时间:2014-05-05 12:09:26

标签: bash variables loops for-loop awk

我对Bash中的for循环有疑问 我想运行特定范围的awk命令增加34但我不知道如何在for循环中指定两个变量。 我知道如何为一个变量做这个,但它不适用于两个变量。 这是我的一个变量的代码:

#!/bin/bash
for a in {1..3400..34}
do
printf "awk 'NR>=$a&&NR<=$b { if (/^[0-9]/) sum++} END {print "row\t", sum }' file "
done

但我想指定两个变量($ a,$ b),这样的东西不起作用! :

for a in {1..3400..34} , for b in {35..3400..34}
do
printf "awk 'NR>=$a&&NR<=$b { if (/^[0-9]/) sum++} END {print "row\t", sum }' hydr_dE.txt && "
done

谢谢,

2 个答案:

答案 0 :(得分:5)

使用C风格的循环:

for ((a=1,b=35;a<=3400,b<=3400;a+=34,b+=34)); do
    echo ": $a :: $b :"
done

(与devnull的答案输出相同,但在纯Bash中)。

当然,在这个简单的例子中,它足以做到:

for ((a=1;b=a+34,b<=3400;a+=34)); do
    echo ": $a :: $b :"
done

我确定你能够弄清楚如何根据你想要的东西进行调整。

答案 1 :(得分:0)

(1)如果您需要循环两个变量,您可能希望确保那些包含相同数量的数据。 echo {1..3400..34}会生成一个超过echo {35..3400..34}的值。

(2)假设两个输入的大小相同,你可以使用while循环:

while read a b; do
  echo ": $a :: $b :";
  # do something with a and b here
done < <(paste <(seq 1 34 3400) <(seq 35 34 3434))

(你可以使用不同大小的两个输入的循环,但这可能是你不想要的。在上面的例子中,变量a会消耗更长的输入。)

<(command)表单称为进程替换。