Bash

以空格作為參數傳遞路徑

  • December 23, 2015

我很難將一些包含空格的字元串變數作為參數傳遞給程序。

為了調試和顯示正在傳遞的參數,我創建了一個展示 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"

引用自:https://unix.stackexchange.com/questions/250963