スクリプトはエコーラインを読み取る必要があります。

スクリプトはエコーラインを読み取る必要があります。

したがって、私のスクリプトが標準出力にエコーされるこの行で動作する必要があるBourne-shellスクリプトを作成する必要があります。たとえば、次のようになります。

echo *something* | myscript.sh [parametres...] 

これはおそらく私が学習過程で見落としたかもしれない基本的なものです。私の試みを含めますが、解決策とは離れています。とにかくどんなアドバイスにも感謝します。

答え1

ここで注意すべき重要な点は、子が親のSTDIN / STDOUT / STDERRファイル記述子を継承することです。つまり、他のプロセス(例と同じパイプ)のSTDOUTに接続されているSTDINを使用してスクリプトを起動すると、スクリプトが開始するすべての項目のSTDINも他のプロセスの同じSTDOUTに接続されます。

echo foo | ./myscript.shどこかでこれを行う場合の意味は次のとおりですmyscript.sh

#!/bin/bash
sed -e 's/foo/bar/'

次にSTDOUTsedで読み書きecho fooします(起動時にリダイレクトされないため、TTYに接続されますmyscript.sh)。
例:

$ echo foobar | ./myscript.sh
barbar

 

したがって、使用方法は実行する操作によって異なります。入力を変数としてキャプチャする場合は、組み込みread関数を使用してこれを実行できます。
たとえば、

#!/bin/bash
IFS= read -rd '' foo
echo "foo=<$foo>"

結果:

$ echo -e 'hello\nworld' | ./myscript.sh
foo=<hello
world>

答え2

echo " foo bar " | {
# ...
IFS= read -r line
echo "$line"
}

答え3

パイプの左側の標準出力は、パイプの右側の標準入力に接続されます。あなたの例では、の出力がのecho入力になりますmyscript.sh

echo出力全体を変数に保存するには、コマンド置換を使用できますcat

whole_input=$(cat)

これにより、入力の末尾から改行文字が削除されます。

read一度に 1 行ずつ読みたい場合は、組み込み機能を使用することもできます。一般はread行をフィールドに分割し、バックスラッシュ連続を使用して追加の複雑さなしに行を読み取りますIFS= read -r

IFS= read -r first_line
IFS= read -r second_line

関連情報