代码之家  ›  专栏  ›  技术社区  ›  zella

如何在bash中转义引号

  •  0
  • zella  · 技术社区  · 7 年前

    我尝试使用“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\')'
    

    如何做到这一点?

    4 回复  |  直到 7 年前
        1
  •  2
  •   Charles Duffy    7 年前

    您将如何用Python编写该字符串?如果你想把它放在单引号中,它应该是这样的:

    print('I\'m rob')
    

    …这样,在 $'' -带引号的字符串,类似于:

    print(\'I\\\'m rob\')
    

    …一旦你避开了这两个引言 字面反斜杠 由python解释器解析,作为对内部引用的保护。因此:

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

    顺便说一句——当你可以要求壳牌为你做这件事的时候,没有好的理由用手来做这件事:

    script=$(cat <<'EOF'
    import sys
    for r in range(10):
      print('I\'m rob')
    EOF
    )
    
    printf '%q ' python3 -c "$script"; printf '\n'
    

    …发出:

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

    …实际上可以作为代码运行。(或者你可以直接跑 python3 -c "$script" 在上面的基于hereDoc的定义之后,它将调用您的脚本,而不需要在任何地方涉及代码的手动转义副本)。

        2
  •  0
  •   pault Tanjin    7 年前

    在中使用转义双引号 print 应该工作:

    python3 -c $'import sys\nfor r in range(10): print(\"I\'m rob\")'
    
        3
  •  0
  •   Jab    7 年前

    按照@pault的说法,但还有进一步的解释。

    这不起作用,因为您要结束字符串,并通过放入引号重新开始,这是因为您使用了一个单引号来声明字符串。这可以通过使用双引号来公开字符串来很容易地纠正。

    python3 -c $'import sys\nfor r in range(10): print("I\'m rob")'
    
        4
  •  0
  •   chepner    7 年前

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

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