带函数的循环Bash

带函数的循环Bash,bash,curl,Bash,Curl,如何执行此for循环中的命令 #!/bin/bash for i in {8..12} do printf "curl \"http://myurl?hour=20140131%02s\" -o file%02s.txt\n" "$i" "$i" done 当前版本的脚本打印出以下行: curl "http://myurl?hour=2014013108" -o file08.txt curl "http://myurl?hour=2014013109" -o file09.txt

如何执行此for循环中的命令

#!/bin/bash

for i in {8..12}
do
    printf "curl \"http://myurl?hour=20140131%02s\" -o file%02s.txt\n" "$i" "$i"
done
当前版本的脚本打印出以下行:

curl "http://myurl?hour=2014013108" -o file08.txt
curl "http://myurl?hour=2014013109" -o file09.txt
curl "http://myurl?hour=2014013110" -o file10.txt
curl "http://myurl?hour=2014013111" -o file11.txt
curl "http://myurl?hour=2014013112" -o file12.txt

我想更改脚本,以便在每次curl请求时执行每一行并保存一个文件。

尝试评估生成的命令:

#!/bin/bash

for i in {8..12}
do
    eval curl $(printf "'http://myurl?hour=20140131%.2i' -o file%.2i.txt" "$i" "$i")
done
您还可以使用简化代码:

for i in $(seq -f "%02g" 08 12)
do
    curl "http://myurl?hour=20140131${i}" -o file${i}.txt
done

只需添加另一行而不使用printf

#!/bin/bash

for i in {8..12}
do
   printf "curl \"http://myurl?hour=20140131%02s\" -o file%02s.txt\n" 
   x=$(printf "%02d" "$i")
   curl "http://myurl?hour=20140131$x" -o file$x.txt 
done

无需使用eval,您可以简化:

for i in {8..12}; do
    printf -v n %02d $i
    curl -s "http://myurl/?hour=20140131${n}" -o "file${n}.txt"
done

如果您使用的是
bash
4,则不需要
printf

for i in {08..12}
do
    curl "http://myurl?hour=20140131$i" -o "file$i.txt"
done

只需删除
printf
和双引号。不确定我是否理解,哪个双引号?都是吗?如果我删除了除转义值以外的所有值,它将不起作用。
printf
的要点是强制
I
@chepner的个位数的前导零。好的,我做了更改,%02d添加了零,而不是我强烈建议的“%02s”。虽然它可以工作,但有一些更安全的替代方案不涉及
eval
。内置的printf允许您:
printf-v n%02d$i
。这更快,因为它不必生成子shell,但可读性较差。谢谢@glennjackman:我经常忘记
printf
@chepnerL中的
-v var
选项,它在
GNU bash,3.2.48(1)版上为我工作过,再次发布
,忘记哪个版本的
bash
添加了各种非POSIX扩展:)