2010-07-20 50 views
2

我正在嘗試編寫一個bash腳本,它可以讓我使用curl下載多個網頁。對於每個網頁,我希望能夠通過卷頁和引用鏈接。我希望能夠一次提供多個網頁。是否有可能使用bash訪問for循環中的多個數組

換句話說,我希望能夠遍歷我提供腳本的網頁,併爲每個頁面傳遞關聯的網頁和引用鏈接來捲曲。

我以爲我會用一個數組來存儲單個變量中的網頁和引用鏈接,因爲我認爲在運行curl時可以提取數組中的單個元素。

我的問題是,我無法弄清楚如何讓多個數組在for循環中正常工作。這是我想要做的一個想法。此代碼不起作用,因爲「$ i」(在for循環中)不會成爲數組。

#every array has the information for a separate webpage 
array=("webpage" "referer") 
array2=("another webpage" "another referer") 

for i in "${array[@]}" "${array2[@]}" #line up multiple web pages 
do 
    #use curl to download the page, giving the referer ("-e") 
    curl -O -e "${i[1]}" "${i[0]}" 
done 

如果我只用一個陣列的工作,我可以很容易地做到這一點是這樣的:

array=("webpage" "referer") 
REFERER="${array[1]}" 
PAGE="${array[0]}" 
#use curl to download the page, giving the referer ("-e") 
curl -O -e "$REFERER" "$LINK" 

這一次,我有我要處理多個網頁一次,我可以」弄清楚如何正確地做到這一點。

如果有另一種方式來處理多個網頁,而不必使用數組和for循環,請讓我知道。

回答

0

感謝大家的響應。這兩個想法都有好處,但我發現Advanced Bash Guide中的一些代碼完全符合我想要做的。

我不能說我完全理解它,但通過使用對數組的間接引用,我可以在for循環中使用多個數組。我不確定本地命令是做什麼的,但它是關鍵(我認爲它運行一種eval並將字符串分配給變量)。

這樣做的好處是我可以將每個網頁和引用者分組到他們自己的數組中。然後,我可以通過創建一個新數組並將其添加到for循環來輕鬆添加一個新網站。另外,如果我需要向curl命令添加更多變量(例如cookie),我可以輕鬆擴展數組。

function get_page() { 
     OLD_IFS="$IFS" 
     IFS=$'\n'  # If the element has spaces, when using 
         # local to assign variables 

     local ${!1} 


     # Print variable 
     echo First Variable: "\"$a\"" 
     echo Second Variable: "\"$b\"" 
     echo --------------- 
     echo curl -O -e "\"$a\"" "\"$b\"" 
     echo 
     IFS="$OLD_IFS" 
}  

#notice the addition of "a=" and "b=" 
#this is not an associative array, that would be [a]= and [b]= 
array=(a="webpage" b="referer") 
array2=(a="another webpage" b="another referer") 

#This is just a regular string in the for loop, it doesn't mean anything 
#until the indirect referencing later 
for i in "array[*]" "array2[*]" #line up multiple web pages 
do 
     #must use a function so that the local command works 
     #but I'm sure there's a way to do the same thing without using local 
     get_page "$i" 
done 

這導致:

First Variable: "webpage" 
Second Variable: "referer" 
--------------- 
curl -O -e "webpage" "referer" 

First Variable: "another webpage" 
Second Variable: "another referer" 
--------------- 
curl -O -e "another webpage" "another referer" 
5

如果有另一種方式來處理多個網頁,而不必使用數組和for循環,請讓我知道。

使用數組很好,至少比使用空格分隔的列表或類似的黑客好得多。簡單地遍歷索引:

array=('webpage' 'another webpage') 
array2=('referrer' 'another referrer') 
# note the different layout! 
for i in "${!array[@]}" 
do 
    webpage="${array[$i]}" 
    referrer="${array2[$i]}" 
done 
0

你需要一個技巧在這裏。請注意,空格網址中不允許,所以你可以說:

webpages=("url referrer" "url2 ref2" ...) 

for i in "${webpages[@]}" ; do 
    set -- "$i" 
    url="$1" 
    ref="$2" 

    curl -O -e "${url}" "${ref}" 
done 

[編輯]也許有更好的解決辦法,是把所有的URL轉換成一個文件,然後使用此代碼:

while read url ref ; do 
    curl -O -e "${url}" "${ref}" 
done < file 

或者如果你喜歡here documents

while read url ref ; do 
    echo "url=$url ref=$ref" 
done <<EOF 
url1 ref1 
url2 ref2 
... xxx 
EOF 
+0

Bash可以對空格進行分割,而無需在循環內的每次迭代中對外部程序進行兩次調用。 – 2010-07-20 13:08:04

+0

對不起,讓你失望,但'expr'是一個bash內建的。 – 2010-07-20 14:20:57

+0

'哪個expr'返回/ usr/bin/expr – Menachem 2010-07-20 15:30:23

0

就像一個普通的旁白:在函數裏,至少只是聲明IFS變量,其範圍僅限制於該功能。無需保存&通過OLD_IFS恢復IFS!

help declare 

IFS=$' \t\n' 
printf "%q\n" "$IFS" 

function ifs_test() { 
    declare IFS 
    IFS=$'\n' 
    printf "%q\n" "$IFS" 
    return 0 
} 

ifs_test 

printf "%q\n" "$IFS" 
相關問題