読み取りコマンドの入力をコマンド自体として扱います。

読み取りコマンドの入力をコマンド自体として扱います。

スクリプトでこの関数を定義するとします。

fct1() {
  local msg1=${@}
if [[ "${verb}" = 'tru' ]]; then
  echo "I say $msg1"
  sleep 1
  echo "i repeat"
  sleep 1
  echo "I saaaaaaaaay $msg1"
else
  echo "$msg1"
fi
}

ユーザーがこの関数を呼び出すようにするにはどうすればよいですかread

私は次のことを考えていました。

read fct1 "aha aha ahaaaaa"

出力は次のとおりです。

"I say aha aha ahaaaaa" "I repeat" "I saaaaaaaaay aha aha ahaaaaa"

デフォルトでは、入力をread変数に保存せずに代わりにコマンドとして使用するにはどうすればよいですか?

ありがとうございます。

ベストアンサー1

メッセージをstdinから行(ターミナルでスクリプトを使用するときにユーザーが入力する)として読み取って関数に引数として渡すには、次のようにします。

fct1 "$(line)"

lineもはや標準コマンドではありませんが、まだかなり一般的です。で置き換えることができますが、head -n1一部の実装では、入力が端末デバイスから出ていないときに1行以上を読み取ることができます(1行だけ出力します)。

bash'sを使用するときは、read変数に保存する必要があります。これがread入力を変数に保存する目的です。

IFS= read -r line && fct1 "$line"

zsh' を使用すると、次のオプションをread使用できます。-eエコデータは変数に保存されずに読み取られるため、line上記の内容は次のように作成できますIFS= read -re

fct1 "$(IFS= read -re)"

(zshが出力をread読み取ることができるようにプロセスをフォークする必要があるため、これは変数を使用するよりも効率的ではありません。)read

もちろん、次のものを交換することもできます。

local msg1=${@}

そして

local msg1; IFS= read -r msg1 || return

おすすめ記事