如何使用bash脚本回显一个或多个制表符字符? 当我运行这段代码bash脚本中的回显标签字符
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
我得到这个
res=[ x] # that is [<space>x]
如何使用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 | . .|
你需要使用-e标志作为回声,那么你可以
echo -e "\t\t x"
使用echo打印变量的值是一个常见的Bash陷阱。 参考链接:
你还可以尝试:
echo Hello$'\t'world.
如果你想在脚本中使用echo "a\tb"
,运行脚本:
# sh -e myscript.sh
另外,你可以给myscript.sh执行权限,然后运行脚本。
# chmod +x myscript.sh
# ./myscript.sh
使用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运行它时,结果代码可能会失败。
从bash的手册页:形式$ '字符串' 的
词会被特殊对待。该字扩展为字符串,反斜杠转义字符被替换为ANSI C标准指定的字符。
所以,你可以这样做:
echo $'hello\tworld'
res="\t\tx"
echo -e "[${res}]"
使用逐字按键,^V
(CTRL+V
,C-v
,无论)。
当您在终端中(或在大多数Unix编辑器中)键入^V
时,以下字符将被采用逐字。您可以使用它在正在回显的字符串内键入一个字面制表符。
类似以下工作:
echo "^V<tab>" # CTRL+V, TAB
Bash docs(QV “援引-插入”)
引号的插入(CQ,CV) 添加下一个字符,你逐字输入。例如,这是如何插入像C-q这样的密钥序列。
侧面说明:根据这一点,ALT+TAB
应该做同样的事情,但我们所有的约束,且序列窗口切换,所以我们不能用它
制表插入(M-TAB) 插入一个制表符。
-
注意:您可以使用此策略与各种人物和角色。就像一个回车:
echo "^V^M" # CTRL+V, CTRL+M
这是因为回车符是ASCII码13和中号是字母表中的第13封信,所以当你键入^M
,你得到的第13 ASCII字符。您可以使用ls^M
在行动中看到它,在空的提示下,它将插入一个回车符,导致提示行为就像您返回。当这些字符被正常解释时,逐字可以让你得到字面字符。
谢谢Johannes。你帮我找到了这个解决方案:res ='\ t \ t'x; echo -e'['$ res']' – kalyanji 2009-02-08 15:12:56
你碰巧知道,为什么'echo -e`在Makefiles中不起作用? – 2010-10-17 00:01:48
这是因为`echo -e`不是POSIX,`make`调用`/ bin/sh`,这通常不是程序使用交互式使用,通常也没有实现`-e`。为了便于携带,请使用`printf'\ t``来代替。 – 2012-10-05 19:02:34