当前位置:  开发笔记 > 编程语言 > 正文

bash脚本中的Echo选项卡字符

如何解决《bash脚本中的Echo选项卡字符》经验,为你挑选了8个好方法。

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

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

我明白了

res=[ x] # that is [x]

Johannes Wei.. 478

echo -e ' \t '

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

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

那是因为`echo -e`不是POSIX而且`make`调用`/ bin/sh`,这通常不是交互式使用的程序,通常没有`-e`实现.为了便于携带,请使用`printf'\ t'`代替. (23认同)

你碰巧知道,为什么`echo -e`在Makefile中不起作用? (2认同)


Keith Thomps.. 71

使用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; 在echo看到它之前,shell用空格替换了标签.

echo对于简单的输出来说很好echo hello world,但是你应该printf在你想做更复杂的事情时使用.您可以开始echo工作,但是当您使用不同的echo实现或不同的shell 运行它时,生成的代码可能会失败.



1> Johannes Wei..:
echo -e ' \t '

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

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


那是因为`echo -e`不是POSIX而且`make`调用`/ bin/sh`,这通常不是交互式使用的程序,通常没有`-e`实现.为了便于携带,请使用`printf'\ t'`代替.
你碰巧知道,为什么`echo -e`在Makefile中不起作用?

2> Keith Thomps..:

使用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; 在echo看到它之前,shell用空格替换了标签.

echo对于简单的输出来说很好echo hello world,但是你应该printf在你想做更复杂的事情时使用.您可以开始echo工作,但是当您使用不同的echo实现或不同的shell 运行它时,生成的代码可能会失败.



3> kmkaplan..:

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

echo "[$res]"


简单明了的答案 - 应该是公认的答案.
@kmkaplan在zsh中为我工作 - 在bash中失败了

4> jbatista..:

你也可以尝试:

echo Hello$'\t'world.


+1为更一般的解决方案.我已经使用bash多年了,我现在才学会这个!

5> Learning..:

你需要使用-e标志来回声

echo -e "\t\t x"



6> esoriano..:

从bash手册页:

$'string'形式的单词是专门处理的.单词扩展为字符串,替换为ANSI C标准指定的反斜杠转义字符.

所以你可以这样做:

echo $'hello\tworld'



7> Anonymous..:

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

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



8> rich remer..:

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

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

类似下面的工作:

echo "^V"     # CTRL+V, TAB

Bash docs(qv,"quoted-insert")

quoted-insert(Cq,Cv)将您键入的下一个字符逐字添加到该行.例如,这是如何插入像Cq这样的键序列.

旁注:根据这个, ALT+TAB 应该做同样的事情,但是我们都把这个序列绑定到窗口切换所以我们不能使用它

tab-insert(M-TAB)插入制表符.

-

注意:您可以将此策略与各种不寻常的字符一起使用.像回车一样:

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

这是因为回车符是ASCII 13,而M是字母表的第13个字母,因此当您键入时^M,您将获得第13个ASCII字符.你可以ls^M在一个空的提示符下看到它的运行情况,它会插入一个回车符,导致提示符就像你点击返回一样.当这些字符被正常解释时,逐字逐句可以获得文字字符.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有