2010-07-19 89 views
1

我有以下shell腳本:獲取參數

#! /bin/sh 

while read page_section 
    page=${page_section%%\ *} 
    section=${page_section#* }  #NOTE: `%* }` is NOT a comment 

    wget --quiet --no-proxy www.cs.sun.ac.za/hons/$page -O html.tmp & wait 

# echo ${page_section%%\ *} # verify correct string chopping 
# echo ${page_section#* } # verify correct string chopping 

    ./DokuWikiHtml2Latex.py html.tmp $section & wait 
done < inputfile 

和輸入文件是這樣的:

doku.php?id=ndewet:tools:tramonitor TraMonitor 
doku.php?id=ndewet:description Implementation -1 
doku.php?id=ndewet:description Research\ Areas -1 

腳本下載一個在inputfile中分配的網頁數量,然後必須將其餘行(例如「Implementation -1」或「Research \ Areas -1」)傳遞給python腳本。

現在的粘性位。當此示例文件的第三行處理它通過「研究\區」的python腳本作爲兩個單獨的參數,以證實:

>>> print sys.argv 
['./DokuWikiHtml2Latex.py', 'html.tmp', 'Research', 'Areas', '-1'] 

我怎樣才能得到多字節,像「研究領域「從輸入文件到Python腳本的單個參數?我試過逃避'\',也做

./DokuWikiHtml2Latex.py html.tmp `echo ${section#* }` 

除其他事情,但無濟於事。

輸入行末尾的數字是另一個參數,但是是可選的。

回答

1

就讓read做解析的東西:

while read page section rest 
do 
    echo "Page: $page" 
    echo "Section: $section" 
done < inputfile 

對於優雅的處理可選參數,使用數組:

while read -a fields 
do 
    wget --quiet --no-proxy "www.cs.sun.ac.za/hons/${fields[0]}" -O html.tmp 
    unset "fields[0]" 
    ./DokuWikiHtml2Latex.py html.tmp "${fields[@]}" 
done < inputfile 

務必註明您的變量!

+0

你應該把各地的數組元素的報價,你沒有設置到防止文件通配:'未設置「字段[0]」'(如果有文件名爲「fields0」)。演示:'test =(1 2 3); touch test0;未設置測試[0]; declare -p test;未設置「測試[0]」;申報-p測試' – 2010-07-19 17:40:55

+0

@丹尼斯威廉姆森:謝謝。 – Philipp 2010-07-19 18:02:30

+0

不客氣。我忘了證明一個名爲'test0'的變量,如果它存在的話,將會因爲文件的通配符和存在而被取消設置:'test =(1 2 3); TEST0 = 4; touch test0;未設置測試[0];回聲「test0 = $ test0」; declare -p test;未設置「測試[0]」;聲明-p測試「 – 2010-07-19 18:24:53

0

通常多字的參數可以作爲一個傳遞用引號,所以:約$部分

doku.php?id=ndewet:description "Research Areas" -1 
2

把雙引號:

./DokuWikiHtml2Latex.py html.tmp "$section" & wait