从包含引用空格的shell变量传递参数到Python脚本

时间:2013-01-31 14:46:15

标签: python bash quotes spaces

我通过bash包装器调用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'"]

还有其他想法吗?

3 个答案:

答案 0 :(得分:3)

使用数组,但将每个参数存储为数组中的单独元素:

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

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

请参阅BashFAQ #050

答案 1 :(得分:0)

这是shlex模块的用途。

  

shlex类可以轻松编写简单的词法分析器   类似于Unix shell的语法。这通常很有用   用于编写小语言,(例如,在运行控制文件中)   Python应用程序)或解析引用的字符串。

答案 2 :(得分:-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(又名 - / + o noglob)以禁用文件通配,尽管这不是OP示例中的一个问题,并不是eval的问题。 (另一个更强有力的警告是永远不会减少用户输入,除非你非常小心地确保它不会被炸成令人讨厌的东西。如果你不控制价值被评估,你不能确定会是什么发生。)