blog

数式を使ったLinuxシェルスクリプト言語

シェルスクリプトを理解し、必要なときにいつでも流暢に書けるようになると、とても気分がいいものです。この章では、スクリプト言語でより複雑な数学演算を行う方法を学びます。...

Jul 16, 2025 · 4 min. read
シェア

フィボナッチ数列から始めましょう。

フィボナッチ級数は黄金分割級数としても知られ、次のような級数を指します:0, 1, 1, 2, 3, 5, 8, 13, 21 ......各項は最初の2項の和であり、級数の最初の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

サンプル出力(コンピューティング)

[root@tecmint ~]# chmod 755 Fibonacci.sh
[root@tecmint ~]# ./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

Fibonacci.shダウンロード

#p#

ご存知のように、コンピュータは2進法、つまり0と1しか理解できないので、ほとんどの人は10進法と2進法の変換を学びたがります。この複雑な計算のために簡単なスクリプトを書くのはどうでしょうか?

スクリプト2:DecimalToBinary.sh

#!/bin/bash 
for ((i=32;i>=0;i--)); do 
 r=$(( 2**$i)) 
 Probablity+=( $r ) 
done 
[[ $# -eq 0 ]] &echo -en "Decimal\t\tBinary
" 
for input_int in $@; do 
s=0 
test ${#input_int} -gt 11 &printf "%-10s\t" "$input_int" 
 for n in ${Probablity[@]}; 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

サンプル出力(コンピューティング)

[root@tecmint ~]# chmod 755 Decimal2Binary.sh
[root@tecmint ~]# ./Decimal2Binary.sh 1121
Decimal		Binary 
1121 	

注:上記のスクリプトは実行時に入力を受け付けます。

DecimalToBinary.shダウンロード

実際、組み込みの "bc "コマンドは、簡単なコード行で10進数を2進数に変換します。以下のスクリプトを実行してください:

[root@tecmint ~]# echo "obase=2; NUM" | bc

NUMは変換したい10進数です。

[root@tecmint ~]# echo "obase=2; 121" | bc 

#p#

次に、上のスクリプトの逆、つまり2進数を10進数に変換するスクリプトを紹介します。

スクリプト 3: BinaryToDecimal.sh

#!/bin/bash 
echo "Enter a number :" 
read Binary 
if [ $Binary -eq 0 ] 
then 
echo "Enter a valid number " 
else 
while [ $Binary -ne 0 ] 
do 
Bnumber=$Binary 
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" 
done 
fi

サンプル出力(コンピューティング)

[root@tecmint ~]# chmod 755 Binary2Decimal.sh
[root@tecmint ~]# ./Binary2Decimal.sh
Enter a number : 
11 
3

注:上記の機能は、ターミナルで "bc "コマンドを使って以下のように実行することもできます。

[root@tecmint ~]# echo "ibase=2; BINARY" | bc

BINARYは変換したい2進数です。

[root@tecmint ~]# echo "ibase=2; 11010101" | bc 
312

BinaryToDecimal.shダウンロード

#p#

同様に、8進数や16進数から10進数への変換や、その逆の変換も自分で書くことができます。bc」コマンドでこれらの変換を行うコードは以下の通りです。

10進数から8進数

[root@tecmint ~]# echo "obase=8; Decimal" | bc

10進数から16進数

[root@tecmint ~]# echo "obase=16; Decimal" | bc

8進数から10進数

[root@tecmint ~]# echo "ibase=8; Octal" | bc

16進数から10進数

[root@tecmint ~]# echo "ibase=16; Hexadecimal" | bc

2進数から8進数

[root@tecmint ~]# echo "ibase=2;obase=8 Binary" | bc

#p#

シェル・スクリプト言語で一般的な値を以下に示します。

Test : INTEGER1 -eq INTEGER2
Meaning: INTEGER1 is equal to INTEGER2
Test : INTEGER1 -ge INTEGER2
Meaning: INTEGER1 is greater than or equal to INTEGER2
Test: INTEGER1 -gt INTEGER2
Meaning: INTEGER1 is greater than INTEGER2
Test:INTEGER1 -le INTEGER2
Meaning: INTEGER1 is less than or equal to INTEGER2
Test: INTEGER1 -lt INTEGER2
Meaning: INTEGER1 is less than INTEGER2
Test: INTEGER1 -ne INTEGER2
Meaning: INTEGER1 is not equal to INTEGER2

Read next