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

fordoおよび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で1行に1行ずつ配列要素を印刷するには、次のようにします。

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リストを出力する機能が組み込まれていません。これは、外部コマンドに渡される引数のサイズ制限にすばやく到達するためです。

関連情報