스크립트는 에코 라인을 읽어야 합니다.

스크립트는 에코 라인을 읽어야 합니다.

따라서 내 스크립트가 표준 출력에 에코되는 이 줄과 함께 작동해야 하는 Bourne-shell 스크립트를 작성해야 합니다. 예를 들면 다음과 같습니다.

echo *something* | myscript.sh [parametres...] 

이것은 아마도 제가 학습 과정에서 간과했을 수도 있는 기본적인 것입니다. 내 시도를 포함시키겠지만 해결책과는 거리가 멀습니다. 어쨌든 어떤 조언이라도 감사하겠습니다.

답변1

여기서 주목해야 할 핵심 사항은 자식이 부모의 STDIN/STDOUT/STDERR 파일 설명자를 상속한다는 것입니다. 즉, 다른 프로세스(예제와 같은 파이프)의 STDOUT에 연결된 STDIN을 사용하여 스크립트를 시작하면 스크립트가 시작하는 모든 항목의 STDIN도 다른 프로세스의 동일한 STDOUT에 연결됩니다.

echo foo | ./myscript.sh어딘가에서 이 작업을 수행하는 경우의 의미는 다음과 같습니다 myscript.sh.

#!/bin/bash
sed -e 's/foo/bar/'

그런 다음 STDOUT sed에서 읽고 echo foo씁니다(시작 시 리디렉션되지 않으므로 TTY에 연결됨 myscript.sh).
예:

$ echo foobar | ./myscript.sh
barbar

 

따라서 사용 방법은 수행하려는 작업에 따라 다릅니다. 입력을 변수로 캡처하려는 경우 read내장 함수를 사용하여 이를 수행할 수 있습니다.
예를 들어:

#!/bin/bash
IFS= read -rd '' foo
echo "foo=<$foo>"

결과 :

$ echo -e 'hello\nworld' | ./myscript.sh
foo=<hello
world>

답변2

echo " foo bar " | {
# ...
IFS= read -r line
echo "$line"
}

답변3

파이프 왼쪽의 표준 출력은 파이프 오른쪽의 표준 입력에 연결됩니다. 귀하의 예에서는 의 출력이 echo의 입력이 됩니다 myscript.sh.

echo전체 출력을 변수에 저장하려면 명령 대체를 사용할 수 있습니다 cat.

whole_input=$(cat)

이렇게 하면 입력 끝에서 개행 문자가 제거됩니다.

read한 번에 한 행씩 읽으려면 내장 기능을 사용할 수도 있습니다. 일반은 read행을 필드로 분할하고 백슬래시 연속을 사용하여 추가 복잡성 없이 행을 읽습니다 IFS= read -r.

IFS= read -r first_line
IFS= read -r second_line

관련 정보