在bash here-string中扩展具有特殊含义的字符

时间:2012-09-21 07:52:11

标签: bash

代码如下:

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

5 个答案:

答案 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.
  1. <<<"$wd1\t$wd2\n\n"受bash扩展限制,但\t\n没有标准扩展。这就是为什么它不会发生。
  2. <<<$(echo -e "$wd1\t$wd2\n\n")不起作用,因为它没有引用。 echo输出特殊字符,然后bash进行字段拆分,然后用空格替换。
  3. 你只需要引用它:

    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"