2009-02-08 21 views
189

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

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

我得到这个

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

回答

322
echo -e ' \t ' 

将呼应 '空间标签空间换行'(-e意思是 '使反斜线的解释逃逸'):

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

谢谢Johannes。你帮我找到了这个解决方案:res ='\ t \ t'x; echo -e'['$ res']' – kalyanji 2009-02-08 15:12:56

+1

你碰巧知道,为什么'echo -e`在Makefiles中不起作用? – 2010-10-17 00:01:48

+18

这是因为`echo -e`不是POSIX,`make`调用`/ bin/sh`,这通常不是程序使用交互式使用,通常也没有实现`-e`。为了便于携带,请使用`printf'\ t``来代替。 – 2012-10-05 19:02:34

14

你需要使用-e标志作为回声,那么你可以

echo -e "\t\t x" 
28

把你的字符串引号之间:

echo "[$res]" 
+3

简单而明显的答案 - 应该是公认的答案。 – 2012-10-05 19:03:26

+6

不,不起作用。 – Noldorin 2013-10-29 17:36:38

+0

@Noldorin你是什么意思?当然是的。 – kmkaplan 2013-10-30 20:34:24

20

你还可以尝试:

echo Hello$'\t'world. 
2

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

# sh -e myscript.sh 

另外,你可以给myscript.sh执行权限,然后运行脚本。

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

使用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曾经看到它之前用空格替换了该标签。

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

7

从bash的手册页:形式$ '字符串' 的

词会被特殊对待。该字扩展为字符串,反斜杠转义字符被替换为ANSI C标准指定的字符。

所以,你可以这样做:

echo $'hello\tworld' 
3

使用逐字按键,^VCTRL+VC-v无论)。

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

类似以下工作:

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

Bash docsQV “援引-插入”)

引号的插入(CQ,CV) 添加下一个字符,你逐字输入。例如,这是如何插入像C-q这样的密钥序列。

侧面说明:根据这一点,ALT+TAB应该做同样的事情,但我们所有的约束,且序列窗口切换,所以我们不能用它

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

-

注意:您可以使用此策略与各种人物和角色。就像一个回车:

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

这是因为回车符是ASCII码13和中号是字母表中的第13封信,所以当你键入^M,你得到的第13 ASCII字符。您可以使用ls^M在行动中看到它,在空的提示下,它将插入一个回车符,导致提示行为就像您返回。当这些字符被正常解释时,逐字可以让你得到字面字符。