因为我需要能够打印可以从echo
处理的选项开始的行,我设计了一个使用printf
打印到终端的shell函数。如果我需要打印换行符或标签页,我了解到必须使用%b
而不是%s
,因为printf "%s" "\n"
会将文字\n
打印到屏幕上。该函数定义如下:
my_echo () {
printf "%b" "${1}"
}
就在最近,我发现尝试打印转义的转义序列比通常情况更复杂。命令printf "%b" "\\n"
将打印换行符。要打印换行符的文字,我必须使用printf "%b" "\\\n"
,但使用它需要重新编码我的所有其他函数和脚本来处理这个问题。有没有办法让printf "%b" "\\n"
或其他任何东西作为转义的转义序列出现?
答案 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"