【问题标题】:Double vs single quotes for a variable in a mixed Bash-Python snippet混合 Bash-Python 代码段中变量的双引号与单引号
【发布时间】:2017-09-27 17:00:49
【问题描述】:

我完全坚持将 Python 与 Bash 混合使用,这对我来说真的很难。
I know 在 Bash 中使用双引号还是单引号取决于您使用变量、转义符和特殊字符的意图。
I also know,在 Python 中使用双引号还是单引号主要是个人喜好问题,PEP8 也证实了这一点。

但是如果我想像这样使用 Python sn-p inside Bash 怎么办?无论哪种方式都可以。

#!/bin/bash
arg3="something special"
python << END
import functions; 
print functions.do_smth('$arg', '$arg2')    
print len("$arg3");
END

Python 或 Bash 规则是否适用于上述 sn-p 中的引号?

和这样的Python代码分配有区别吗?

python -c "import functions; print functions.do_smth('$arg', '$arg2'); print len("$arg3");"

当我使用第一个或第二个变体时,引用是否重要?我将变量传递给函数还是简单地使用它有关系吗?

python -c "print 'great program eh'"
python -c "import special; do_smth_special_with('great program eh')"

A 完全不知道所有这些用例之间的区别!
尤其是当我应该将 JSON 输出作为变量(也有该死的引号和转义符!)从 Bash 传递到 Python 函数时,我遇到了很多问题。

这里真的需要彻底的解释。

【问题讨论】:

  • 避免混合这样的代码。类似的事情也可能在这里发生,例如 SQL 注入可能发生的事情。
  • heredoc 是它自己的引用机制,heredoc 中的引号和单引号不会被 bash 解释。因此,在所有情况下,$arg3 都会被扩展,除非您转义 \$python -c "..." 表示 bash 将所有内容都视为双引号,并且即使在单引号中也会扩展 $。但是你需要在字符串中转义\",否则 bash 会终止它。
  • 您缺少的另一种情况是 `` 标记,它们位于 #1 或 ~ 的左侧,它将在引号内执行 shell 进程
  • @Oliver,你能给我指点关于``的文档吗?
  • @blubberdiblub,你的意思是避免使用 heredocs?或者你的意思是什么混合?

标签: python json bash quotes double-quotes


【解决方案1】:

Python 或 Bash 规则是否适用于 [an unquoted heredoc] 中的引号?

Python 规则适用于引号; bash 规则适用于$ sigils。由于 bash 从不查看引号,因此 bash 引号的类型无关紧要; $foo 无论如何都会被替换(除非您使用 \$;bash 会查看反斜杠)。

如果您引用了 heredoc 分隔符 (&lt;&lt;&lt;"END"),则 bash 不会尝试替换变量扩展或解释反斜杠。

heredocs 的规则在bash manual 中有详尽的解释。

和 [python -c "..."] 有区别吗?

是的,bash 在将命令行参数传递给程序之前会对其进行解释,因此 bash 规则适用,python 只能看到通过的任何引号。

命令行中的单词规则在bash manual中有详尽的解释(在上下文中阅读本节)。

【讨论】:

  • 感谢您指向 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 未加引号,因为 bash 成对匹配引号:首先是“ print ”,然后是 $var 的未加引号的值(单词拆分和 glob 扩展),然后是空的 "" 。跨度>
  • 所以在这个例子中我们实际上有三个引号对?我应该使用什么引用语法来抑制 $var 的扩展?我经常在将 JSON 传递给 Python 时遇到问题。他们的正文中有'\ ,Bash 经常将我的 JSON 拆分为数千个将内引号视为分隔符的参数。
  • @suncatcher:python -c 'print "$var"'。如果您想查看 bash 对 python 的帮助,请将 python -c 替换为 echo
猜你喜欢
  • 2010-10-29
  • 2012-01-25
  • 2010-09-08
  • 1970-01-01
  • 2011-09-17
  • 2012-12-13
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
相关资源
最近更新 更多