Bash 逃脱!显示为文字\!

Bash 逃脱!显示为文字\!,bash,escaping,punctuation,Bash,Escaping,Punctuation,我正试图在Bash的一行中为一个文件编写一个Python程序。我正在尝试: $ printf "#\!/usr/bin/python3\nprint('hi\!')\nwhatever()" > whatever.py 但这给了: #\!/usr/bin/python3 print('Hi\!') whatever() 如何将其输出: #!/usr/bin/python3 print('Hi!') whatever() 您可以使用: set +H # disable history

我正试图在Bash的一行中为一个文件编写一个Python程序。我正在尝试:

$ printf "#\!/usr/bin/python3\nprint('hi\!')\nwhatever()" > whatever.py
但这给了:

#\!/usr/bin/python3
print('Hi\!')
whatever()
如何将其输出:

#!/usr/bin/python3
print('Hi!')
whatever()
您可以使用:

set +H # disable history expansion

printf "#!/usr/bin/python3\nprint('hi!')\nwhatever()\n"

set -H # enable history expansion again


最好的方法是使用:

  • 首先,我们使用
    printf%s yourString
    而不是
    printfyourstring
    。这就是
    printf
    应该使用的方式(在这种情况下不需要,但在一般情况下更安全)
  • 使用
    %s\n
    printf
    的每个附加参数打印为一行
  • 在第一行中,没有单引号,因此我们可以用单引号引用整个第一行,而不必转义
  • 在第二行中,有单引号,因此我们不能用单引号引用整个第二行。然而,我们可以引用
    用单引号括起来,其余部分用双引号括起来。在
    bash
    中,字符串
    ab
    可以写成:
    ab
    “ab”
    “ab”
    “a”和“b”

另一种不改变设置的方式移动
从引号中取出:
printf“#”\!“/usr/bin/python3\n打印('hi“\!”)\nwhatever()”
,或者如果不需要扩展,请使用ANSI-C引号
echo$”#/usr/bin/python3\n打印(\'hi\')\nwhatever()'
#!/usr/bin/python3
print('hi!')
whatever()
cat > whatever.py <<EndOfPythonProgram
#!/usr/bin/python3
print('hi!')
whatever()
EndOfPythonProgram
printf '%s\n' '#!/usr/bin/python3' "print('hi"'!'"')" 'whatever()' > whatever.py