出力を使用せずに出力行数をシェルスクリプトの変数に保存する

出力を使用せずに出力行数をシェルスクリプトの変数に保存する

他の呼び出しによって出力された数値に基づいて行を出力するifステートメントを持つシェルスクリプトがあります。 (私の場合、何かをすると1行以上の出力が発生しました。)

LINES=$(function_call | wc -l)
if [ "$LINES" -gt 1 ]
  then
    do_stuff
fi

しかし、私が望むのは、出力を消費するのではなく(つまり、まだ標準出力に表示されるようにすること)、スクリプトに同じことをすることです。

答え1

使用tee(システムサポート仮定/dev/fd/<n>):

{ 
  lines=$(function_call 3>&- | tee -a /dev/fd/3 | wc -l)
} 3>&1
if [ "$lines" -gt 1 ];  then
  do_stuff
fi

奇妙な実装を使用するLinuxでは、/dev/fd/<n>stdoutがファイルにリダイレクトされると出力が補間されます。最後にそのファイルのスクリプト内の stdout の現在の場所が終わりではありません (通常、stdout はほとんど配置されないため、これは重要ではありません)。~へ文書1つ)。

または、次のことができます。

{ 
  lines=$(function_call 3>&- | sed -ne 'w /dev/fd/3' -e '$=')
} 3>&1

または:

{ 
  lines=$(function_call 3>&- | awk '{print > "/dev/fd/3"}; END {print NR}')
} 3>&1

sed(orの実装によっては、最後の改行文字の後に追加のデータを出力するawkよりも1つ多くを提供できます。)wc -lfunction_call

関連情報