正の整数が格納された配列があり、その最小値を求めることを考えます。まずawk厨のわたしとしては、awkを利用する方法が思いつきます。
numbers=(34 65 112 98 11)
echo ${numbers[@]} | awk '{
min = $1
for(i = 2; i <= NF; i++) min = $i < min ? $i : min;
print min
}'
#=> 11
この書き方のよいところは「配列を先頭からなめていき、最小値を見つけるたびに更新する」という処理の中身が見えやすいところでしょうか。フローの見えやすさは応用のしやすさにもつながります。ただしやや冗長なのは欠点でしょう。
次にsort
コマンドを利用する場合は以下のようになります。
numbers=(34 65 112 98 11)
for number in ${numbers[@]}; do
echo $number
done | sort -n | head -n 1
# => 11
空白区切りの数字を改行区切りに並び替えたあと、昇順に並び替え、最後にその先頭だけを取り出しています。最初の例に比べるとシェルスクリプト感はぐっと強くなりますが、冗長さはあまり変わっていません。awkに依存しないため、awkを可能な限り避けたい人にはお勧めです。
なお上記の例において「空白区切りの数字を改行区切りに並べ替え」る処理をawkに担わせることもできます。
numbers=(34 65 112 98 11)
echo ${numbers[@]} | awk '{while(++i <= NF) print $i;}' | sort -n | head -n 1
#=> 11
可読性はかなり悪くなりますが、全体としてはかなり短くなります。一行野郎も満足できるはず(´・ω・`)