我想将一个命令的输出通过管道传输到另一个脚本。在另一个脚本中,我想检查输入是否为空或仅包含空格。如果是这样的话,我会忽略它。否则,我希望将所有输入转发到另外几个命令。
为了更清楚起见,我将运行类似的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
问题是,在这种情况下,输入“第 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