如何使用bash脚本回显一个或多个制表符?当我运行此代码时
res=' 'x # res = "\t\tx" echo '['$res']' # expect [\t\tx]
我明白了
res=[ x] # that is [<space>x]
res="\t\tx" echo -e "[${res}]"
echo -e ' \t '
将回显'space tab space newline'( -e 表示'enable interpretation of backslash escapes'):
-e
$ echo -e ' \t ' | hexdump -C 00000000 20 09 20 0a | . .|
使用 printf ,而不是 echo .
printf
echo
echo 命令有多个不同版本 . 有 /bin/echo (可能是也可能不是GNU Coreutils版本,具体取决于系统), echo 命令内置于大多数shell中 . 不同的版本有不同的方式(或没有办法)来指定或禁用控制字符的转义 .
/bin/echo
另一方面, printf 的变化要小得多 . 它可以作为命令存在,通常是 /bin/printf ,而's built into some shells (bash and zsh have it, tcsh and ksh don't),但各种版本比 echo 的不同版本更相似 . 并且您不必记住命令行选项(除了少数例外; GNU Coreutils printf接受 --version 和 --help ,内置bash printf接受 -v var 将输出存储在变量中) .
/bin/printf
--version
--help
-v var
对于你的例子:
res=' 'x # res = "\t\tx" printf '%s\n' "[$res]"
现在是时候让我承认 echo 对于你所询问的例子也会起作用;你只需要在参数周围加上双引号:
echo "[$res]"
正如kmkaplan写的那样(两年半前,我刚才注意到了!) . 原始命令的问题:
不是 echo ;它是在 echo 看到它之前用一个空格替换了标签 .
echo 对于简单输出很好,例如 echo hello world ,但是每当你想做更复杂的事情时你都应该使用 printf . 您可以使 echo 工作,但是当您使用不同的 echo 实现或不同的shell运行它时,生成的代码可能会失败 .
echo hello world
把你的字符串放在 double 引号之间:
你也可以尝试:
echo Hello$'\t'world.
你需要使用-e标志来回声
echo -e "\t\t x"
使用echo来打印变量值是一个常见的Bash陷阱 . 参考链接:
http://mywiki.wooledge.org/BashPitfalls#echo_.24foo
从bash手册页:
$'string'形式的单词被特别处理 . 单词扩展为字符串,替换为ANSI C标准指定的反斜杠转义字符 .
所以你可以这样做:
echo $'hello\tworld'
使用逐字击键, ^V ( CTRL+V , C-v ,等等) .
^V
CTRL+V
C-v
当您在终端(或大多数Unix编辑器)中键入 ^V 时,将逐字记录以下字符 . 您可以使用它在您回显的字符串中键入文字制表符 .
类似下面的工作:
echo "^V<tab>" # CTRL+V, TAB
Bash docs(q.v.,"quoted-insert")
quoted-insert(C-q,C-v)将您键入的下一个字符逐字添加到该行 . 例如,这是如何插入像C-q这样的关键序列 .
旁注:根据这个, ALT+TAB 应该做同样的事情,但我们've all bound that sequence to window switching so we can'吨用它
ALT+TAB
tab-insert(M-TAB)插入制表符 .
注意:您可以将此策略与各种不寻常的字符一起使用 . 像回车一样:
echo "^V^M" # CTRL+V, CTRL+M
这是因为回车符是ASCII 13, M 是字母表的第13个字母,因此当您键入 ^M 时,您将获得第13个ASCII字符 . 您可以使用 ls^M 在空的提示符下查看它的运行情况,该提示符将插入一个回车符,导致提示符就像您点击返回一样 . 当这些字符被正常解释时,逐字逐句可以获得文字字符 .
^M
ls^M
如果要在脚本中使用 echo "a\tb" ,则将脚本运行为:
echo "a\tb"
# sh -e myscript.sh
或者,您可以向myscript.sh提供执行权限,然后运行该脚本 .
# chmod +x myscript.sh # ./myscript.sh
10 回答
将回显'space tab space newline'(
-e
表示'enable interpretation of backslash escapes'):使用
printf
,而不是echo
.echo
命令有多个不同版本 . 有/bin/echo
(可能是也可能不是GNU Coreutils版本,具体取决于系统),echo
命令内置于大多数shell中 . 不同的版本有不同的方式(或没有办法)来指定或禁用控制字符的转义 .另一方面,
printf
的变化要小得多 . 它可以作为命令存在,通常是/bin/printf
,而's built into some shells (bash and zsh have it, tcsh and ksh don't),但各种版本比echo
的不同版本更相似 . 并且您不必记住命令行选项(除了少数例外; GNU Coreutils printf接受--version
和--help
,内置bash printf接受-v var
将输出存储在变量中) .对于你的例子:
现在是时候让我承认
echo
对于你所询问的例子也会起作用;你只需要在参数周围加上双引号:正如kmkaplan写的那样(两年半前,我刚才注意到了!) . 原始命令的问题:
不是
echo
;它是在echo
看到它之前用一个空格替换了标签 .echo
对于简单输出很好,例如echo hello world
,但是每当你想做更复杂的事情时你都应该使用printf
. 您可以使echo
工作,但是当您使用不同的echo
实现或不同的shell运行它时,生成的代码可能会失败 .把你的字符串放在 double 引号之间:
你也可以尝试:
你需要使用-e标志来回声
使用echo来打印变量值是一个常见的Bash陷阱 . 参考链接:
http://mywiki.wooledge.org/BashPitfalls#echo_.24foo
从bash手册页:
所以你可以这样做:
使用逐字击键,
^V
(CTRL+V
,C-v
,等等) .当您在终端(或大多数Unix编辑器)中键入
^V
时,将逐字记录以下字符 . 您可以使用它在您回显的字符串中键入文字制表符 .类似下面的工作:
Bash docs(q.v.,"quoted-insert")
旁注:根据这个,
ALT+TAB
应该做同样的事情,但我们've all bound that sequence to window switching so we can'吨用它注意:您可以将此策略与各种不寻常的字符一起使用 . 像回车一样:
这是因为回车符是ASCII 13, M 是字母表的第13个字母,因此当您键入
^M
时,您将获得第13个ASCII字符 . 您可以使用ls^M
在空的提示符下查看它的运行情况,该提示符将插入一个回车符,导致提示符就像您点击返回一样 . 当这些字符被正常解释时,逐字逐句可以获得文字字符 .如果要在脚本中使用
echo "a\tb"
,则将脚本运行为:或者,您可以向myscript.sh提供执行权限,然后运行该脚本 .