web-dev-qa-db-ja.com

here-stringで変数を使用する

インタラクティブなスクリプトに入力をフィードするために、私はhere-stringを使用しています。

script <<< $'1 2\n3 4\n5 6\nq'

これは効果的に入ります

1 2
3 4
5 6
q

スクリプトに。しかし、どうすればこれらの1つを変数に置き換えることができますか?

script <<< $'$var 2\n3 4\n...'

動作しません...

1
snurden

これはここの文字列ではなく、 ANSI-C quoting :です。

$ 'string'の形式の単語は特別に扱われます。 ...展開された結果は、ドル記号が存在しなかったかのように一重引用符で囲まれます。

つまり、<<<の右側にある一重引用符で囲まれた文字列です。その文字列は、それ以上の処理なしで、here文字列と見なされます。

ただし、Word全体を引用符で囲む必要はありません。引用符で囲まれた複数の部分(または引用符で囲まれていない単一の単語)を結合して使用できます。

script <<< "$var 2"$'\n'"3 4"$'\n'"5 6"$'\n'q

あなたが望むことをします。

または、"1 2"を引用符で囲むのではなく、スペースをバックスラッシュでエスケープすることもできます。


通常のパイプで echo -e を使用することもできます。

echo -e "$var 2\n3 4\n5 6\nq" | script

または printf

printf '%s 2\n3 4\nq' "$var" | script

echoの引数でエスケープ処理を有効にするには、-eが必要です。 printfはデフォルトでこれらを実行しますが、独自の補間システムがあります(printf "$var 2\n3 4\nq"も機能しますが、$varにエスケープ文字が含まれている可能性がある場合は問題があります)。

7
Michael Homer

$'...' ANSI-Cの引用符は、「単一引用符で囲まれた」文字列になります。
一重引用符で囲まれた文字列内では、変数は展開されません。

$ var=13

$ echo 'test $var'
test $var

そのような構造から変数を取り除く必要があります。 IMOの最も簡単な方法は次のとおりです。

$  printf -v val '%s 2\n3 4\n5 6\nq' "$var"
13 2
3 4
5 6
q

printfの形式は、以前の形式と非常によく似ており、%sは変数の値に置き換えられます。変数で結果を取得するには、変数を設定するbashprintfの容量を使用できます。

$ printf -v val '%s 2\n3 4\n5 6\nq' "$var"
$ script <<< "$val"

オールインワンライン:

$ printf -v val '%s 2\n3 4\n5 6\nq' "$var"; script <<< "$val"
0
user79743