在bash脚本中回显选项卡字符

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

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

我明白了

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

将回显“空格标签空间换行”( -e意思是“启用反斜杠转义的解释”):

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

使用printf ,而不是echo

有多个不同版本的echo命令。 有/bin/echo (根据系统不同,它可能是也可能不是GNU Coreutils的版本), echo命令是内置在大多数shell中的。 不同的版本有不同的方式(或不能)指定或禁用控制字符的转义。

另一方面, printf变化less得多。 它可以作为一个命令存在,通常是/bin/printf ,它被内置到一些shell中(bash和zsh有它,tcsh和ksh没有),但是各种版本比其他版本更相似echo是。 而且你不必记住命令行选项(有一些例外,GNU Coreutils printf接受--version--help ,而内置的bash printf接受-v var将输出存储在一个variables中)。

举个例子:

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

现在是时候让我承认, echo对你所问的例子来说也是一样的。 你只需要在参数中加双引号:

 echo "[$res]" 

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

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

不与echo ; 这是shellreplace标签之前, echo看到它的空间。

echo对于简单的输出来说很好,就像echo hello world ,但是当你想要做更复杂的事情时,你应该使用printf 。 你可以得到echo工作,但是当你使用不同的echo实现或者不同的shell运行时,结果代码可能会失败。

把你的string放在引号之间:

 echo "[$res]" 

你也可以尝试:

 echo Hello$'\t'world. 

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

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

你需要使用-e标志来回显你可以

 echo -e "\t\tx" 

从bash手册页:

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

所以你可以这样做:

 echo $'hello\tworld' 

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

 # sh -e myscript.sh 

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

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

使用逐字按键, ^VCTRL+VCv无论 )。

当您在terminal(或在大多数Unix编辑器中)键入^V ,以下字符是逐字logging的 。 您可以使用它在您正在回显的string内键入一个文字标签字符。

类似以下的作品:

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

Bash文档 ( qv ,“quoted-insert”)

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

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

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

注意:你可以用这个策略来处理各种不寻常的字符。 像回车一样:

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

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

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