공백으로 파이프된 입력을 확인하고 전달합니다.

공백으로 파이프된 입력을 확인하고 전달합니다.

한 명령의 출력을 다른 스크립트로 파이프하고 싶습니다. 다른 스크립트에서는 입력이 비어 있는지 또는 공백만 포함되어 있는지 확인하고 싶습니다. 그런거라면 무시하겠습니다. 그렇지 않으면 모든 입력이 여러 추가 명령으로 전달되기를 원합니다.

더 명확하게 하기 위해 다음 과 같은 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

관련 정보