スペースでパイプされた入力を確認して渡します。

スペースでパイプされた入力を確認して渡します。

あるコマンドの出力を別のスクリプトにパイプしたいと思います。他のスクリプトでは、入力が空か空白のみが含まれているかどうかを確認したいと思います。それなら無視します。それ以外の場合は、すべての入力が複数の追加コマンドに渡されることを望みます。

より明確にするために、次のcat input.txt | ./script.shコマンドを実行します。input.txt

line 1
line 2
line 3

現在はscript.sh次のとおりです。

read input_text

if [ -z "$input_text" ]
    # ignore emtpy input
    then exit 0
else
    # do something here with the input
fi

問題は、この場合、入力「Line 1」の最初の行が変数として読み込まれるinput_textため、残りの入力(2行と3行のみで構成されています)と一緒に後ろのコードに渡されないことですelse

だからまず、入力にスペース以上の内容が含まれていることを確認してから、どうすればよいですか。フル入力転送別のコマンドで?

答え1

これは、空白ではなく文字を見るとすぐに入力を渡したいという意味です。

awk -v cmd='otherCommand' '
  forward {print | cmd; next}
  {initial_output = initial_output $0 "\n"}
  NF {printf "%s", initial_output | cmd; forward = 1}'

例:

$ printf '%b\n' ' ' '' '\t' | awk -v cmd='echo START; sed "s/.*/<&>/"' '
  forward {print | cmd; next}
  {initial_output = initial_output $0 "\n"}
  NF {printf "%s", initial_output | cmd; forward = 1}'
$ printf '%b\n' ' ' '' '\t' something | awk -v cmd='echo START; sed "s/.*/<&>/"' '
  forward {print | cmd; next}
  {initial_output = initial_output $0 "\n"}
  NF {printf "%s", initial_output | cmd; forward = 1}'
START
< >
<>
<       >
<something>

答え2

#!/bin/sh
{   tee /dev/fd/3 <&4&:|
    grep -q '[^[:space:]]' &&
    cat - /dev/fd/4 <&3
}   3<<"" 4<&0 | another_few_commands

# cause i dont know how else to end this with a blank line

答え3

ループを使うのはどうですか? (空行または空白のみの行で終わります)

#!/bin/sh
while read input_text; do
  [ -z "$input_text" ] && break
  # do something with the non-blank input
done
exit 0

関連情報