나는 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]}
각 인덱스를 입력하는 것은 힘든 작업입니다.myarray
myarray
위의 bash 스크립트를 반복하여 수정하려면 어떻게 해야 합니까 myarray
?
for
, do
및 done
부분이 입력으로 처리되므로 다음은 작동하지 않습니다 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
큰 목록을 출력하는 기능이 내장되어 있지 않습니다. 외부 명령에 전달되는 인수 크기 제한에 빠르게 도달하게 되기 때문입니다.