【发布时间】:2010-10-06 06:25:55
【问题描述】:
如何使用 bash 脚本回显一个或多个制表符? 当我运行这段代码时
res=' 'x # res = "\t\tx"
echo '['$res']' # expect [\t\tx]
我明白了
res=[ x] # that is [<space>x]
【问题讨论】:
如何使用 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 | . .|
【讨论】:
echo -e 在 Makefile 中不起作用?
echo -e 不是POSIX 并且make 调用/bin/sh 这通常不是程序使用交互使用,并且通常没有实现-e。为了便于携带,请改用printf '\t'。
echo 命令的man 页面未提及选项-e。但是,此选项被接受。
你需要使用 -e 标志来回显然后你可以
echo -e "\t\t x"
【讨论】:
将您的字符串放在 双 引号之间:
echo "[$res]"
【讨论】:
使用 echo 打印变量的值是一个常见的 Bash 陷阱。 参考链接:
【讨论】:
你也可以试试:
echo Hello$'\t'world.
【讨论】:
$'Hello\tWorld'
如果你想在脚本中使用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 没有),但是各种版本彼此之间的相似性远高于 @ 的不同版本987654328@ 是。而且您不必记住命令行选项(除了少数例外;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 看到它之前,shell 用空格替换了标签。
echo 适用于简单的输出,例如echo hello world,但是当你想做更复杂的事情时,你应该使用printf。您可以让echo 工作,但是当您使用不同的echo 实现或不同的shell 运行它时,生成的代码可能会失败。
【讨论】:
来自 bash 手册页:
$'string' 形式的单词被特殊处理。单词扩展为字符串,并按照 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 (q.v., "quoted-insert")
带引号的插入 (C-q, C-v) 将您键入的下一个字符逐字添加到该行中。例如,这就是插入 C-q 等键序列的方法。
旁注:据此, ALT+TAB 应该做同样的事情,但我们都将该序列绑定到窗口切换,所以我们不能使用它
制表符插入 (M-TAB) 插入制表符。
--
注意:您可以将此策略用于各种不寻常的字符。就像一个回车:
echo "^V^M" # CTRL+V, CTRL+M
这是因为回车是 ASCII 13,而 M 是字母表的第 13 个字母,所以当你输入 ^M 时,你会得到第 13 个 ASCII 字符。您可以使用ls^M 在一个空提示符处看到它的运行情况,这将插入一个回车符,使提示符的行为就像您按回车一样。当这些字符被正常解释时,verbatim 让你得到文字字符。
【讨论】:
grep 捕获包含 tab 字符的行时节省了我的时间。