Linux入門 2-1 シェルスクリプトの基礎(/bin/bash)

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

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

***

#### 2. シェルスクリプト(問題、テスト、演習、発展問題)
サポートしているシェルを一覧表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/c90597df-74ec-556f-423d-2ee364a722e4.png)

ファイル作成（viコマンドで拡張子は.sh）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/b33c2546-4f60-237c-1c0b-2676d57e07c5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/bd1936aa-33f2-ceb7-33dd-162f913e8fe5.png)
実行(※とても重要！！設定を忘れない！)

    $ chmod 755 ファイル名 #パーミッション変更

シェルスクリプトの実行

    $ ./test.sh
##### 2-1. 変数の使い方
ex1)変数の基本
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/f05fbaa5-e7ef-551e-ce32-88e784ca136d.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/f03c9890-384c-5a8f-d3a0-27ef0bb5e16c.png)
ex2)コマンドの実行１
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/4d1b9ebd-b65c-514e-0358-d42b33b40705.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/3513e3a2-8723-e11b-19d1-ee085458ac3f.png)
ex3)コマンドの実行２
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/559b477c-578d-de4a-78bd-84f5b08c5b8a.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/345e4262-fde5-da15-5524-467e4885c162.png)
ex4)システム変数
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/fb225390-69e0-9f7c-7e8e-6e33fe82eacc.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/71a443b6-30da-49a5-9f10-fd2706d13ae3.png)
##### 2-2. 引数の使い方
引数・・・実行する際にシェルに渡す値

    ./test.sh a b #a,bが引数

ex1)base4_1.sh
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/c7b1a232-6b81-b16d-bf3b-90f403369aeb.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/4a133c39-dc6e-0a21-e4ca-668ad6118409.png)
ex2)base4_2.sh(ほかのbashファイルを実行する場合)
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/cd61dd82-4c72-2cd8-ebf8-9f1090a4378a.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/3d36a95c-2b7b-da8a-db66-71444e72446d.png)

##### 2-3. 配列の使い方
配列の作成

    fruits=('banana' 'apple' 'grape')

配列の表示方法

    # 配列の中身をすべて表示
    echo "${fruits[@]}"
    # インデックス0の要素を表示
    echo "${fruits[0]}"
    # インデックスを表示
    echo "${!fruits[@]}"
    # 配列の要素の数を表示
    echo "${#fruits[@]}"
    # 配列のインデックス3にlemonを追加
    fruits[3]='lemon'
    # 配列のインデックス2を削除
    unset fruits[2]
ex1)
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/bf1bae55-4dc3-b024-01fe-5104fff16971.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/decc37b2-ef58-dfed-93f1-4d65dd7c5b8c.png)

##### 2-4. 標準入出力、ファイル入出力
###### 標準入出力
標準入力： ターミナルからの値の読み取り
標準出力: ターミナルでの値の表示

    read var # 標準入力
    echo var1 = $var # 入力結果表示
    read var1 var2 var3 # 入力結果から3個変数を設定
    echo var1 = $var1, var2 = $var2, var3 = $var3
    read –p ‘var1 : ’ var1 # 文字付きの標準入力
    read –sp ‘password : ‘ password # シークレットモードでの標準入力
    read –a names # 配列(Array)入力

ex1)標準入力
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/45ea0273-518b-165e-ba20-9b4571f26580.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/0bee3cb0-214d-e80c-6873-cea4402864cb.png)
ex2)3個変数を設定
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/3bb934d2-713d-6d4a-9127-93f6937bee82.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/7ddaeea4-4ef6-46e6-971c-ab2d0f86bef3.png)
ex3)文字付きの標準入力
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/52c2efd4-1424-b854-b2f2-bf31437af0ac.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/acd22ea7-7217-a155-d28f-dee84ef52165.png)
ex4)シークレットモードでの標準入力
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/0830888a-91d8-b5c9-b689-0bd353442334.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/af3bba36-8439-d93f-e632-a1a5a8470075.png)
ex5)配列(Array)入力
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/af58718a-4ace-1f9c-1bcc-25df0b1e4c3e.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/1e55058e-5491-4960-14a7-bf0b76eb7a4a.png)
###### ファイル入出力

    >: 上書き
    echo ‘hello’ > test.txt # 現在いるディレクトリのhello.txtファイルを作成(上書き)してhelloを書き込む
    >>: 追記 # 現在いるディレクトリのtest.txtファイルを作成(追記)してhelloを書き込む

ex1)
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/3acce85d-ee9f-31f0-ef96-9c17ea53986b.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/09d1e536-b72c-b62f-64f0-44fb24444150.png)

##### 2-5. 制御文(if, case, switch)
if文の書き方(3通り)
① if test 条件文; ② if [ 条件文 ]; ③ if [[ 条件文 ]];
ex1)
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/2f8ebef3-f908-d653-671a-f8b2f49e958d.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/200a0215-0251-54d1-522e-0105246952d6.png)
ex2)
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/fd418750-c57f-6c6e-9ae3-e4fcaa83ab20.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/26c26e47-8597-220a-1a2d-841f6ded3c3b.png)
ex3)比較

    #文字列で等しいか等しくないか
    = != 
    # 数値比較
    -eq(=), -ne(!=), -lt(<), - le(≦), –gt(＞), –ge(≧)

ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/ee417de2-6d36-0ace-751f-0ad99ea67f65.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/ac8b4f15-ec31-7be1-81d0-b211b75b2ca2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/e1c4b53d-d564-e661-fe04-74b4c3f283be.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/0f15de24-5a45-3fcf-fe95-5ca48f709e1a.png)
ex4)条件文1 and 条件文2の場合、条件文1,条件文2を両方満たす場合に実行

    書き方は、以下の4通り
    if [ 条件文1 ] && [ 条件文2 ];
    if [ 条件文1 –a 条件文2 ];
    if [[ 条件文1 && 条件文2 ]];
    if test 条件文1 && test 条件文2;

ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/8e11a8f8-4339-6db3-0aa8-8034fb4ff042.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/0eb0c6e2-594f-b877-bc07-daa379f36872.png)

