2010-09-18 249 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手冊中的背景知識,這是關鍵功能。