[アルゴリズム] バブルソート(shell編)

2016年12月19日

Shell テクノロジー プログラミング 特集

バブルソート第4回はサーバーのお供である「shell」で実行してみたいと思います。 Shellって、バッチ処理をする言語や、サーバーコマンドの寄せ集めのスクリプトというレベルに考えている人が多くないですか? 実はそこらのスクリプト言語並みになかなかのパフォーマンスを出すことの出来る強力な言語でもあるので、是非苦手な人や知らなかった人も、仕事の活用はもちろんですが、サーバー言語として習得してみることをオススメします。

ソースコード

#/bin/sh function bubbleSort(){ arr=($@) while [ 1 -eq 1 ]; do cnt=0 for((i=0; i <${#arr[@]}-1; i++)){ num1=${arr[@]:$i:1} num2=${arr[@]:($i+1):1} if [ $num1 -gt $num2 ]; then arr[$i]=$num2 arr[$i+1]=$num1 cnt=`expr $cnt+1|bc -l` fi } if [ $cnt -eq 0 ]; then break fi done for i in ${arr[@]}; do echo $i done } numbers=("10 2 12 7 16 8 13") res=`bubbleSort $numbers` echo ${res}

解説

基本構成は、過去記事と同じ内容なのですが、shell言語特有の配列の扱いだったり、if文、for文の書き方などがあるので、下記注意ポイントを押さえておきましょう。

関数

汎用性を重要視して関数にしてますgあ、shellの関数は、スコープの概念が薄く、ローカル変数とグローバル変数が入り混じってしまうので、変数名に注意して使用しましょう。

配列は文字列でセット

配列に数値型でセットできるんですが、想定外のエラーが出て面倒くさかったので、文字列で対応してみました。 numbers=("10 2 12 7 16 8 13")

関数の返り値

shellの関数はreturnを使わず、echoを使って行います。 そもそも受け渡す時も、argvっぽく行うので、この感覚慣れないと少し扱いづらいですね。 今回は、2回めのfor文を使ってecho処理を行なっています。

for文

shellのfor文は何パターンも書き方があって、慣れないと少し使いづらいので、今回はわざと2パターンの書き方をしています。 初回は、他の言語っぽく書いたので分かりやすいですが、2回めの方はshellでは一般的な書き方です。 そういやこの2パターンはjavascriptにも似てますね。

計算式

shellの内部は型の扱いが難しく僕は基本的に文字列で扱うようにしています。 そこで困るのが数値として式を実行する際は以下のように行なってます。 cnt=`expr $cnt+1|bc -l` shellの特徴としては、コンソールコマンドがそのまま言語内で利用できるので、便利に感じる人は多いのではないでしょうか?

if文

数値の比較がperlっぽい感じなので、不慣れな人は、下記ページを参考にしてください。 [プログラム学習] Shell #3 「if文」

結果

$ sh bubble_sort.sh 2 7 8 10 12 13 16

まとめ

shellはコンソールコマンドを使えるので"sort"コマンドを使えば簡単にソート処理はできるんですけどね。 とりあえず自分で位置からソースコードを書いてみるという企画・・・案外勉強になりますね。

アルゴリズム過去記事

いろいろなプログラム言語でアルゴリズム学習