Linux入門 2-2 数値計算

# はじめに
Linux初学者である自分向け用の記事です。[Udemyの動画講座]を参考にしました。
僕の勉強法は`動画を見る`→`実際に動かしてみる`→`問題演習`という流れです。

前回まで：[Linux入門 2-1]

***
#### 2. シェルスクリプト(問題、テスト、演習、発展問題)
##### 2-5. 数値計算
```
[test@... basic]$ cat base9.sh
#!/bin/bash
echo 1 + 1
echo $(( 1 + 1 ))
echo $(( 10 / 6 ))
echo -------------
num1=10
num2=20
echo $(( num1 + num2 ))


[test@... basic]$ ./base9.sh 
1 + 1
2
1
-------------
30
```
割り算に関してはint型で処理されるため、小数点以下は表示されない。
変数を使うときは`$`を使わない。（つまり、以下のようにしないこと）

```
#!/bin/bash
num1=1
num=2
echo $(( $num1 + $num2 ))
```

##### 2-6. 関数
なお、小数点以下の計算にはbcコマンドをインストールする必要がある。
bcコマンドは、小雨数店以下の数値を扱うだけでなく、四則演算・平方根・三角関数などさまざまな関数の計算を実施できる。

```
//rootユーザーにてインストールを実施
[root@ ~]# yum install bc
Loaded plugins: fastestmirror, ovl
...
```
以下にて、関数などを使用した計算を実施する。
ファイルの権限だが、`.sh`ファイルを実施できるように実行権限を付与する。

```
//変更前
[test@d45c56c52f45 basic]$ ls -la
-rw-rw-r-- 1 test test   31 Nov 20 07:24 base10.sh
//変更後
[test@d45c56c52f45 basic]$ chmod 755 base10.sh 
[test@d45c56c52f45 basic]$ ls -la
-rwxr-xr-x 1 test test   31 Nov 20 07:24 base10.sh
```
ファイルの中身と実行結果

```
[test@ basic]$ cat base10.sh 
#!/bin/bash
echo "20.5+5" | bc
echo "scale=10;2/3" | bc -l
echo "scale=5;sqrt(18/2)" | bc -l

[test@ basic]$ ./base10.sh 
25.5
.6666666666
3.00000
```
bcコマンドを使いたいときは、`echo "20.5+5" | bc`のように`|`でつないで実行したいコマンドを記載すればよい。
ちなみに、`|`は標準出力の結果を右のコマンドに渡すの意味。

##### 2-7. Case文、ループ文(for, while, until)
###### case
case文とは、ある変数の値を評価して、値に応じて処理を変える。
ex1)

```
ファイルの中身
[test@ basic]$ ./base11.sh red
STOP
[test@ basic]$ cat base11.sh 
#!/bin/bash
var=$1
case $var in
  'blue')
    echo 'GO';;
  'red')
    echo 'STOP';;
  'yellow')
    echo 'waiting...';;
esac
```
```
実行結果
[test@d45c56c52f45 basic]$ ./base11.sh red
STOP
[test@d45c56c52f45 basic]$ ./base11.sh yellow
waiting...
```
ex2)

```
ファイルの中身
[test@d45c56c52f45 basic]$ cat base11b.sh 
#!/bin/bash
var=$1
case $var in
  [a-z])
    echo 'a-z';;
  [A-Z])
    echo 'A-Z';;
  [0-9])
    echo '0-9';;
esac
```
```
実行結果
[test@ basic]$ ./base11b.sh S
A-Z
[test@ basic]$ ./base11b.sh m
a-z
[test@ basic]$ ./base11b.sh 2
0-9
```
###### while
ex)文字の場合

```
ファイルの中身
[test@ basic]$ cat base12.sh 
#!/bin/bash
#while
read -p 'input : ' var
while [ $var != 'exit' ];
do
  echo 'input_is_' $var
  echo 'Please Write exit'
  read -p 'input : ' var
done
```
```
実行結果
[test@ basic]$ ./base12.sh 
input : udemy
input_is_ udemy
Please Write exit
input : aaa
input_is_ aaa
Please Write exit
input : exit
```
ex)数値の場合

```
ファイルの中身
[test@ basic]$ cat base12-i.sh 
#!/bin/bash
#while int
n=0
while (( $n < 5 ));
do
  echo $n
  echo 'Please wait seconds...'
  sleep 1
  n=$(( n + 1 ))
done
exit 0
```
```
実行結果
[test@ basic]$ ./base12-i.sh 
0
Please wait seconds...
1
Please wait seconds...
2
Please wait seconds...
3
Please wait seconds...
4
Please wait seconds...
```
数値でwhile文を使うときは`while (( $n < 5 ));`と記述する。
sleep関数を入れると、出力まで時間をdelayすることができる。
###### break

```
ファイルの中身
[test@ basic]$ cat base12-b.sh 
#!/bin/bash
#while int
n=0
while (( $n < 5 ));
do
  echo $n
  echo 'Please wait seconds...'
  sleep 1
  if [ $n -eq 2 ];
  then
    break
  fi
  n=$(( n + 1 ))
done
exit 0
```
```
実行結果
[test@ basic]$ ./base12-b.sh 
0
Please wait seconds...
1
Please wait seconds...
2
Please wait seconds...
```
###### continue

