ここで文字列に変数を使用する

ここで文字列に変数を使用する

対話型スクリプトに入力を提供するために、次の文字列を使用しました。

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

これは効果的に入ります。

1 2
3 4
5 6
q

スクリプトを入力してください。しかし、そのうちの1つを変数に置き換える方法は何ですか?

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

動作しません...

答え1

ここでは文字列ではありませんが、ANSI-Cの引用:

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

だからあなたが得るものは右側に一重引用符で囲まれた文字列です<<<。ここで、文字列は文字列として扱われ、追加の処理は不要です。

ただし、単語全体に1つの引用符を使用する必要はありません。複数の引用符(または引用符のない単一の単語)を一緒にリンクできます。

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

-eechoこれは、パラメータでエスケープ処理を有効にするために必要です。printfこれは基本的に行われますが、独自の補間システムがあります(printf "$var 2\n3 4\nq"これも機能しますが、$varエスケープ文字を含めることができる場合は問題が発生します)。

答え2

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

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

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

1行にすべて:

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

関連情報