bash脚本中的Echo选项卡字符

时间:2009-02-08 15:05:28

标签: bash tabs echo spaces

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

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

我明白了

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

10 个答案:

答案 0 :(得分:424)

echo -e ' \t '

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

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

答案 1 :(得分:65)

使用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运行它时,生成的代码可能会失败。

答案 2 :(得分:32)

将字符串放在 double 引号之间:

echo "[$res]"

答案 3 :(得分:26)

您也可以尝试:

echo Hello$'\t'world.

答案 4 :(得分:17)

你需要使用-e标志来表示你可以

echo -e "\t\t x"

答案 5 :(得分:11)

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

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

答案 6 :(得分:11)

来自bash手册页:

  

$&#39; string&#39;形式的单词特别对待。单词扩展为字符串,替换为ANSI C标准指定的反斜杠转义字符。

所以你可以这样做:

echo $'hello\tworld'

答案 7 :(得分:8)

使用逐字击键,^VCTRL+VC-v

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

以下作品:

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

Bash docs q.v。,“quoted-insert”)

  

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

旁注:据此, ALT+TAB 应该做同样的事情,但我们都将该序列绑定到窗口切换,所以我们不能使用它< / em>的

  

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

-

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

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

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

答案 8 :(得分:2)

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

# sh -e myscript.sh

或者,您可以向myscript.sh提供执行权限,然后运行脚本。

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

答案 9 :(得分:0)

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