带函数的循环Bash
如何执行此for循环中的命令带函数的循环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
#!/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扩展:)