【发布时间】:2010-06-18 23:30:01
【问题描述】:
如何从 bash 打印“-n”、“-e”或“-neeenen”(末尾没有换行符,不调用外部程序)?
Q="-n"
echo -n "$Q"# 失败
echo -- "$Q"# 失败
cat <<< "$Q"#失败,同时启动外部程序
printf -- '%s' "$Q"#成功,但启动外部程序
【问题讨论】:
标签: bash
如何从 bash 打印“-n”、“-e”或“-neeenen”(末尾没有换行符,不调用外部程序)?
Q="-n"
echo -n "$Q"# 失败
echo -- "$Q"# 失败
cat <<< "$Q"#失败,同时启动外部程序
printf -- '%s' "$Q"#成功,但启动外部程序
【问题讨论】:
标签: bash
在 bash 中,printf 是内置的,因此不会调用外部程序。
$ help printf printf: printf [-v var] format [arguments]printf 在 FORMAT 的控制下格式化和打印 ARGUMENTS。 格式 是一个字符串,它包含三种类型的对象:plain 字符,简单地复制到标准输出,字符 逃脱 被转换并复制到标准输出的序列,以及 格式规范,每一个都会导致打印下一个 连续 争论。除了标准的 printf(1) 格式,%b 表示 至 展开相应参数中的反斜杠转义序列和 %q 表示以一种可以作为 shell 输入重用的方式引用参数。 如果提供了 -v 选项,则输出将放入 shell 变量 VAR 而不是被发送到标准输出。
【讨论】:
echo -en \\x2Dn
【讨论】:
当然,正确且更便携的方法是使用printf,但是这样可以:
$ Q='-n'
$ echo -ne '\0'"$Q"
但如果您有反斜杠序列要按字面打印,则会失败:
$ Q='-n\nX'
$ echo -ne '\0'"$Q"
-n
X
当想要的是“-n\nX”时。在这种情况下,这是可行的:
$ echo -n $'\0'"$Q"
-n\nX$ # (no newline, so prompt follows on the same line)
但它不适用于Q='-n'!
如果我们想用printf打印文字字符串怎么办?
$ Q='-n\nX'
$ printf "$Q"
-bash: printf: -n: invalid option
$ printf -- "$Q"
-n
X
$ printf "%s" "$Q"
-n\nX$ # (no newline, so prompt follows on the same line)
【讨论】: