1

代码如下:

#!/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'仍然没有展开。为什么?

4

5 回答 5

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.
  1. <<<"$wd1\t$wd2\n\n"\t受到 bash 扩展的影响,但or没有标准扩展\n。这就是为什么它不会发生。
  2. <<<$(echo -e "$wd1\t$wd2\n\n")不起作用,因为它没有被引用。echo输出特殊字符,然后 bash 进行字段拆分,它们被空格替换。

你只需要引用它:

cat >> log.txt <<<"$(echo -e "$wd1\t$wd2\n\n")"
于 2012-09-21T10:07:32.093 回答
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"
于 2012-09-21T12:30:40.173 回答
0

正如@chepner 指出的那样,这种特殊字符类型在内部扩展$' ... ',并且由于您可以在单个外壳“单词”中切换引用样式,因此您可以执行以下操作:

cat >>log.txt <<<"$wd1"$'\t'"$wd2"$'\n\n'

相当丑陋,但它的工作原理。另一种可能性是将特殊字符放入变量中,然后对所有内容使用变量扩展:

tab=$'\t'
nl=$'\n'

cat >>log.txt <<<"$wd1$tab$wd2$nl$nl"
于 2012-09-21T14:28:50.777 回答
0

我宁愿使用(这里没有字符串):

echo -e "$wd1\t$wd2\n\n" >> log.txt
于 2012-09-21T07:59:28.777 回答
0

关于什么:

cat >> log.txt <(echo -e "$wd1\t$wd2\n\n")
于 2012-09-21T09:16:23.240 回答