让printf打印转义的反斜杠

时间:2017-05-05 22:19:04

标签: bash shell

因为我需要能够打印可以从echo处理的选项开始的行,我设计了一个使用printf打印到终端的shell函数。如果我需要打印换行符或标签页,我了解到必须使用%b而不是%s,因为printf "%s" "\n"会将文字\n打印到屏幕上。该函数定义如下:

my_echo () {
    printf "%b" "${1}"
}

就在最近,我发现尝试打印转义的转义序列比通常情况更复杂。命令printf "%b" "\\n"将打印换行符。要打印换行符的文字,我必须使用printf "%b" "\\\n",但使用它需要重新编码我的所有其他函数和脚本来处理这个问题。有没有办法让printf "%b" "\\n"或其他任何东西作为转义的转义序列出现?

1 个答案:

答案 0 :(得分:2)

答案:文字

报价类型很重要。如果您不希望在之前解释反斜杠,那么它们会转到您的函数中,请将它们放在单引号字符串中:

printf '%b' '\\n'

...按照您的要求打印一个反斜杠后跟一个n,没有尾随换行符。

答案:最佳实践

将转义序列保留在格式字符串中,并保留在数据之外。因此:

my_echo() { printf '%s\n' "$*"; }
my_echo_n() { printf '%s' "$*"; }

实际上更接近于标准echo行为:只打印一个新行就可以通过调用my_echo而没有参数来完成;打印文字也可以通过传递该字面值来完成:my_echo_n $'\n'将打印文字换行,而不涉及任何%b

同样,要包含文字标签:

my_echo $'hello\tworld'

my_echo "hello"$'\t'"world"