討論
seq
Jiaaroが提案したように、使用は問題ありません。Pax Diablo は、サブプロセスの呼び出しを回避するために Bash ループを提案しました。これには、$END が大きすぎる場合によりメモリに優しくなるという追加の利点があります。Zathrus は、ループの実装に典型的なバグを発見し、sincei
はテキスト変数であるため、数値との間の連続的な変換が実行され、関連するスローダウンが発生することをほのめかしました。
整数演算
これは Bash ループの改良版です。
typeset -i i END
let END=5 i=1
while ((i<=END)); do
echo $i
…
let i++
done
必要なものが のみである場合、 とecho
書くことができますecho $((i++))
。
ephemientは私に何かを教えてくれました: Bash はfor ((expr;expr;expr))
コンストラクトを許可します。私は Bash のマニュアル ページ全体を読んだことがないので (Korn シェル ( ksh
) のマニュアル ページで読んだことがありますが、それはずっと前のことです)、それを見逃していました。
そう、
typeset -i i END # Let's be explicit
for ((i=1;i<=END;++i)); do echo $i; done
おそらく「最速」ではありませんが、最もメモリ効率の高い方法のようです ( の出力を消費するためにメモリを割り当てる必要はありませんseq
。これは END が非常に大きい場合に問題になる可能性があります)。
最初の質問
eschercycle は、{ a .. b } Bash 表記がリテラルでのみ機能することを指摘しました。true、Bash マニュアルに従って。fork()
なしで単一の(内部)でこの障害を克服できます( fork + exec が必要な別のイメージであるexec()
を呼び出す場合と同様):seq
for i in $(eval echo "{1..$END}"); do
eval
とはどちらecho
も Bash 組み込みfork()
ですが、コマンド置換 ($(…)
コンストラクト) には a が必要です。