Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

シェルスクリプト言語で数式を計算する方法 – パートV

この連載もいよいよ最終回となりました。ここまで順を追って学んでこられた皆さんなら、シェルスクリプトの仕組みの理解も、必要に応じたスクリプト作成も、すっかり自由自在になっていることでしょう。最終回となる本稿では、スクリプト言語を使ってもう少し複雑な数学的操作を実現する方法をご紹介します。

シェルスクリプト言語で数式を計算する方法 – パートV

これまでの連載記事は以下の通りです。まだお読みでない方は、あわせてご覧ください。

  1. Linuxシェルスクリプト入門:基本のコツを理解する – パートI
  2. Linux初心者向けシェルプログラミング学習に役立つ5つのスクリプト – パートII
  3. Linux BASHスクリプティングの世界を巡る旅 – パートIII
  4. Linuxシェルプログラミングにおける数学的処理の基礎 – パートIV

まずはフィボナッチ数列から

フィボナッチ数列とは、「各項が直前の2項の和になる」という規則性を持つ数列です。0112358……と続いていきます。定義上、この数列の最初の2つの数は必ず0と1になります。

スクリプト1:Fibonacci.sh

#!/bin/bash
echo "How many numbers do you want of Fibonacci series ?"
read total
x=0
y=1
i=2
echo "Fibonacci Series up to $total terms :: "
echo "$x"
echo "$y"
while [ $i -lt $total ]
do
    i=`expr $i + 1`
    z=`expr $x + $y`
    echo "$z"
    x=$y
    y=$z
done

実行例

[admin@wsxdn.com ~]# chmod 755 Fibonacci.sh
[admin@wsxdn.com ~]# ./Fibonacci.sh

How many numbers do you want of Fibonacci series ?
10
Fibonacci Series up to 10 terms ::
0
1
1
2
3
5
8
13
21
34

このスクリプトでは、表示したい項数をユーザーに入力してもらい、whileループ内で直前の2つの変数(x と y)の合計を新しい値 z として算出し、順次出力していきます。変数の受け渡しを繰り返すことで、フィボナッチ数列が生成される仕組みです。

ダウンロード:Fibonacci.sh

10進数から2進数への変換

コンピュータが理解できるのはバイナリ(2進数)形式、すなわち「0」と「1」だけであることはよく知られています。多くの方が学んだ経験があるであろう10進数から2進数への変換も、簡単なスクリプトを書けば自動化できます。

スクリプト2:Decimal2Binary.sh

#!/bin/bash

for ((i=32;i>=0;i--)); do
    r=$(( 2**$i))
    Probability+=( $r )
done

