我对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
谢谢,
答案 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)
表单称为进程替换。