```
ファイルの中身
[test@ basic]$ cat base12-b.sh 
#!/bin/bash
#while int
n=0
while (( $n < 5 ));
do
  echo $n
  echo 'Please wait seconds...'
  sleep 1
  if [ $n -eq 2 ];
  then
    continue
  fi
  n=$(( n + 1 ))
done
exit 0
```
```
実行結果
[test@ basic]$ ./base12-b.sh 
0
Please wait seconds...
1
Please wait seconds...
2
Please wait seconds...
2
Please wait seconds...
2
Please wait seconds...
2
Please wait seconds...
2
Please wait seconds...
^C
```
###### ファイルからの読み込み
読み込み用のファイルを作成

```
[test@ basic]$ cat sample.txt 
1
2
3
4
5
```
```
ファイルの中身
[test@ basic]$ cat base13.sh 
#!/bin/bash
cat 'sample.txt' | while read txt;
do
  echo $txt
  sleep 0.5
done
exit 0
```
```
実行結果
[test@ basic]$ ./base13.sh 
1
2
3
4
5
```
###### for文
2つ飛ばしでカウントしていく場合。

```
ファイルの中身
[test@ basic]$ cat base14.sh 
#!/bin/bash
for i in `seq 1 2 10`
do
  echo $i
  sleep 0.5
done
```
```
実行結果
[test@ basic]$ ./base14.sh 
1
3
5
7
9
```

コマンドを実行する場合。

```
ファイルの中身
[test@d45c56c52f45 basic]$ cat base14c.sh 
#!/bin/bash
for cmd in ls pwd date
do
  echo $cmd
  $cmd
done
```
```
実行結果
[test@ basic]$ ./base14c.sh 
ls
base10.sh  base11b.sh	base12-i.sh  base13.sh	base14c.sh  sample.txt
base11.sh  base12-b.sh	base12.sh    base14.sh	base9.sh
pwd
/home/test/basic
date
Sat Nov 20 08:47:41 UTC 2021
```
###### ShellScriptのテスト2
Q1)数値の計算結果を変数に格納するさいの記載方法を次の中から選択してください
A1)

```
var=$(( 1 + 1 ))
```
計算結果を表すには$(( 計算 ))、もしくは$(expr 計算)です。

Q2)bcを用いた浮動小数点の計算方法について正しいものを選択してください
A2)

```
echo '1 + 1.5' | bc
```
bcの場合echoで標準出力の計算式を受け取ることで計算を実行します

Q3)case文の記載方法で正しいものを選択してください
A3)

```
var=$1
case $var in
  'blue')
    echo 'GO';;
esac 
```
case文の正しい記載方法です

Q4)while (( $var < 10 ))のとき、varの値がどの値のときwhileの中の処理が実行されるでしょうか？
A4)
9

Q5)以下のスクリプトは何と表示されるでしょうか

```
#!/bin/bash
for i in `seq 1 10`
do
        if [ $i -eq 3 ];
        then
                continue
        elif [ $i -eq 8 ];
        then
                break
        fi
        echo $i
done 
```
A5)

```
1
2
4
5
6
7
```
3がcontinue飛ばされ、8でループを抜けるため、1 2 4 5 6 7が表示されます
###### 演習問題
Q)Fizz Buzz問題
・1-100までループする
・数値が3の倍数のときは数値：Fizzと表示
・数値が5の倍数のときは数値：Buzzと表示
・数値が15の倍数のときは数値：FizzBuzzと表示
・上の条件を満たさないときは数値のみを表示
・forを利用して作成する。
A)

```
[test@d45c56c52f45 3]$ cat for.sh 
#!/bin/bash
for i in `seq 1 1 100`;
do
  if [ $(( i % 3 )) -eq 0 ] && [ $(( i % 5 )) -eq 0 ];
  then
    echo $i 'FizzBuzz'
  elif [ $(( i % 3 )) -eq 0 ];
  then
    echo $i 'Fizz'
  elif [ $(( i % 5 )) -eq 0 ];
  then
    echo $i 'FizzBuzz'
  else
    echo $i
  fi
done
exit 0
```
###### select文

```
ファイルの中身
[test@ basic]$ cat base15.sh 
#!/bin/bash
select var in apple banana lemon exit
do
  if [ -z $var ];
  then
    continue
  fi
  echo $var
  if [ $var = 'exit' ];
  then
    break
  fi
done
echo 'select end'
```
```
実行結果
[test@ basic]$ ./base15.sh 
1) apple
2) banana
3) lemon
4) exit
#? 3
lemon
#? 4
exit
select end
```

*To Be Continued...*
[Linux入門 2-3]
***
[](参照ソース)
[Linux Professional Institute公式HP]:https://www.lpi.org/ja/our-certifications/lpic-1-overview
[Udemy]:https://udemy.benesse.co.jp/career/workstyle/lpic-interview-company.html
[Udemyの動画講座]:https://www.udemy.com/course/linuxlpic/?utm_source=bene-content-marketing&utm_campaign=normal&utm_content=story&utm_term=career&utm_medium=udemyads
[Linux入門 2-1]:https://qiita.com/hoglet/items/7499f91e7ab9e99ce006
[Linux入門 2-3]: