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