在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}]"