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