スペースを含む一部の文字列変数をパラメータとしてプログラムに渡すのが困難です。
渡される引数をデバッグして表示するためのデモ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
- GNOME端末3.6.2
ベストアンサー1
存在する:
path_with_spaces="$HOME/blah blah"
arg_list="$path_with_spaces/abc $path_with_spaces/xyz"
python show_args.py $arg_list
スカラー/文字列変数を使用しています。分割+グローバル演算子(変数の引用解除)は、変数の内容を分割して渡す引数を生成しますpython
。
これ分ける~の一部分割+グローバル演算子は特殊引数に格納されている文字を分割します$IFS
。
ここで無効にすることができます全体的な状況パスに見つからない文字を分割して分割します。例えば、新しいチーム次のパスに見つかりません。
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
eval
また、シェル引用符を使用し、シェルがこれらの引用符を解釈できるようにすることもできます(bash
ここでは特定の機能が使用されます)。
printf -v arg_list '%q ' "$path_with_spaces/abc" \
"$path_with_spaces/xyz"
eval "python show_args.py $arg_list"