代码如下:
#!/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'
仍然没有扩展。为什么呢?
答案 0 :(得分:2)
来自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"
受bash扩展限制,但\t
或\n
没有标准扩展。这就是为什么它不会发生。<<<$(echo -e "$wd1\t$wd2\n\n")
不起作用,因为它没有引用。 echo
输出特殊字符,然后bash进行字段拆分,然后用空格替换。你只需要引用它:
cat >> log.txt <<<"$(echo -e "$wd1\t$wd2\n\n")"
答案 1 :(得分:1)
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"
答案 2 :(得分:0)
我宁愿使用(这里没有字符串):
echo -e "$wd1\t$wd2\n\n" >> log.txt
答案 3 :(得分:0)
怎么样:
cat >> log.txt <(echo -e "$wd1\t$wd2\n\n")
答案 4 :(得分:0)
正如@chepner所指出的那样,这种特殊字符在$' ... '
内扩展,因为你可以在单个shell“word”中切换引用样式,你可以这样做:
cat >>log.txt <<<"$wd1"$'\t'"$wd2"$'\n\n'
相当难看,但它有效。另一种可能性是将特殊字符放在变量中,然后对所有内容使用变量扩展:
tab=$'\t'
nl=$'\n'
cat >>log.txt <<<"$wd1$tab$wd2$nl$nl"