逃跑了!显示为文字\!

时间:2018-03-05 11:51:00

标签: bash escaping punctuation

我正在尝试将Python程序写入一行Bash中的文件。我正在尝试这个:

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

但是这给了:

#\!/usr/bin/python3
print('Hi\!')
whatever()

如何输出:

#!/usr/bin/python3
print('Hi!')
whatever()

2 个答案:

答案 0 :(得分:2)

最好的方法是使用Here Document

cat > whatever.py <<EndOfPythonProgram
#!/usr/bin/python3
print('hi!')
whatever()
EndOfPythonProgram

但是既然你想在一行中写下所有内容,你可以使用以下命令:

printf '%s\n' '#!/usr/bin/python3' "print('hi"'!'"')" 'whatever()' > whatever.py
  • 首先,我们使用printf %s yourString代替printf yourString。这就是printf应该被使用的方式(在这种情况下不是必需的,但对于一般情况更安全)。
  • %s\n printf的每个附加参数都打印为一行。
  • 在第一行中,没有单引号,因此我们可以用单引号引用整行第一行,而不必转义!
  • 在第二行中,有单引号,因此我们不能用单引号引用整个第二行。不过,我们可以用单引号引用!,用双引号引用其余部分。在bash中,字符串ab可以写成:ab"ab"'ab'"a"'b',...

答案 1 :(得分:1)

您可以使用:

set +H # disable history expansion

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

set -H # enable history expansion again

#!/usr/bin/python3
print('hi!')
whatever()