インタラクティブなスクリプトに入力をフィードするために、私はhere-stringを使用しています。
script <<< $'1 2\n3 4\n5 6\nq'
これは効果的に入ります
1 2
3 4
5 6
q
スクリプトに。しかし、どうすればこれらの1つを変数に置き換えることができますか?
script <<< $'$var 2\n3 4\n...'
動作しません...
これはここの文字列ではなく、 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
にエスケープ文字が含まれている可能性がある場合は問題があります)。
$'...'
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"