代码如下:
#!/bin/bash
wd1="hello"
wd2="world"
cat >> log.txt <<<"$wd1\t$wd2\n\n"
当我运行上面的脚本时,'\t','\n'
根本没有展开。所以我把它改成这样:
cat >> log.txt <<<$(echo -e "$wd1\t$wd2\n\n")
但'\t','\n'
仍然没有展开。为什么?
代码如下:
#!/bin/bash
wd1="hello"
wd2="world"
cat >> log.txt <<<"$wd1\t$wd2\n\n"
当我运行上面的脚本时,'\t','\n'
根本没有展开。所以我把它改成这样:
cat >> log.txt <<<$(echo -e "$wd1\t$wd2\n\n")
但'\t','\n'
仍然没有展开。为什么?
来自info bash
:
3.6.7 Here Strings
------------------
A variant of here documents, the format is:
<<< WORD
The WORD is expanded and supplied to the command on its standard
input.
<<<"$wd1\t$wd2\n\n"
\t
受到 bash 扩展的影响,但or没有标准扩展\n
。这就是为什么它不会发生。<<<$(echo -e "$wd1\t$wd2\n\n")
不起作用,因为它没有被引用。echo
输出特殊字符,然后 bash 进行字段拆分,它们被空格替换。你只需要引用它:
cat >> log.txt <<<"$(echo -e "$wd1\t$wd2\n\n")"
Bash 支持另一种扩展某些转义字符的引用:
word=$'foo\nbar'
echo "$word"
不幸的是,这种带引号的字符串不会进行参数扩展:
word=$'$w1'
echo "$word"
如果您使用的是 bash 4 或更高版本,则可以使用printf
来设置变量的值:
printf -v word "$wd1\t$wd2\n\n"
cat >> log.txt <<<"$word"
正如@chepner 指出的那样,这种特殊字符类型在内部扩展$' ... '
,并且由于您可以在单个外壳“单词”中切换引用样式,因此您可以执行以下操作:
cat >>log.txt <<<"$wd1"$'\t'"$wd2"$'\n\n'
相当丑陋,但它的工作原理。另一种可能性是将特殊字符放入变量中,然后对所有内容使用变量扩展:
tab=$'\t'
nl=$'\n'
cat >>log.txt <<<"$wd1$tab$wd2$nl$nl"
我宁愿使用(这里没有字符串):
echo -e "$wd1\t$wd2\n\n" >> log.txt
关于什么:
cat >> log.txt <(echo -e "$wd1\t$wd2\n\n")