はじめに
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入門 2-3]: