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拡張の対象ですが、またはの標準拡張はありません\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

私はむしろ使用したい(ここでは文字列はありません):

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 に答える
0

@chepnerが指摘したように、そのタイプの特殊文字は内部$' ... 'で展開され、単一のシェル「単語」内で引用スタイルを切り替えることができるため、次のようなことができます。

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

かなり醜いですが、それは機能します。もう1つの可能性は、特殊文字を変数に入れてから、すべてに変数展開を使用することです。

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

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