Python 如何在bash中逃避转义引号

Python 如何在bash中逃避转义引号,python,bash,sh,Python,Bash,Sh,我尝试使用“c”参数运行python代码: python3 -c $'import sys\nfor r in range(1): print(\'rob\')' 成功了,指纹 rob 但我想打印报价: I'm a rob 这当然行不通: python3 -c $'import sys\nfor r in range(10): print(\'I'm rob\')' 如何实现这一点?在打印中使用转义双引号应该可以: python3 -c $'import sys\nfor r in ra

我尝试使用“c”参数运行python代码:

python3 -c $'import sys\nfor r in range(1): print(\'rob\')'
成功了,指纹

rob
但我想打印报价:

I'm a rob
这当然行不通:

python3 -c $'import sys\nfor r in range(10): print(\'I'm rob\')'

如何实现这一点?

打印中使用转义双引号应该可以:

python3 -c $'import sys\nfor r in range(10): print(\"I\'m rob\")'

打印中使用转义双引号应该可以:

python3 -c $'import sys\nfor r in range(10): print(\"I\'m rob\")'

您将如何用Python编写该字符串?如果您想将其保留在单引号中,它将类似于:

print('I\'m rob')
print(\'I\\\'m rob\')
…因此,在
$''
-带引号的字符串中,这将变成如下内容:

print('I\'m rob')
print(\'I\\\'m rob\')
…一旦您转义了引号和Python解释器解析的反斜杠,作为内部引号的保护。因此:

python3 -c $'import sys\nfor r in range(10): print(\'I\\\'m rob\')'

顺便说一句,如果你可以让shell帮你做这件事,那么没有理由手工做:

script=$(cat <<'EOF'
import sys
for r in range(10):
  print('I\'m rob')
EOF
)

printf '%q ' python3 -c "$script"; printf '\n'

…实际上可以作为代码运行。(或者您可以在上面基于herdoc的定义之后运行
python3-c“$script”
,该定义将调用您的脚本,而无需在任何地方包含手动转义的代码副本)。

您如何用Python编写该字符串?如果您想将其保留在单引号中,它将类似于:

print('I\'m rob')
print(\'I\\\'m rob\')
…因此,在
$''
-带引号的字符串中,这将变成如下内容:

print('I\'m rob')
print(\'I\\\'m rob\')
…一旦您转义了引号和Python解释器解析的反斜杠,作为内部引号的保护。因此:

python3 -c $'import sys\nfor r in range(10): print(\'I\\\'m rob\')'

顺便说一句,如果你可以让shell帮你做这件事,那么没有理由手工做:

script=$(cat <<'EOF'
import sys
for r in range(10):
  print('I\'m rob')
EOF
)

printf '%q ' python3 -c "$script"; printf '\n'

…实际上可以作为代码运行。(或者,您可以在上述基于herdoc的定义之后运行
python3-c“$script”
,该定义将调用您的脚本,而无需在任何地方包含手动转义的代码副本)。

如@pault所说,但需要进一步解释

这不起作用,因为您正在结束字符串,并通过将引号放进去重新开始,这是因为您使用了单个引号来谴责字符串。通过使用双引号来声明字符串,可以很容易地解决这个问题

python3 -c $'import sys\nfor r in range(10): print("I\'m rob")'

如@pault所说,但有进一步解释

这不起作用,因为您正在结束字符串,并通过将引号放进去重新开始,这是因为您使用了单个引号来谴责字符串。通过使用双引号来声明字符串,可以很容易地解决这个问题

python3 -c $'import sys\nfor r in range(10): print("I\'m rob")'

如果Python脚本没有使用任何其他参数,请将字符串作为参数传递,以减少所需的嵌套引用量

python3 -c $'import sys\nfor r in range(1): print(sys.argv[1])' "I'm a rob"

如果Python脚本没有使用任何其他参数,请将字符串作为参数传递,以减少所需的嵌套引用量

python3 -c $'import sys\nfor r in range(1): print(sys.argv[1])' "I'm a rob"

对但是这个解决方案迫使我使用双引号。为什么这是一个问题?因为我已经有一些python代码,并且无法编辑它。请在您将来的问题中包含这些类型的内容。而且这只是我们一直在寻找的答案的一部分。你所说的“一些python代码”以及你不能编辑它的事实到底是什么意思?是的。但是这个解决方案迫使我使用双引号。为什么这是一个问题?因为我已经有一些python代码,并且无法编辑它。请在您将来的问题中包含这些类型的内容。而且这只是我们一直在寻找的答案的一部分。你所说的“一些python代码”以及你不能编辑它的事实到底是什么意思?当双引号位于ANSI-C风格的引号内时,为什么要将其转义
echo$'“
发射
而无需使其成为
$'\”
。当双引号位于ANSI-C样式的引用中时,为什么要转义双引号?
echo$'“
发射
而无需使其成为
$'\”