【Linux】初めてのLinux - シェルスクリプトを使いこなせるようになるまで

# はじめに
本記事を読むことで、Linuxとコマンドを使いこなせるようし、最終的にはシェルスクリプトを使って業務を楽にすることができるようになるレベルになることを想定して書きました。

#目次
[1.Linuxの概要](#1-Linuxの概要)
[2.ファイルとディレクトリ](#2-ファイルとディレクトリ)
[3.ユーザーグループと権限](#3-ユーザーグループと権限)
[4.シェルの基本とシェルスクリプト](#4-シェルの基本とシェルスクリプト)

#1. Linuxの概要
## Linuxとは？
macOSやwindowsなどと同じOS。
OSとは、operating systemの略で、コンピューター全てを管理しているソフトウェアのこと。

## Linuxの歴史
Linuxは1990年代に当時学生だったリーナス・トーバルズが一人で開発したOS。
その後、多くの開発者がLinuxの開発に参加したことにより、急速の発展をとげ無料かつ安定して動作するのOSとして、現在は多くのサーバーのOSで利用されている。

ちなみに、リーナスさんはバージョン管理システムのGitも開発した人。

## LinuxとUNIXとの違いは何か？
UNIXはアメリカの企業が開発した歴史上もっと古いOS。現在もUNIXは健在で、現在のmacOSの原型となったり、カーナビなどのOSとして使われている。
LinuxはこのUNIXを参考に作られたOSでソースコード自体は全く別物。

また、UNIXは企業が開発して、知的財産権が企業に属しているが、Linuxはオープンソースなので、無料かつ改変や配布も自由となっている。

## Linuxは基本的にサーバーのOSとして使われる
サーバーのOSとして、以下の条件をクリアする必要がある。
- インターネット上で高速かつ多くのアクセスに対応可能
- 安定している（バグが少ない）
- ライセンスフリー（複数台のサーバーで利用ができる）
- メンテナンスが容易
- 品質の高い多くのアプリケーション（ソフトウェア）を利用することができる

これらの条件をLinuxはクリアしている。そのため、現在ではサーバーのOSとして多くのシェアを持っている。

 `- 脱線 -`  
LinuxはサーバーのOSとして使われるイメージだが、一般的なPCのOSとしても利用することができる。 

## Linuxのシステム構成
今までの説明でのLinuxは基本的にLinux kernelのことを説明いる。なので、狭義の意味としてLinux（Linux kernel）はOSでありコンピュータを制御するソフトウェアのこと。
しかし、近年ごく一般的にLinuxという言葉を使用する場合、Linux karnelに加え、コマンド群などのアプリケーションも含めたパッケージ（**Linuxディストリビューション**）を広義の意味としてLinuxと言われている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116887/6f7d37bb-6a30-c333-26dd-992e0dc1c496.png)

## Linuxディストリビューションの種類
よく聞くのが、以下二つ

- RedHat系
> CentOS
- Debian系
> ubuntu





#2. ファイルとディレクトリ
## LinuxのFileとディレクトリ構造について
Linuxはシステムを含む全てのデータはファイルとして扱われる。 Linuxを使用していく上で、必要なファイルがどこに配置されているか、どこに配置すべきかを把握するために、ディレクトリ構造についても理解する必要がある。 Linuxのディレクトリ構造にはFHS(Filesystem Hierarchy Standard)規約が採用されている。FHSとは標準的なディレクトリ構造を定めたもの。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116887/2f8d2282-5a3c-0055-f9b0-83acb5ee5f9e.png)

## 覚えておきたいディレクトリの役割
| ディレクトリ | 役割 |
| :---: | :--- |
| / | 最上のディレクトリであるルートディレクトリを意味 |
| /bin | 一般ユーザー・管理者ユーザーが利用するコマンドの実行ファイルを置くためのディレクトリ |
| /dev | デバイスファイルを置くためのディレクトリ。<br> デバイスファイルとは、ディスクやキーボードなどのハードウェアをファイルとして扱えるように用意された特殊ファイル |
| /etc | 設定ファイルを置くためのディレクトリ。 |
| /home | ユーザーごとに割り当てられるホームディレクトリを置くためのディレクトリ。  |
| /lib | 標準的なライブラリを置くためのディレクトリ |
| /media | CD/DVDなどのデータを置くためのディレクトリ |
| /sbin | `/bin`ディレクトリと同様に実行ファイルを置くためのディレクトリ。 ただし、`/sbin`は管理者ユーザー向けのもの |
| /tmp | 一時的なファイルを置くためのディレクトリ。このディレクトリ内のファイルを定期的に削除するように設定されることが多い |
| /usr | 各ユーザーが共通して利用するアプリケーション(プログラムやライブラリ)などが置かれるディレクトリ。内部にルートディレクトリ配下と似た構造を持っている |
| /var | システム運用中に動的に変化するデータファイルを置くためのディレクトリ。ログなど |


## ファイル・ディレクトリの基本操作
別の記事にてまとめありますのでそちらを参照ください。

https://qiita.com/tundes/items/ba8edf3c7991393cabd5

#3. ユーザーグループと権限
Linuxのすべてのファイルやディレクトリには、ユーザー（所有者）とグループの情報を必ず持っています。また、そのユーザーとグループが【読み取り・書き込み・実行】の権限情報も必ず登録されています。

### 確認方法
ls -l　コマンドを使って、ファイルの詳細を確認します

## パーミッションの見方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116887/5d064bc4-fa9d-68ec-838d-685cf6fbe015.png)

| 記号 | 意味 |
| :---: | :--- |
| r | Read権限(読み取り)ファイル・ディレクトリの中を見ることができる |
| w | Write権限(書き込み)ファイル変更・保存ができる。ディレクトリ内操作ができる |
| x | eXecution権限(実行)shell/Ruby等のプログラムの実行ができる |
| - | 上記３つの権限のどれも持たない |

## パーミッションの変更コマンド　chmod = change mode
**パーミッション を変更する**

### 使用例
```:terminal
chmod 777 hogehoge.rb
```

## 数字の正体
| 記号 | 数字 | 意味 |
| :---: | :---: | :--- |
| r | 4 | Read権限(読み取り)ファイル・ディレクトリの中を見ることができる |
| w | 2 | Write権限(書き込み)ファイル変更・保存ができる。ディレクトリ内操作ができる |
| x | 1 | eXecution権限(実行)shell/Ruby等のプログラムの実行ができる |
| - | 0 | 上記３つの権限のどれも持たない |

**rwx権限を与える場合 = 4 + 2 + 1 = 7**
よって、使用例の777は全ユーザー・グループに対して rwx権限を付与したことがわかる

#4. シェルの基本とシェルスクリプト
### シェルとは？
ユーザーがコマンドを入力し、実行した際に処理を行うのはLinux kernelで、Linux kernelは直接ユーザーからの操作を受け付けることはできません。
そこで、シェルというソフトウェアを利用して、ユーザーとkernelの間のインタフェースの代役してくれます。

シェルの種類はいくつかあり、聞いたことがあるのは、bash・zshなどは耳にしたことがあると思います。

bashはlinuxの標準シェルです。
最近のmacはzsh（bashを拡張した物）が採用されています。

### シェルの動作について
例えば、ユーザーが dateコマンドを実行したとします。

```
ユーザーからのコマンド命令を受けたシェルはdateコマンドをLinux kernelに伝わるように変換し、命令を出す。
Linux kernelは命令を受け取り処理をし、処理結果をshellに渡す。
shellはLinux kernelから結果を受け取りユーザーに伝わるように変換し、結果を出力する。
```
イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116887/4b6102a0-4e0c-4ee6-5c28-85cff57d0cb6.png)

### シェルスクリプトとは
ターミナル等にコマンドを実行してシェルを操作する方法をインタラクティブ操作といいます。 対して、実行したい一連のコマンドのプログラムを記述したファイルのことをShell Script(シェルスクリプト)と言います。

今まで、説明してきたコマンドをインタラクティブ操作です。
そのコマンド群がシェルスクリプトです。

例えば次のスクリプト

``` :hello.sh
#!/bin/sh
user=$(users)
echo 'Hello ' $user

echo 'What is the current date?'
echo $(date)
```
これでも立派なシェルスクリプトと言えます。

``` :terminal
$ sh hello.sh
=> Hello  user name
=> What is the current date?
=> 2020年 1月 1日 金曜日 10:00:00 UTC
```

シェルは外部コマンドを、シェルの環境変数PATHに登録されたディレクトリ配下を探して実行します。



## シェルスクリプト構文
### シバン
シバン（#! から始まる1行目のこと。 起動してスクリプトを読み込むインタプリタを指定する）

```
#!/bin/bash
```
### 変数
#### 定義
```
variable='value'
```
**注意 `=`の間にスペースを入れるとエラーになる**

#### 呼び出し
```
echo $variable
```

#### 文字列内で変数を使う
```
echo "variableの値は: $variable"
```

### 条件分岐（if - else / case）
```
value=0
if [ $value -eq 0 ]; then
  echo 'OK'
else
  echo 'NO'
fi
```

#### 数値の比較演算子
```
-eq ：equal(イコール)
-ne ：not equal(notイコール)
-gt ：greater than (◯◯より大きい)
-ge ：greater than or equal (◯◯以上)
-lt ：less than (◯◯より小さい)
-le ：less than or equal (◯◯以下)
```

#### 文字列の比較演算子
```
= ： equal
!= ： not equal
-a ： and
-o ： or
! ： is not
```

### 繰り返し（while）
```
i=0
while :; do # :を使うと常に0(正常終了)を返すので、無限ループになる
  i=`expr $i + 1` # expr 「式」を評価するコマンド
  if [ `expr $i % 2` -ne 0 ]; then
      continue
  fi
  if [ $i -gt 10 ]; then
      break
  fi
  echo $i
```

### 入力受付
```
echo 'please enter yes or no'
while read value; do
  case "$value" in
    "yes")
      echo "Hello World"
      break
      ;;
    "no")
      echo "yesが入力されるまで終わりません"
      ;;
    esac
done
```

## 最後に
最後まで読んでいただきありがとうございます。
この情報がためになると嬉しいです。

シェルスクリプトの学習の成果としてシェルスクリプトじゃんけんゲームを作ってみました。

https://github.com/TsubasaRyuto/janken_shell

また、これ以外にも実際の業務で使用する環境構築を自動化シェルスクリプトも作ってみました。
シェルスクリプトを学習することで、業務を自動化することができるかもしれません。皆さんもぜひ何か作ってみてください。