有這樣一個py文件,需要傳一個字典作為參數:
import json import sys def parse_params(data): json_data = json.loads(data[1]) print json_data if __name__=='__main__': params = sys.argv print params parse_params(params)
命名為sp.py,運行的時候傳入如下參數:
#python sp.py '{"mode":"1","cdCmd":"cd src/test"}' ['sp.py', '{"mode":"1","cdCmd":"cd src/test"}'] {u'cdCmd': u'cd src/test', u'mode': u'1'}
ok,沒問題。但是想寫shell腳本通過變量的方式傳入參數,這時遇到了問題。
shell腳本如下:
mode="1" cdCmd="cd src/test" python sp.py '{"mode":"'$mode'","cdCmd":"'$cdCmd'"}'
運行結果如下:
#./test.sh ['sp.py', '{"mode":"1","cdCmd":"cd', 'src/test"}'] Traceback (most recent call last): File "sp.py", line 10, in <module> parse_params(params) File "sp.py", line 4, in parse_params json_data = json.loads(data[1]) File "/usr/local/python27/lib/python2.7/json/__init__.py", line 338, in loads return _default_decoder.decode(s) File "/usr/local/python27/lib/python2.7/json/decoder.py", line 366, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/local/python27/lib/python2.7/json/decoder.py", line 382, in raw_decode obj, end = self.scan_once(s, idx) ValueError: Unterminated string starting at: line 1 column 21 (char 20)
發現很奇怪,cdCmd變量被分割成了兩個參數:"cdCmd":"cd', 'src/test"。
上網查閱資料后發現是因為shell會把空格作為分隔符,所以成了兩個變量。這個問題目前找到兩個解決辦法:
1.可以通過修改環境變量IFS來實現,默認IFS是空,改成別的字符即可。
2.加引號也可是實現帶空格參數的傳遞,修改shell腳本如下:
mode="1" cdCmd="cd src/test" python sp.py '{"mode":"'$mode'","cdCmd":"'"$cdCmd"'"}'
運行結果:
# ./test.sh ['sp.py', '{"mode":"1","cdCmd":"cd src/test"}'] {u'cdCmd': u'cd src/test', u'mode': u'1'}