2013-01-31 125 views
0

我通過bash包裝器調用python腳本,但我在處理包含引號空格的參數時遇到問題。將參數從包含引號空格的shell變量傳遞給Python腳本

我組裝參數傳遞給python腳本到bash的變量,如

opt="-c start.txt" 
opt+="--self 'name Na'" 

然後調用python腳本的東西,如:

python test_args.py $opt 

當在Python打印sys.argv,我得到

['test-args.py', '-c', 'start.txt', '--self', "'name", "Na'"] 

代替預期的

['test-args.py', '-c', 'start.txt', '--self', 'name Na'] 

我試圖調用腳本的時候使用數組,如

python test_args.py ${opt[@]} 

但後來我得到

['test-args.py', "-c start.txt --self 'name Na'"] 

任何其他的想法?

+1

也許[this](http://stackoverflow.com/questions/9982573/pass-shell-escaped-string-of-arguments-to-a-subcommand-in-bourne-shell)將有助於(看看* eval *解決方案)。 – KBart

回答

3

使用一個陣列,但存儲每個參數作爲在陣列中的單獨的元件:

opt=(-c start.txt) 
opt+=(--self 'name Na') 

python test_args.py "${opt[@]}" 

BashFAQ #050見。

+0

+1 - 作品完美! –

+0

這正是我最後想到的,謝謝你寫出來! – englebip

0

這是shlex模塊的用途。

shlex類可以很容易地編寫簡單的 語法的詞法分析器,類似Unix shell的語法。對於編寫微型語言(例如,在Python應用程序的運行控制文件中)或解析帶引號的字符串,這通常是有用的 。

-1

將空格嵌入到變量值中的本能很好,但是如果在命令行解析過程中簡單擴展該值,那麼它們的特殊含義就會像您看到的那樣丟失。您需要展開變量解析命令行的Python腳本之前:

set -f 
eval python test_args.py $opt 
set +f 

,將擴大到:

python test_args.py -c start.txt --self 'name Na' 

然後將這個用引號恢復其特殊的含義正確分析。

編輯:我已經在eval附近添加了set -f/+ f(aka -/+ o noglob)來禁用文件通配,儘管這在OP的示例中並不是一個問題,這對eval來說並不是沒有聽說過的問題。 (另一個更強有力的警告是永遠不會評估用戶的輸入,除非你非常小心,以確保它不會被吹到一些令人討厭的東西。如果你不控制被評估的值,你不能確定什麼會發生。)

+0

請不要使用'eval',它具有造成奇怪錯誤的良好聲譽。例如,用'opt =「 - c start.txt --self'name * Na'」'試試這個,試着解釋結果。 –

+0

我在OP的背景下拒絕了您的風險評估,它顯示了控制要評估值的內容的腳本,但同意要求提醒。 雖然如果你建議用'set -f ... set + f'來關閉eval來禁用文件通配,可能會更有幫助。 (當然,這是你暗示的問題。) – William

相關問題