题
我如何呼应使用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
命令被内置到最炮弹。不同的版本有不同的方式(或没办法)来控制字符指定或禁用逃逸。
printf
,在另一方面,具有低得多的变化。它可以存在,作为一个命令,通常/bin/printf
,而且它内置了一些贝壳(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中运行它失败。
把双击引号之间的字符串:
echo "[$res]"
您也可以尝试:
echo Hello$'\t'world.
需要使用-e标志然后回声可以
echo -e "\t\t x"
从bash帮助页面:
形式$“字串”的词被特殊处理。字扩展为字符串,如由ANSI C标准中规定的取代反斜杠转义字符。
所以,你可以这样做:
echo $'hello\tworld'
使用回波打印的变量的值是常见的击陷阱。 参考链接:
使用逐字击键,^V
(CTRL+V
,C-v
,任何)。
当键入^V
到终端(或在大多数Unix编辑),下面的字符被取逐字。您可以使用此输入您回荡在字符串中文字制表符。
类似如下的工作:
echo "^V<tab>" # CTRL+V, TAB
击文档( QV , “援引嵌件”)
引述嵌件(C-Q,C-v)的 添加您键入到行逐字下一个字符。这是如何插入像C-Q键序列,例如
边注:根据本的ALT+TAB
的应该做同样的事情,但我们所有的约束,且序列窗口切换,所以我们不能用它的
标签嵌件(M-TAB) 插入一个制表符。
-
请注意:您可以使用此策略与各种人物和角色。像一个回车:
echo "^V^M" # CTRL+V, CTRL+M
这是因为回车符是ASCII 13,和中号与字母的第13封信,所以当你键入^M
,你得到的第13 ASCII字符。你可以看到它使用ls^M
行动,在一个空的提示,这将插入一个回车,导致迅速采取行动,就像你打的回报。当这些字符通常解释的逐字的让你获得文字字符。
如果你想在脚本中使用echo "a\tb"
,运行脚本:
# sh -e myscript.sh
另外,也可以给myscript.sh执行权限,然后运行该脚本。
# chmod +x myscript.sh
# ./myscript.sh
res="\t\tx"
echo -e "[${res}]"