在bash脚本中返回制表符

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

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

我明白了

res=[ x] # that is [<space>x]
600071 次浏览
echo -e ' \t '

将回显'space制表符空格换行符' (-e表示'启用反斜杠转义'):

$ echo -e ' \t ' | hexdump -C
00000000  20 09 20 0a                                       | . .|

你需要为echo使用-e标志

echo -e "\t\t x"

将字符串放在引号之间:

echo "[$res]"
使用echo打印变量值是一个常见的Bash陷阱。 参考链接:< / p >

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

你也可以试试:

echo Hello$'\t'world.

如果你想在脚本中使用echo "a\tb",你可以这样运行脚本:

# sh -e myscript.sh

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

# chmod +x myscript.sh
# ./myscript.sh

使用printf,而不是echo

echo命令有多个不同版本。有/bin/echo(可能是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;而是shell在echo看到它之前用空格替换了制表符。

echo适用于简单的输出,比如echo hello world,但当你想做一些更复杂的事情时,你应该使用printf。你可以echo工作,但是当你用不同的echo实现或不同的shell运行它时,结果代码很可能会失败。

从bash手册页:

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

所以你可以这样做:

echo $'hello\tworld'
res="\t\tx"
echo -e "[${res}]"

使用逐字键击,^V (CTRL+VC-v无论)。

当你在终端(或在大多数Unix编辑器中)输入^V时,下面的字符被取为逐字。您可以使用此选项在要回显的字符串中键入文字制表符。

如下所示:

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

Bash文档 (无论如何。, "quote -insert")

quote -insert (C-q, C-v) 将您键入的下一个字符逐字添加到该行。这是如何插入像C-q这样的键序列,例如

__abc1 __abc0 __abc2

< p > tab-insert (M-TAB)

.插入一个制表符

--

注意:您可以将此策略用于各种不同寻常的字符。如马车归来:

echo "^V^M"        # CTRL+V, CTRL+M

这是因为回车符是ASCII 13,而是字母表中的第13个字母,所以当你输入^M时,你会得到第13个ASCII字符。你可以使用ls^M在空提示符处看到它的作用,它将插入回车,导致提示符的作用就像你点击回车一样。当这些字符通常被解释时,逐字会让你得到字面字符。