スクリプトでこの関数を定義するとします。
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