我注意到正确答案已经给出,但是我尝试总结成更简洁的答案。
1. 在这个文档中,你可以使用字面上的制表符而没有任何问题。
如果你想在Bash提示符中输入一个字面上的制表符,你需要转义它。 转义字符是ctrl-V(除非你有自定义绑定来覆盖它)。
$ echo -n 't<ctrl-v><tab>ab' | hexdump -C
00000000 74 09 61 62 |t.ab|
00000004
在大多数程序员编辑器中,插入一个字面制表符应该很容易(尽管某些编辑器可能需要转义)。在Emacs中,ctrl-Q TAB会插入一个字面制表符。
为了更易读,最好使用某种转义而不是字面制表符。在Bash中,$'...'字符串语法很方便。
为了防止变量扩展,引用所有美元符号或将此处文档终止符放在引号中。
$ hexdump -C <<HERE
> t<ctrl-v><tab>\$ab
HERE
00000000 74 09 24 61 62 0a |t.$ab.|
00000006
$ hexdump -C <<'HERE'
> t<ctrl-v><tab>$ab
HERE
00000000 74 09 24 61 62 0a |t.$ab.|
00000006
在这个上下文中,无论您使用单引号还是双引号都没有关系。
3. 我不确定我是否理解了这个子问题。Here document的目的是将其嵌入到脚本中。前面的示例说明了如何在脚本或命令行中将here document传递给hexdump。
如果您想多次使用相同的here document,则没有直接实现这一点的简单方法。脚本可以将here document写入临时文件,然后将该临时文件传递给多个命令,最后删除该临时文件。(请注意,在脚本被中断的情况下,使用trap来删除临时文件。)
您也可以将here document的内容放入变量中,并进行插值处理。
data=$'coffee\t$1.50
tea\t$1.50
burger\t$5.00'
wc <<HERE
$data
HERE
grep -c $'\t' <<HERE
$data
HERE
你可以等价地使用
echo -E "$data" | wc; echo -E "$data" | grep -c $'\t'
,但是使用echo不太优雅,可能不太可移植(尽管如果你的目标是bash,所有的echo应该都是相同的。如果你的目标是Bourne shell,你也可能为每个echo花费一个外部进程)。