混合Bash-Python代码段中变量的双引号与单引号

混合Bash-Python代码段中变量的双引号与单引号,python,json,bash,quotes,double-quotes,Python,Json,Bash,Quotes,Double Quotes,我完全无法将Python与Bash混合,这对我来说真的很难。 在Bash中使用双引号与单引号取决于您使用变量、转义符和特殊字符的意图。 ,在Python中使用双引号和单引号主要是口味问题,这也证实了这一点 但是,如果我想像这样在Bash中使用Python snippet呢?这两种方法都有效 #!/bin/bash arg3="something special" python << END import functions; print functions.do_smth('$ar

我完全无法将Python与Bash混合,这对我来说真的很难。
在Bash中使用双引号与单引号取决于您使用变量、转义符和特殊字符的意图。
,在Python中使用双引号和单引号主要是口味问题,这也证实了这一点

但是,如果我想像这样在Bash中使用Python snippet呢?这两种方法都有效

#!/bin/bash
arg3="something special"
python << END
import functions; 
print functions.do_smth('$arg', '$arg2')    
print len("$arg3");
END
当我使用第一个或第二个变体时,引用是否重要?我是将变量传递给函数还是简单地使用它,这有关系吗

python -c "print 'great program eh'"
python -c "import special; do_smth_special_with('great program eh')"
A我完全不知道所有这些用例之间的差异
特别是当我应该将JSON输出作为变量(它也有该死的引号和转义!)从Bash传递到Python函数时,我会遇到很多问题

这里真的需要彻底的解释

Python或Bash规则是否适用于[未加引号的herdeoc]中的引号

Python规则适用于引号;bash规则适用于
$
符号。因为bash从不查看引号,所以bash使用哪种类型的引号并不重要;不管怎样,
$foo
都会被替换(除非您使用
\$
;bash查看反斜杠)


如果您引用了herdoc分隔符(
避免这样的代码混合。类似SQL注入的情况也可能发生在这里。
herdoc
是它自己的引用机制,
herdoc
中的引号和单引号不是由
bash
解释的。因此在所有情况下,
$arg3
都会被扩展,除非您转义
\$
.python-c“…”
意味着bash将所有内容都视为双引号,甚至在单引号中也将扩展
$
。但是您需要转义
\"
字符串内部或bash将终止它。缺少的另一种情况是#1或~,它将在quotation@Oliver,你能给我指一下关于“blubberdiblub”的文档吗?你的意思是避免使用heredocs?或者你的意思是什么混合?谢谢你指向heredoc的帮助。因此Python规则应用于heredocs,Bash规则应用于
-c
参数,Python只看到展开引号后剩下的字符串。如果我写
Python-c“print'$var'
,Python将收到
$var
字符串,如果
Python-c“print”$var“
那么Python将收到$var值。对吗?所以抑制扩展的唯一方法是转义引号?@suncatcher:在这两个例子中,bash扩展
$var
。在
Python-c“print'$var'
中,
$var
在双引号内;bash引号不嵌套。在
Python-c“print”$var“
$var
是不带引号的,因为EE bash成对匹配引号:首先是“打印”,然后是
$var的不带引号的值(字拆分和全局展开),然后是
“”
是空的。所以在这个例子中,我们实际上有三个引号对?我应该使用什么引号语法来抑制$var的扩展?我经常在将JSON传递到Python时遇到问题。它们的主体中有
'
\
,Bash经常将我的JSON拆分为数千个参数,将内部引号作为分隔符rs.@suncatcher:
python-c'打印“$var”
。如果您想看看bash给python的是什么,请将
python-c
替换为
echo
python -c "print 'great program eh'"
python -c "import special; do_smth_special_with('great program eh')"