如何从bash打印“-n”,“ - e”或“-neeenen”(最后没有换行,不调用外部程序)?
Q="-n"
echo -n "$Q"
#failed
echo -- "$Q"
#failed
cat <<< "$Q"
#failed,也启动外部程序
printf -- '%s' "$Q"
#success,但启动外部程序
答案 0 :(得分:3)
echo -en \\x2Dn
答案 1 :(得分:3)
在bash中,printf
是内置的,因此不会调用外部程序。
$ help printf printf: printf [-v var] format [arguments]
printf格式化并在FORMAT的控制下打印ARGUMENTS。 格式 是一个包含三种类型对象的字符串:plain 字符,简单地复制到标准输出字符 逃逸 转换并复制到标准输出的序列,和 格式规范,每个都会导致下一个打印 连续 论点。除了标准的printf(1)格式,%b表示 至 在相应的参数和%q中展开反斜杠转义序列 意味着以可以作为shell输入重用的方式引用参数。 如果提供了-v选项,则将输出放入的值 shell变量VAR而不是发送到标准输出。
答案 2 :(得分:0)
当然,正确且更便携的方式是使用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)