2010-09-18 124 views
2
$ cat fav 
#!/bin/bash 
for i in {1..7} 
do 
    echo http://api.stackoverflow.com/1.0/users/113124/favorites?page=$i&pagesize=100 
done 
$ ./fav 
http://api.stackoverflow.com/1.0/users/113124/favorites?page=1 
http://api.stackoverflow.com/1.0/users/113124/favorites?page=3 
http://api.stackoverflow.com/1.0/users/113124/favorites?page=6 
http://api.stackoverflow.com/1.0/users/113124/favorites?page=5 
http://api.stackoverflow.com/1.0/users/113124/favorites?page=7 
http://api.stackoverflow.com/1.0/users/113124/favorites?page=4 
http://api.stackoverflow.com/1.0/users/113124/favorites?page=2 
$ 
  • 为什么我在最后得不到&pagesize=100
  • 另外,为什么结果不合理?

回答

4

&在后台运行的程序,并且它也是一个指标,就像;,“命令结束”,这就是为什么你的命令被缩短。你可以用\逃避它或把整个事情在双引号:

echo http://api.stackoverflow.com/1.0/users/113124/favorites?page=$i\&pagesize=100 
echo "http://api.stackoverflow.com/1.0/users/113124/favorites?page=$i&pagesize=100" 

有趣的是,pagesize=100也被作为一个单独的命令执行,但实际上是一个有效的变量赋值。所以它不会产生一个错误信息,可能会让你知道发生了什么。

背景意味着所有的回声语句都是并行执行的。这就解释了为什么他们最终以随机顺序执行,因为这七个进程将根据何时从内核获取时间片而以不确定的顺序完成。

+0

我不明白平行部分。即使它们在后台执行,“i = 1”语句在“i = 2”语句之前执行,不是吗? – Lazer 2010-09-18 17:53:12

+1

它们是按*顺序启动的,但是,因为它们是异步运行的,所以不能保证它们以何种顺序执行'echo'commnands或finish。 – 2010-09-18 18:01:53

1

用引号将echo参数:

echo "http://api.stackoverflow.com/1.0/users/113124/favorites?page=$i&pagesize=100" 

&是一个shell元字符运行在回地面的命令。将参数列入"使得&失去其特殊含义。

1

&字母是shell的关键字。它代表背景。在你的http字符串周围使用“”,以使你的skript行为正确。

并阅读你的shell手册中的背景知识,这是关键功能。