Bash 스크립트에서 bash 배열을 반복하여 바이너리 파일을 입력합니다.

Bash 스크립트에서 bash 배열을 반복하여 바이너리 파일을 입력합니다.

나는 bash를 실행 중입니다.

  • mybinary대화형 사용자 입력을 허용하는 바이너리가 있다고 가정해 보겠습니다 .
  • mybinary사용자가 입력 q하고 누를 때까지 Enter( "종료"를 의미) 참석자 이름이 입력으로 사용된다고 가정합니다 q.
  • <<EOF/surrounding the input 을 사용하여 bash 스크립트에서 입력 프로세스를 자동화할 수 있습니다 EOF. 예를 들어 배열에서 미리 정의된 사용자 입력을 입력하고 싶다고 가정해 보겠습니다 myarray. 저 할 수 있어요:
#!/bin/bash

myarray=("Alice" "Bob" "Charlie" "q") # q quits the binary

mybinary -f inputfile.txt -o outputfile.txt<<EOF
${myarray[0]}
${myarray[1]}
${myarray[2]}
${myarray[3]}
EOF

위의 내용을 테스트했는데 작동합니다. 그러나 수백 개의 (문자열) 요소가 있는 경우 ${myarray[X]}각 인덱스를 입력하는 것은 힘든 작업입니다.myarraymyarray

위의 bash 스크립트를 반복하여 수정하려면 어떻게 해야 합니까 myarray?

for, dodone부분이 입력으로 처리되므로 다음은 작동하지 않습니다 mybinary.

#!/bin/bash

myarray=("Alice" "Bob" "Charlie" "q") # q quits the binary

mybinary -f inputfile.txt -o outputfile.txt<<EOF
for element in "${myarray[@]}"
do
${myarray[0]}
${myarray[1]}
${myarray[2]}
${myarray[3]}
done
EOF

게다가 단순히 for루프를 배치할 수도 없습니다에 대한mybinary여러 번 전화하고 싶지 않기 때문에 전화하십시오 mybinary.그렇다면 배열의 요소를 입력으로 사용하기 위해 배열을 반복하려면 어떻게 해야 합니까 mybinary?

답변1

printf배열의 각 항목 뒤에 개행 문자를 추가 할 수 있습니다 .

myarray=("Alice" "Bob" "Charlie" "q")

mybinary -f inputfile.txt -o outputfile.txt<<EOF
$(printf '%s\n' "${myarray[@]}")
EOF

didal24와 Steeldriver가 지적했듯이 여기에 설명된 대로 파이프를 대신 사용할 수도 있습니다.

printf '%s\n' "${myarray[@]}" | mybinary -f inputfile.txt -o outputfile.txt

답변2

귀하의 요구 사항을 잘 이해하는 경우:

#!/bin/bash

myarray=("Alice" "Bob" "Charlie" "q") # q quits the binary

mybinary -f inputfile.txt -o outputfile.txt < <(printf '%s\n' "${myarray[@]}")

바이너리가 잘 인코딩된 경우 STDIN투명하게 처리되어야 합니다.

답변3

zsh에서 한 줄에 한 줄씩 배열 요소를 인쇄하려면 다음을 수행할 수 있습니다.

print -rC1 -- "$array[@]"

또는:

print -rNC1 -- "$array[@]"

행 대신 NUL로 구분된 레코드에 사용됩니다.

( print -rC1 -- $array비어 있지 않은 요소만 인쇄됩니다).

bash내장 기능(원래 ksh에서 유래)이 있지만 print선택적으로 로드 가능한 내장 기능일 뿐이며 -C해당 옵션은 지원되지 않습니다(지원되지도 않습니다 -N).

printf '%s\n' "${array[@]}"아무 줄도 인쇄하지 않는 대신 (배열에 빈 요소가 있는 것처럼) 빈 줄을 인쇄하기 때문에 빈 배열에서는 올바르게 작동하지 않습니다.

Bash(또는 일반적으로 POSIX 쉘)의 일반적인 접근 방식은 몇 가지 도우미 기능을 정의하는 것입니다.

println() { [ "$#" -eq 0 ] || printf '%s\n' "$@"; }
print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }

그런 다음 다음을 수행할 수 있습니다.

println "${array[@]}" q | your-cmd

¹ 일부 POSIX 셸(주로 ksh88 및 일부 pdksh 기반 셸)에는 printf큰 목록을 출력하는 기능이 내장되어 있지 않습니다. 외부 명령에 전달되는 인수 크기 제한에 빠르게 도달하게 되기 때문입니다.

관련 정보