Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 与报价处理完全混淆_Python_Bash_Quoting - Fatal编程技术网

Python 与报价处理完全混淆

Python 与报价处理完全混淆,python,bash,quoting,Python,Bash,Quoting,当涉及到反勾号时,我正试图弄清楚如何正确地将参数从shell脚本传递到python 这是我的/foo.sh #!/bin/bash EXEC_SCRIPT="./foo.py -c $1" result=`${EXEC_SCRIPT}` echo ${result} 这是我的/foo.py #!/usr/bin/python import argparse ap = argparse.ArgumentParser() ap.add_argument('-c', required=True

当涉及到反勾号时,我正试图弄清楚如何正确地将参数从shell脚本传递到python

这是我的
/foo.sh

#!/bin/bash
EXEC_SCRIPT="./foo.py -c  $1"
result=`${EXEC_SCRIPT}`
echo ${result}
这是我的
/foo.py

#!/usr/bin/python
import argparse

ap = argparse.ArgumentParser()
ap.add_argument('-c',  required=True)

args,u = ap.parse_known_args()
args = vars(args)

print ("I GOT {}".format(args['c']))
我有:

我得到:

I GOT ABC
太好了

但我会:

./foo.sh "Hello World"
我得到:

I GOT Hello
正在尝试将bash脚本更改为:

EXEC_SCRIPT="./foo.py -c  \"$1\""
产生:

I GOT "Hello
如果我不使用反勾号,这一切都不是问题。转义引号非常有效

我错过了什么

我真正想要的是python脚本应该得到我的参数,不管是1个单词还是2个没有引号的单词


进一步澄清:感谢戈登和AK47提出同样的建议。看起来根本原因是我将命令塞进了一个名为EXEC_SCRIPT的变量中。直接在backticks内部调用命令是有效的。我的真实脚本更为复杂,
EXEC\u script
由于不同的条件指向不同的值。有什么好方法可以实现干净的代码,让我找出正确的命令,然后在最后调用它?正如我所做的那样,使用变量是合乎逻辑的,但它显然不起作用

#!/bin/bash
result=`./foo.py -c "$1"`
echo ${result}
foo.py

#!/usr/bin/python
import argparse
ap = argparse.ArgumentParser()
ap.add_argument('-c',  required=True)
args,u = ap.parse_known_args()
args = vars(args)
print ("I GOT {}".format(args['c']))
测试:

MacBook-Pro:~ ak$ sh foo.sh "Hello World"
I GOT Hello World

我要感谢另一个人和戈登·戴维森对该建议的评论澄清

修改
foo.sh
以执行数组而不是字符串,如下所示:

#!/bin/bash
EXEC_SCRIPT=(./foo.py -c "$1")
result=$("${EXEC_SCRIPT[@]}")
echo ${result}

效果非常好

您应该使用
$()
而不是反勾号,但这不是实际问题。问题是在执行之前,您将命令字符串存储在一个变量(
EXEC\u SCRIPT
)中,有各种各样的方法会导致问题。请参阅和。解决方案:不要将命令放在变量中,直接执行它。由于我较大的脚本的运行方式,变量可以有不同的值,为了保持代码整洁,我在最后执行它,不管值是多少。然后将参数放在数组中,而不是放在string@user1361529这完全取决于你在做什么,数组可能会起作用。但是您需要将每个参数(以及命令本身)存储为数组的单独元素,而不是尝试将命令字符串存储到单个数组元素中。类似于
EXEC_数组=(./foo.py-c“$1”)
result=$(“${EXEC_数组[@]}”)
谢谢。有没有一种方法可以在不直接执行命令的情况下实现这一点?我的实际脚本要长得多,“EXEC_script”可以有多个值,具体取决于不同的条件。为了保持代码干净,我想在最后运行。我将在我的问题中添加澄清。
#!/bin/bash
EXEC_SCRIPT=(./foo.py -c "$1")
result=$("${EXEC_SCRIPT[@]}")
echo ${result}