在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陷阱。 参考链接:
你需要使用-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 
 使用逐字按键, ^V ( CTRL+V , Cv , 无论 )。 
 当您在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}]"