我该如何使用bash脚本回显一个或多个制表符? >
res='       'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]


#1 楼

echo -e ' \t '


将回显'space tab space newline'(-e意味着'启用反斜杠转义的解释'):


评论


谢谢约翰尼斯。您帮助我找到了这个解决方案:res ='\ t \ t'x;回声-e'['$ res']'

– kalyanji
09年2月8日在15:12

您是否知道,为什么echo -e在Makefiles中不起作用?

– dma_k
2010-10-17在0:01

这是因为echo -e不是POSIX,并且通常不是程序使用的/ bin / sh调用是交互使用的,并且通常-e没有实现。为了可移植性,请改用printf'\ t'。

–苏So
2012年10月5日19:02

在达尔文(macOS)中,echo命令的手册页未提及选项-e。但是,此选项被接受。

– ePi272314
19-6-28在14:28



#2 楼

使用printf而不是echo

echo命令有多个不同版本。有/bin/echo(取决于系统,它可能是GNU Coreutils版本,也可能不是GNU Coreutils版本),并且大多数外壳程序都内置了echo命令。不同的版本有不同的方式(或没有方式)来指定或禁用控制字符的转义。它可以作为命令存在,通常是printf,并且已内置在某些shell中(bash和zsh拥有它,tcsh和ksh却没有),但是各种版本之间的相似之处远多于/bin/printf的不同版本。而且您不必记住命令行选项(有一些例外情况; GNU Coreutils printf接受echo--version,内置的bash printf接受--help将输出存储在变量中)。

您的示例:

res='           'x # res = "\t\tx"
printf '%s\n' "[$res]"


现在是时候让我承认-v var对于您要查询的示例同样适用;您只需要在参数周围加上双引号即可:

echo "[$res]"


如kmkaplan所写(两年半前,我才注意到!)。您原始命令的问题:

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


不是echo的问题;这是因为外壳在echo看到之前用空格替换了制表符。您可以使echo正常工作,但是当您使用不同的echo实现或不同的Shell运行它时,生成的代码可能会失败。

评论


我喜欢这一点,它使我可以使用printf和所有格式说明符的知识。

–阿伦
13年3月19日在0:16

@JezenThomas:它没有更多的争议,因为它以不同于请求的方式回答了问题。这个问题专门提到了echo,而echo不是动词而是命令。

– Paulo Neves
17年5月4日在13:15

@PauloNeves:我会说它在以下问题中用作动词:“如何使用bash脚本回显一个或多个制表符?”

–基思·汤普森(Keith Thompson)
17年5月4日在18:53

#3 楼

您也可以尝试:

echo Hello$'\t'world.


评论


+1获取更通用的解决方案。我已经使用bash多年了,现在我才知道这一点!

– Aryeh Leib Taurog
2012年5月15日18:36

这比公认的答案要笼统得多,因为它可以不带回声地使用。

– jwan
18年2月15日在17:58

#4 楼

将您的字符串放在双引号之间:

echo "[$res]"


评论


同样在这里-这是我首先尝试的方法。 -e虽然很好

– froderik
15年8月5日在10:48

@kmkaplan在zsh中为我工作-在bash中对我失败

–卡尔
15年8月18日在2:45

#5 楼

您需要使用-e标志进行回显,然后可以

echo -e "\t\t x"


#6 楼

从bash手册页:


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


因此您可以执行以下操作: >

评论


为什么这在cli上起作用,但在bash脚本中却不起作用?

– Freek
19年2月28日在16:12

@Freek对我有用—也许将您的脚本发布在无法单独解决的地方?

– David Moles
20/12/16在21:00

#7 楼

使用逐字键^VCTRL+VC-v等)。

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

类似以下内容的内容: (qv,“带引号的”)


带引号的(Cq,Cv)
将您键入的下一个字符逐字添加到行中。例如,这就是插入诸如Cq之类的键序列的方法。所以我们不能使用它


制表符(M-TAB)
插入制表符。


-

注意:您可以对各种不寻常的字符使用此策略。就像回车符一样:

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


这是因为回车符是ASCII 13,而M是字母的第13个字母,因此,当您键入ALT+TAB时,会得到第13个ASCII字符。您可以使用^M在空的提示符下看到它的运行情况,该提示符将插入一个回车符,从而导致提示符的行为就像您按回车一样。通常解释这些字符后,逐字逐字即可获取文字字符。

评论


希望我能为您提供更多的支持。在这种情况下,我不想在参数中使用-e,并且效果很好。谢谢!

–亚伦·R。
18年2月19日在18:18

“ ...大多数Unix编辑器”?试图同时使用vi和emacs来输入它,但都没有给出期望的结果。

– GreenMatt
19年1月11日15:18

太酷了!并且在尝试使用grep捕获包含制表符的行时节省了我的时间。

–乔尔
19年2月11日19:50

#8 楼

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

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

评论


太酷了,我喜欢“ BashPitfalls”,这是很棒的素材,可以减轻我的日常工作带来的痛苦!

–田俊杰
2011-10-27 4:49

+1,因为确实如此。但请注意,kalyanji字符串以“ [”开头,不包含任何“ \”。

– kmkaplan
2012年11月28日0:38

#9 楼

如果要在脚本中使用echo "a\tb",请按以下方式运行脚本:

# sh -e myscript.sh


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

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


#10 楼

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