シェルスクリプトでエコー読み取りを使用する方法

シェルスクリプトでエコー読み取りを使用する方法
echo "my name is=`read` and am from `read`"

予想出力:

my name is=sudhir and am from india

sudhirindia入力が使用されます。

これを行う方法は、480の質問に適用するのが好きです。各質問に必要なユーザー入力の量がわかりません。助けてください。

答え1

readデフォルトでは、入力から単語を読みます。変数に変換

`cmd`、古代形態の$(...)捕獲出力コマンド。デフォルトでは、read出力は生成されません。読みたい内容を入力したときに表示されるテキストreadは次のとおりです。エコread端末装置の場合は1に出力されません。

一部のread実装では、読み取った内容を出力できます。たとえば、zsh組み込みread関数は-eorを使用してこれを実行できます-E(後者は入力をエコーするだけでなく、変数に入力も保存します)。

だからzsh

echo "my name is=$(read -e) and am from $(read -e)"

移植可能には入力行を読むことができます(代わりに特別な読書行動read)それを再度出力しますhead -n1。ただし、head標準入力が端末デバイスまたは検索可能ファイルではない場合、ほとんどの実装は2行以上を読み取ります。

多くのシステムにはまだlineコマンドがあります(かつては標準でしたが、後で使用されなくなりました)。

echo "my name is=$(line) and am from $(line)"

一度に1バイトずつ読み取る必要があるため、1行以上の入力を読み取らないでください。

利用できない場合は、いつでも次の方法lineでシミュレートできますread

line() {
  IFS= read -r line
  ret=$?
  printf '%s\n' "$line" || return "$ret"
}

またはそれを

prompt() {
  printf >&2 %s "$1"
  IFS= read -r answer
  printf '%s\n' "$answer"
}

printf '%s\n' "my name is=$(
  prompt "What is your name? ") and am from $(
  prompt "Where are you from? ")"

printf代わりにここで使用されていますechoecho通常、任意のデータと一緒に使用することはできません。)。

(と同じzshIFS= read -re '?What is your name? '

完全性のためにcshまたはを使用して、tcsh次のことを実行できます。

printf '%s\n' "my name is=$< and am from $<"

$<入力を変数として読み取るcshの方法。

入力2行ごとに繰り返すには、次のテキスト処理ユーティリティを使用することをお勧めしますawk

awk '{name=$0; getline place; print "my name is="name" and am from "place}'

¹ inまたは設定を使用するか、inオプション(およびstdinはターミナルデバイス)を使用するreadなど、直接行エディタを実装するように構成されていない場合の出力read -ebashemacsgmacsviksh93readエコ標準出力ではなく標準エラーから。

関連情報