이미 작성된 스크립트에 여러 줄을 하나씩 전달해 보세요(한 줄에 3개 항목, 공백으로 구분).

이미 작성된 스크립트에 여러 줄을 하나씩 전달해 보세요(한 줄에 3개 항목, 공백으로 구분).

3가지 질문을 하나씩 묻는 스크립트가 있습니다. 이 스크립트를 다시 작성할 필요 없이 일괄적으로 실행할 수 있는 방법이 필요합니다. 실행 시 스크립트는 다음과 같습니다.

./test.pl
question a   and I answer with item1
question b   and I answer with item2
question c   and I answer with item3

그런 다음 3개 필드를 채우는 스크립트를 실행합니다.

이제 실행하려는 파일이 생겼습니다. 각 줄에는 3개의 필드가 있습니다. 각 줄을 읽고 각 줄에 대해 해당 줄의 3개 항목을 하나씩 실행한 후 다음 줄로 계속 진행하려면 스크립트가 필요합니다.

파일은 공백으로 구분됩니다. 파일은 다음과 같습니다

item1 item2 item3

item1 item2 item3

답변1

cat file.txt | while read L ; do
    L=($L)
    ./test.pl << EOF
    ${L[0]}
    ${L[1]}
    ${L[2]}
    EOF
done

답변2

쉘이 배열을 지원하는 경우 쉘 루프를 사용하여 각 줄에서 공백으로 구분된 항목을 배열로 읽은 다음 개행 문자를 사용하여 프로그램의 표준 입력으로 인쇄할 수 있습니다. 예를 들어, 대화형 테스트 스크립트가 주어지면 (이것은 귀하의 스크립트로 대체됩니다 test.pl)

$ cat test.sh
#!/bin/bash

read -p "Item 1: " item1
read -p "Item 2: " item2
read -p "Item 3: " item3

printf "Items: %s, %s, %s\n" "$item1" "$item2" "$item3"

응답 파일 포함

$ cat answers
egg sausage bacon
egg bacon spam
spam spam spam

그런 다음 사용bash

while read -r -a items; do printf '%s\n' "${items[@]}" | ./test.sh; done < answers
Items: egg, sausage, bacon
Items: egg, bacon, spam
Items: spam, spam, spam

(여기서 비결은 인수 목록이 소진될 때까지 printf단일 %s\n형식을 재사용하는 것이므로 항목 수를 명시적으로 지정할 필요가 없습니다.) 이점은 while read ...단순히 다음과 같이 변경하여 다른 구분 기호로 일반화할 수 있다는 것입니다.while IFS=, read ...

귀하의 경우 파일에 공백으로 구분된 항목이 있으므로 쉘이 분할+glob을 적용하는 것을 막을 이유가 없으므로 배열을 피하고 전체 줄을 읽고 전달할 수 있습니다.연합 국가견적 printf:

while read -r line; do printf '%s\n' $line | ./test.sh; done < answers
Items: egg, sausage, bacon
Items: egg, bacon, spam
Items: spam, spam, spam

관련 정보