388

如何使用 bash 脚本回显一个或多个制表符?当我运行这段代码

res='       'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]

我明白了

res=[ x] # that is [<space>x]
4

10 回答 10

641
echo -e ' \t '

将回显“空格制表符空格换行符”(-e表示“启用反斜杠转义解释”):

$ echo -e ' \t ' | hexdump -C
00000000  20 09 20 0a                                       | . .|
于 2009-02-08T15:08:03.160 回答
88

使用printf,不使用echo

该命令有多个不同版本echo。有/bin/echo(可能是也可能不是 GNU Coreutils 版本,具体取决于系统),并且该echo命令内置于大多数 shell 中。不同的版本有不同的方式(或没有方式)来指定或禁用控制字符的转义。

printf,另一方面,变化要小得多。它通常可以作为命令存在/bin/printf,并且它内置在某些 shell 中(bash 和 zsh 有它,tcsh 和 ksh 没有),但各种版本彼此之间的相似性远高于echoare 的不同版本。而且您不必记住命令行选项(除了少数例外;GNU Coreutils printf 接受--versionand --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实现或不同的 shell 运行生成的代码时,它可能会失败。

于 2011-11-17T01:59:09.597 回答
57

你也可以试试:

echo Hello$'\t'world.
于 2009-12-10T23:07:53.937 回答
36

把你的字符串放在引号之间:

echo "[$res]"
于 2009-02-08T15:10:12.937 回答
24

你需要使用 -e 标志来回显然后你可以

echo -e "\t\t x"
于 2009-02-08T15:10:12.873 回答
24

从 bash 手册页:

$'string' 形式的单词被特殊处理。该单词扩展为字符串,并按照 ANSI C 标准的规定替换反斜杠转义字符。

所以你可以这样做:

echo $'hello\tworld'
于 2015-12-02T10:43:41.190 回答
18

使用逐字击键^V( CTRL+V, C-v,不管)。

当您^V在终端(或在大多数 Unix 编辑器中)键入时,以下字符将被逐字显示。您可以使用它在要回显的字符串中键入文字制表符。

类似以下的工作:

echo "^V<tab>"     # CTRL+V, TAB

Bash 文档( qv , "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在空提示符下使用 , 来查看它的运行情况,这将插入一个回车符,使提示符的行为就像您按回车键一样。当这些字符通常被解释时,逐字让你得到文字字符。

于 2016-05-06T02:48:37.140 回答
11

使用 echo 打印变量的值是一个常见的 Bash 陷阱。参考链接:

http://mywiki.wooledge.org/BashPitfalls#echo_.24foo

于 2009-02-08T16:10:00.570 回答
2

如果要echo "a\tb"在脚本中使用,请将脚本运行为:

# sh -e myscript.sh

或者,您可以授予 myscript.sh 执行权限,然后运行该脚本。

# chmod +x myscript.sh
# ./myscript.sh
于 2011-11-16T23:32:15.397 回答
0
res="\t\tx"
echo -e "[${res}]"
于 2016-02-15T12:44:25.600 回答