ex5)条件文1 or 条件文2の場合、条件文1,条件文2のどちらかを満たす場合に実行

    書き方は、以下の4通り
    if [ 条件文1 ] || [ 条件文2 ];
    if [ 条件文1 –o 条件文2 ];
    if [[ 条件文1 || 条件文2 ]];
    if test 条件文1 || test 条件文2;
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/aa0800c0-aaf8-679b-efc9-602f00cbdee5.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/afe6e230-d336-2a6f-8c74-b489d92ff916.png)
ex6)否定を表す条件文(3つ)

    if ! test 条件文、 if [ ! 条件文 ]、if [[ ! 条件文 ]]
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/b0d999ff-96d7-f2d1-aed0-d613ffcf9f9e.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/b6a324b4-83c3-e199-af87-5e8cbebe064a.png)

##### ex7)コマンド処理の条件文

    cmd1 && cmd2 #cmd1が正しく実行されたらcmd2を実行
    cmd1 || cmd2 #cmd1がエラーならcmd2を実行
    cmd1 && cmd2 || cmd3 #cmd1が正しく実行されたらcmd2が実行されて、cmd1がエラーならcmd3を実行
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/dd46bed6-bc20-227d-b9b5-79676aa1428b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/0f2900ec-a7b6-9947-dc58-729d1b77cac3.png)

##### ex8)ファイルの存在チェック

    if [ -e ファイル名 ]; #ファイルもしくはディレクトリの存在確認
    then
    else
    fi

    if [ -f ファイル名 ] #ファイルが存在しディレクトリでなくファイル
    if [ -d ファイル名 ] #ディレクトリが存在するか
    if [ -s ファイル名 ] #ディレクトリ or 中身のあるファイルか
    if [ -wファイル名 ] #書き込み権限あるか
    if [ -xファイル名 ] #実行権限あるか
    if [ fileA –nt fileB] #fileAがfileBより新しいか
    if [ fileA –ot fileB] #fileAがfileBより古いか
ファイルの中身
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/9e87b714-57be-df7e-c914-897422a0287d.png)
実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/3396e6d6-5807-6bea-2b17-adfcd29a0513.png)
#### 小テスト
小テスト1)
次のうちShellScriptで正常終了を表すものはどれでしょうか？

    exit 0

ShellScriptでは戻り値0が正常を意味します。また、シェルの終了にはexitを実行します。

小テスト2)
コマンドlsの結果を変数varに格納するにはどのように記載すればよいでしょうか？

    var=`ls`

変数にコマンド実行結果を格納するにはバッククォート(`)もしくは$(command)とします。

小テスト3)
ShellScriptで配列arrayの長さを表す書き方はどれでしょうか？

    ${#array[@]}

これが配列の長さを表します

小テスト4)
全引数を表す変数はどれでしょうか？

    $@

これは全引数を表す変数です

小テスト5)
標準入力でvarに値を設定するにはどのように記載すればいいでしょうか？

    read var

readコマンドを用いるとvarに標準入力で値を設定できます

小テスト6)
if文の書き方として正しいものを選んで下さい

    if [ condition ];
    then
    fi

[]を使用した正しいif文の書き方です。ifの後とcondition前後に空白を入れてください

小テスト7)
ファイルの存在を確認するif文を選択してください

    if [ -f file.txt ]

ディレクトリでなくファイルの存在チェックは-fを用います

####　演習問題
****
ex1)
• 引数を２つ取ります
• 1つ目の引数が性別(man, woman)、2つ目の引数が年齢(age)
• 第1引数がmanの場合、Manと表示、womanの場合Womanと表示
• 第2引数が20未満の場合Child、20以上60未満の場合Adult、60以上 の場合はElderlyと表示してください。
• 標準出力はコロン(:)でつないで表示してください。例えば
Man:Adult, Woman:Childと表示します。
• 以下の場合はexit 1で終了してください。
• 引数が2つでない場合
• 1つ目の引数がman woman以外の場合
• 2つ目の引数が0以上でない場合
./ex1.sh man 20 => Man:Adult
./ex1.sh woman 70 => Woman:Elderly
./ex1.sh man 15 => Man:Child
****
ex1 Answer)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/7e7e0e6c-137d-dc00-5a4a-ddc3de9c90c4.png)
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/54e8bc24-db4c-691f-ed85-6ab8c54e4a03.png)
****
ex2)
• まず、現在いるディレクトリのファイル一覧を表示します
• 2回、値を標準入力で受け付けて、変数に設定します
• 1つ目の入力がファイル名とし、2つ目の入力は任意の値としま
す。
• ファイルが存在する場合は、そのファイルに2つ目の値を追記
します。
• ファイルが存在しない場合は、「ファイルが存在しません」と
表示してください。


****
ex2 Answer)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/4de6ebbd-61bb-4935-9ae4-528193c8ad48.png)
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2217966/963f12bd-e221-ce57-3323-cdcb6748f7f7.png)

****
*To Be Continued...*
[Linux入門 2-2] へ
***
[](参照ソース)
[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入門 1-3]:https://qiita.com/hoglet/items/433e3bc2e3d7be88bc1b
[Linux入門 2-2]:https://qiita.com/hoglet/items/4210fe95f8dfb7067b74