Answers:
echo -e ' \t '
将回显“空格制表符空间换行符”(-e
表示“启用反斜杠转义符的解释”):
$ echo -e ' \t ' | hexdump -C
00000000 20 09 20 0a | . .|
echo -e
不能在Makefiles中使用?
echo -e
不是POSIX,通常不是程序使用的make
调用/bin/sh
是交互使用的,并且通常没有-e
实现。为了便于携带,请printf '\t'
改用。
man
页面echo
未提及option -e
。但是,此选项被接受。
使用printf
,而不是echo
。
该echo
命令有多个不同版本。有/bin/echo
(可能是GNU Coreutils版本,也可能不是GNU Coreutils版本,具体取决于系统),并且该echo
命令内置在大多数Shell中。不同的版本有不同的方法(或没有方法)来指定或禁用控制字符的转义符。
printf
另一方面,变化较小。它通常可以作为命令存在/bin/printf
,并且已内置在某些shell中(bash和zsh拥有,tcsh和ksh却没有),但是各种版本之间的相似之处要远得多echo
。而且您不必记住命令行选项(有一些例外情况; GNU Coreutils printf接受--version
和--help
,内置bash printf接受-v var
将输出存储在变量中)。
例如:
res=' 'x # res = "\t\tx"
printf '%s\n' "[$res]"
现在是时候让我承认,echo
对于您正在询问的示例,该方法同样适用。您只需要在参数周围加上双引号即可:
echo "[$res]"
正如kmkaplan所写(两年半前,我才注意到!)。您原始命令的问题:
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
不与echo
; 这是因为外壳在echo
看到它之前用空格替换了标签。
echo
对于简单的输出(例如)来说是很好的选择echo hello world
,但printf
只要您想做更复杂的事情就应该使用。您可以开始echo
工作,但是当您使用不同的echo
实现或外壳程序运行它时,生成的代码可能会失败。
您也可以尝试:
echo Hello$'\t'world.
使用逐字按键,^V
(CTRL+V
,C-v
,不管)。
当您输入^V
终端(或在大多数Unix编辑器中)时,以下字符逐字显示。您可以使用它在要回显的字符串内键入文字制表符。
类似于以下作品:
echo "^V<tab>" # CTRL+V, TAB
Bash文档(qv,“ quoted-insert”)
quoted-insert(Cq,Cv)将您键入的下一个字符逐字添加到行中。例如,这就是如何插入诸如Cq的键序列。
旁注:据此, ALT+TAB
应该做同样的事情,但是我们都将该序列绑定到了窗口切换上,所以我们不能使用它
制表符(M-TAB)插入制表符。
-
注意:您可以对各种异常字符使用此策略。就像回车一样:
echo "^V^M" # CTRL+V, CTRL+M
这是因为回车符是ASCII 13,而M是字母的第13个字母,因此,键入时^M
,您将获得第13个ASCII字符。您可以使用ls^M
,在一个空的提示下看到它的运行情况,该提示将插入一个回车符,从而使提示的行为就像您按回车一样。正常解释这些字符后,逐字即可获取文字字符。
grep
捕捉包含tab
字符的行时节省了我的时间。
使用echo打印变量值是常见的Bash陷阱。参考链接: