Bash
以空格作為參數傳遞路徑
我很難將一些包含空格的字元串變數作為參數傳遞給程序。
為了調試和顯示正在傳遞的參數,我創建了一個展示 Python 腳本 -:
##### show_args.py ##### import sys def main(): # Display the arguments passed to the script print "Number of arguments =", len(sys.argv) for arg in sys.argv: print arg if __name__ == '__main__': main()
現在,展示問題的腳本-:
path_with_spaces="$HOME/blah blah" arg_list="$path_with_spaces/abc $path_with_spaces/xyz" python show_args.py $arg_list
輸出 -:
Number of arguments = 5 show_args.py /home/anmol/blah blah/abc /home/anmol/blah blah/xyz
我真正想要的是這個-:
path_with_spaces="$HOME/blah blah" python show_args.py "$path_with_spaces/abc" "$path_with_spaces/xyz"
輸出 -:
Number of arguments = 3 show_args.py /home/anmol/blah blah/abc /home/anmol/blah blah/xyz
為了確認問題僅發生在其中包含空格的路徑中,我創建了以下腳本-:
path_without_spaces="$HOME/blah" arg_list="$path_without_spaces/abc $path_without_spaces/xyz" python show_args.py $arg_list
輸出 -:
Number of arguments = 3 show_args.py /home/anmol/blah/abc /home/anmol/blah/xyz
在尋找這個問題的解決方案時,我遇到了這個答案,根據這個答案,正確的方法是將參數放在數組變數中而不是字元串變數中。
顯示這種新方法的腳本-:
path_with_spaces="$HOME/blah blah" arg_list=("$path_with_spaces/abc" "$path_with_spaces/xyz") python show_args.py "${arg_list[@]}"
輸出 -:
Number of arguments = 3 show_args.py /home/anmol/blah blah/abc /home/anmol/blah blah/xyz
雖然,這個解決方案工作正常,但我仍然想知道是否有一種方法可以使用字元串變數而不是數組變數來完成同樣的事情。
我的系統配置-:
- Ubuntu 14.04 LTS
- 重擊 4.3.11
- 侏儒終端 3.6.2
在:
path_with_spaces="$HOME/blah blah" arg_list="$path_with_spaces/abc $path_with_spaces/xyz" python show_args.py $arg_list
您正在使用標量/字元串變數並使用split+glob運算符(將該變數不加引號)來拆分該變數的內容並生成要傳遞給
python
.split+glob運算符的拆分部分對儲存在特殊參數中的字元進行拆分。
$IFS
在這裡,您可以禁用glob部分並拆分路徑中未找到的字元。例如,如果在路徑中找不到換行符:
path_with_spaces="$HOME/blah blah" arg_list="$path_with_spaces/abc $path_with_spaces/xyz" IFS=" " set -f # disable glob. python show_args.py $arg_list
您還可以使用 shell 引用並使用
eval
讓 shell 解釋這些引號(這裡使用bash
-specific 功能):printf -v arg_list '%q ' "$path_with_spaces/abc" \ "$path_with_spaces/xyz" eval "python show_args.py $arg_list"