コードは以下のとおりです。
#!/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拡張の対象ですが、またはの標準拡張はありません\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"
私はむしろ使用したい(ここでは文字列はありません):
echo -e "$wd1\t$wd2\n\n" >> log.txt
どうですか:
cat >> log.txt <(echo -e "$wd1\t$wd2\n\n")
@chepnerが指摘したように、そのタイプの特殊文字は内部$' ... '
で展開され、単一のシェル「単語」内で引用スタイルを切り替えることができるため、次のようなことができます。
cat >>log.txt <<<"$wd1"$'\t'"$wd2"$'\n\n'
かなり醜いですが、それは機能します。もう1つの可能性は、特殊文字を変数に入れてから、すべてに変数展開を使用することです。
tab=$'\t'
nl=$'\n'
cat >>log.txt <<<"$wd1$tab$wd2$nl$nl"