[[ $# -eq 0 ]] && echo -en "Decimal\t\tBinary\n"
for input_int in "$@"; do
s=0
test ${#input_int} -gt 11 && printf "%-10s\t" "$input_int"

    for n in ${Probability[@]}; do

        if [[ $input_int -lt ${n} ]]; then
            [[ $s = 1 ]] && printf "%d" 0
        else
            printf "%d" 1 ; s=1
            input_int=$(( $input_int - ${n} ))
        fi
    done
echo -e
done

実行例

[admin@wsxdn.com ~]# chmod 755 Decimal2Binary.sh
[admin@wsxdn.com ~]# ./Decimal2Binary.sh 1121

Decimal		Binary 
1121      	10001100001

注:このスクリプトは実行時の引数として数値を受け取れるため、対話的な入力の手間が省けるのが便利なポイントです。

ダウンロード:Decimal2Binary.sh

bcコマンドで1行変換

実は、システムに標準搭載されている「bc」コマンドを使えば、たった1行で10進数を2進数に変換できます。ターミナルで以下のように実行してみてください。

[admin@wsxdn.com ~]# echo "obase=2; NUM" | bc

NUM」の部分を、変換したい10進数に置き換えてください。例えば121を変換すると次のようになります。

[admin@wsxdn.com ~]# echo "obase=2; 121" | bc

1111001

2進数から10進数への変換

今度は逆に、2進数の値を10進数へ変換するスクリプトを作成してみましょう。

スクリプト3:Binary2Decimal.sh

#!/bin/bash
echo "Enter a number :"
read Binary
if [ $Binary -eq 0 ]
then
    echo "Enter a valid number "
else
    Decimal=0
    power=1
    while [ $Binary -ne 0 ]
    do
        rem=$(expr $Binary % 10)
        Decimal=$((Decimal+(rem*power)))
        power=$((power*2))
        Binary=$(expr $Binary / 10)
    done
    echo " $Decimal"
fi

実行例

[admin@wsxdn.com ~]# chmod 755 Binary2Decimal.sh
[admin@wsxdn.com ~]# ./Binary2Decimal.sh

Enter a number :
11
3

このスクリプトは、入力された2進数を1桁ずつ取り出し(% 10)、その桁に対応する2のべき乗を掛けて合計することで、10進数の値を求めています。

注:同じ処理は、ターミナルで「bc」コマンドを使っても実行できます。

[admin@wsxdn.com ~]# echo "ibase=2; BINARY" | bc

BINARY」の部分を2進数に置き換えてください。例えば次のようになります。

[admin@wsxdn.com ~]# echo "ibase=2; 11010101" | bc

213

ダウンロード:Binary2Decimal.sh

その他の基数変換

同様の考え方で、8進数16進数10進数の相互変換も自分でスクリプト化できます。手軽に試すなら、やはり「bc」コマンドが便利です。代表的な組み合わせは以下の通りです。

10進数 → 8進数

[admin@wsxdn.com ~]# echo "obase=8; Decimal" | bc

10進数 → 16進数

[admin@wsxdn.com ~]# echo "obase=16; Decimal" | bc

8進数 → 10進数

[admin@wsxdn.com ~]# echo "ibase=8; Octal" | bc

16進数 → 10進数

[admin@wsxdn.com ~]# echo "ibase=16; Hexadecimal" | bc

2進数 → 8進数

[admin@wsxdn.com ~]# echo "ibase=2;obase=8; Binary" | bc

シェルスクリプトで使える主な数値比較テスト

最後に、シェルスクリプトで頻繁に使用される数値比較テストとその意味をまとめておきます。

テスト意味
INTEGER1 -eq INTEGER2INTEGER1 が INTEGER2 と等しい場合に真
INTEGER1 -ge INTEGER2INTEGER1 が INTEGER2 以上の場合に真
INTEGER1 -gt INTEGER2INTEGER1 が INTEGER2 より大きい場合に真
INTEGER1 -le INTEGER2INTEGER1 が INTEGER2 以下の場合に真
INTEGER1 -lt INTEGER2INTEGER1 が INTEGER2 未満の場合に真
INTEGER1 -ne INTEGER2INTEGER1 が INTEGER2 と等しくない場合に真

以上で、本稿そしてシェルスクリプトチュートリアルシリーズは完結です。ただし「シリーズ終了=今後スクリプト関連の記事がない」という意味ではありません。基礎編のチュートリアルがひとまず完了しただけで、今後も興味深いトピックや皆さんからの質問があれば、喜んでこのシリーズの続きをお届けしていく予定です。

どうぞ健康に気をつけて、Tecmintの更新をお楽しみに。近いうちに、また皆さんが楽しめる興味深いテーマでお会いしましょう。感想やご意見があれば、ぜひコメント欄でお聞かせください。

  1. Linuxでカスタムシェル関数とライブラリを作成・活用する方法

    Linuxにおいて、シェルスクリプトはシステム管理タスクの実行や自動化、簡単なコマンドラインツールの作成など、さまざまな場面で役立ちます。本記事では、Linux初心者の方に向けて、独自のシェルスクリプトを保存すべき信頼性の高い場所、カスタムシェル関数やライブラリの書き方、そして他のスクリプトからライブラリ内の関数を呼び出す方法について解説します。 シェルスクリプトの保存場所 スクリプトを実行するときに毎回フルパス(絶対パス)を入力せずに済むようにするには、そのスクリプトを $PATH 環境変数に含まれるいずれかのディレクトリに保存しておく必要があります。 現在の $PATH の内容は、以下のコ

  2. 実用的な5つの例で学ぶBashスクリプト入門チュートリアル

    Unix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。 シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。 ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。 一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この