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