printf 无法解释反斜杠和感叹号

bit*_*bit 2 command-line bash quoting printf

我正在使用终端编写 Java 程序printf并将其输出重定向到.java文件,但printf无法解释水平反斜杠选项卡 ( \t),并且当我在字符串中有感叹号 (!) 时,它甚至不打印并失败这个错误:

bash: !": event not found

  • 如何强制 printf 包含水平制表符?

  • 以及如何在不出现上述错误的情况下包含感叹号?

命令行参数:

$ printf "%s\n" "public class {" "\tpublic static void main(String[] args) {" "dogBark()" "}" "public static void dogBark() {" "System.out.println("Woof")" "}" "}" > barkingDog.java
Run Code Online (Sandbox Code Playgroud)

.java文件输出

$ less barkingDog.java
public class {
\tpublic static void main(String[] args) {
dogBark()
}
public static void dogBark() {
System.out.println(Woof)
}

}
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 7

使用 here-document 可能比使用printf. 但是,从 bash shell 的内置help printf

 %b   expand backslash escape sequences in the corresponding argument
Run Code Online (Sandbox Code Playgroud)

并防止bash将其!视为历史扩展,请单引号您的字符串:

$ printf '%b\n' 'public class {' '\tpublic static void main(String[] args) {' 'dogBark()' '}' 'public static void dogBark() {' 'System.out.println("Woof!")' '}' '}'
public class {
    public static void main(String[] args) {
dogBark()
}
public static void dogBark() {
System.out.println("Woof!")
}
}
Run Code Online (Sandbox Code Playgroud)

请参阅如何回声!