한 명령의 출력을 다른 스크립트로 파이프하고 싶습니다. 다른 스크립트에서는 입력이 비어 있는지 또는 공백만 포함되어 있는지 확인하고 싶습니다. 그런거라면 무시하겠습니다. 그렇지 않으면 모든 입력이 여러 추가 명령으로 전달되기를 원합니다.
더 명확하게 하기 위해 다음 과 같은 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