从包含引号的shell变量向Python脚本传递参数

从包含引号的shell变量向Python脚本传递参数,python,bash,quotes,spaces,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'"] 而不是预期

我通过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'"]
还有其他想法吗?

这就是本模块的目的

shlex类使编写简单的词法分析器变得容易 类似于unixshell的语法。这通常是有用的 用于编写小型语言(例如,在 Python应用程序)或用于解析带引号的字符串


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

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

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

请参见。

您在变量值中嵌入空格的本能是好的,但是当在命令行解析过程中简单地扩展该值时,它们的特殊含义就会丢失。在解析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(aka-/+o noglob)来禁用文件全局搜索,尽管在OP的示例中这不是一个问题,也不是闻所未闻的eval问题。(另一个更强烈的警告是永远不要评估用户输入,除非你非常小心,以确保它不会爆炸成令人讨厌的东西。如果你不控制被评估的值,你就无法确定会发生什么。)

也许会有帮助(看看评估解决方案)。这正是我最后想到的,谢谢你写下来!请不要使用
eval
,它因引起奇怪的bug而享有当之无愧的声誉。例如,尝试使用
opt=“-c start.txt--self'name*Na'”
来解释结果。我拒绝您在OP上下文中的风险评估,该OP显示脚本控制要评估的值的内容,但同意需要警告。如果您建议使用
set-f来包围eval,可能会更有帮助。。。设置+f
以禁用文件全局搜索。(当然,这就是你所暗示的问题。)