シェルスクリプトについて

Qiita初心者なので読みづらいとか見づらいとかは許してね！
そもそもshellって何?って方はかんたんにまとめたのがあるのでどうぞ!([shellについて](https://qiita.com/maachan_9692/items/75935e76aa5340d4db6a))

色々自動化していけたらなと思い、とりあえずシェルスクリプトをやろうとのことで調べたことをまとめようと思いまーす！

環境:ubuntu18.04

とりあえず色々調べたら '#!/bin/sh'とか '#!/bin/bash'とかが一行目にあるのでそれについてまとめまーす！

#` #!/bin/sh ` と ` #!/bin/bash `
`#!/bin/sh`と`#!/bin/bash`(shebang)はシステムにこれからシェルスクリプトを書きますようと知らせるもの！
`#!/bin/sh`は実行環境によってシンボリックリンクが違うのでbashなら`#!/bin/bash`と明示！


#基本設定
シェルスクリプトのファイルは基本的に拡張子が`.sh`
テストとして`test.sh`を作成！

```bash:test.sh
#!/bin/bash
```
これが基本でこのあとにシェルさんを書いていくみたい！
実行するときはこれ！

```bash
bash test.sh
```

```
sh test.sh
```

```
chmod 755 test.sh
./test.sh
```
#基本コマンド
## コメントアウト
シェルさんは`#`でコメントアウトできる！

```sh:コメントアウト
#!/bin/bash

#わーーーーーーーーーーーーーーーーーーーーーーーーーーーーーい！
#なんもなーーーーーーーーーーーーーーーーーーーーーーーーーーい！
```
## 入出力
入力は`read`で出力は`echo`!

```sh:入出力
#!/bin/bash

read STR
echo "Hello $STR !"
-------------------
bash test.sh
World
Hello World !
```

##変数
シェルスクリプトも他のプログラミング言語と同じで変数を使える！
シェルスクリプト内の変数はシェル変数って言って＝で使える！
※文字列は`" "`で囲まないとダメ！！
シェル変数を使うときは`$変数`か`${変数}`で使える！
`readonly 変数`で変数の中身を変更できなくする！
`unset`で変数を消せる
※readonlyしたら消せない！

```sh:test.sh
#!//bin/bash

val1="Hello"
val2="World"
val3=14

echo ${val1} ${val2}
echo age : ${val3}

readonly val3

val3=15

-------------------
bash test.sh
Hello World
age : 14
test.sh: 12: test.sh: val3: is read only
```
##特別な変数
シェルスクリプトには特別な変数があるみたい！

| 変数名 |機能                        |
|:------|:--------------------------|
|＄0    |スクリプト名|
|＄1〜＄9|1番目の引数を`$1`、2番目の引数を`$2`でアクセスする|
|＄#    |スクリプトに与えた引数の数|
|＄*    |全部の引数をまとめて1つとして処理|
|＄@    |全部の引数を個別として処理|
|＄?    |直前実行したコマンドの終了値（0は成功、1は失敗）|
|＄＄   |このシェルスクリプトのプロセスID|
|＄!    |最後に実行したバックグラウンドプロセスID|


```sh:test.sh
#!/bin/bash

echo "\$0 : $0"
echo "\$1 : $1"
echo "\$2 : $2"
echo "\$* : $*"
echo "\$\@ : $@"
echo "\$\# : $#"

val="/$/?は0のはず"

echo "\$\? : $?"

----------------------

bash test.sh
$0 : test.sh
$1 : a
$2 : b
$* : a b c
$@ : a b c
$# : 3
$? : 0

```

###特殊な文字
`* ? [ ' " ｀ \ $ ; & ( ) | ~ < > # % = スペース タブ 改行`はシェルスクリプトの特殊文字だから文字列として使うときは `\` を書いてからじゃないとダメ！

##変数値の置換

|文法(例) | 説明 |
|:--|:--|
|${val}|valの値|
|${val:-test}|valに何も入っていなければtestを返す！※valはそのまま！|
|${val:+test}|valに何か入っていればtestを返す！※valはそのまま！|
|${val:?Error}|valに何も入ってなければErrorを返す！   |
|${val:=hoge}|valに何も入ってなければhogeを返す！※valの値はhogeに！|


```sh:test.sh
#!/bin/bash                                                                                                                                                                                                    
    
echo "1 ${val:-test}"
echo "2 ${val}"
echo "3 ${val:+test}"
echo "4 ${val}"
echo "5 ${val:=hoge}"
echo "6 ${val}"
echo "7 ${val:+test}"
echo "8 ${val}"
echo "9 ${val:?Error}"
echo "10 ${val}"

------------------------------

bash test.sh
1 test
2 
3 
4 
5 hoge
6 hoge
7 test
8 hoge
9 hoge
10 hoge
```
valとかtestとかの名前は何でも大丈夫！

##配列
```sh:test.sh
#!/bin/bash

arrey=(first second 3rd 4th)
array[0]="one"
array[3]="four"

echo "array[0] : ${array[0]}"
echo "array[3] : ${array[3]}"

------------------------------
bash test.sh
array[0] : one
array[3] : four
```
array[*]かarray[@]で配列のすべての中身をアクセスする！

##演算等
shellで演算するときは`｀expr 数字 演算子 数字｀`って書く！

| 演算子 | 意味 | 使い方 |
|:--|:--|:--|
| + | 和 |｀expr 5 + 5｀|
| - | 差 |｀expr 10 - 5｀|
| ￥* | 積 |｀expr 5 \* 5｀|
| / | 除 |｀expr 10 / 2｀|
| % | 除余り |｀expr 10 % 3｀|
| = | 指定 |`a=$b`aにbの値を代入|
| == | 真 |["$a"=="$b"]aとbが同値ならtrueを返す！|
| != | 偽 |["$a"!="$b"]aとbの値が違うとtrueを返す！|

| 比較 | 意味 | 使い方 |
|:--|:--|:--|
| -eq | イコール | `["$a" -eq "$b" ]$a`と`$b`が同じならtureを返す！ |
| -ne | ノットイコール | `["$a" -ne "$b" ]$a`と`$b`が違えばtureを返す！ |
| -gt | 大なり | `["$a" -gt "$b"]$a`が`$b`より大きければtureを返す！ |
| -lt | 小なり | `["$a" -lt "$b"]$a`が`$b`より小さければtureを返す！ |
| -ge | 大なりイコール | `["$a" -ge "$b"]$a`が`$b`以上ならtureを返す！ |
| -le | 小なりイコール | `["$a" -le "$b"]$a`が`$b`以下ならtureを返す！ |
| ! | ノット | `[! "$a" -ge "$b"]$a`が`$b`以上じゃなければtureを返す！ |
| -o | or | `["$a" -eq "$b" -o "$c" -eq "$d"]$a`と`$b`の値が同じか`$c`と`$d`の値が同じならtureを返す！ |
| -a | and | `["$a" -eq "$b" -a "$a" -eq "$c"]$a`と`$b`の値が同じで`$a`と`$c`の値が同じならtureを返す！ |
| -z | 文字列が空か | `[-z "$a"]$a`の中身が空ならtureを返す！ |
| -n | 文字列が空か | `[-n "$a"]$a`の中身に何か入っているならtureを返す！ |
※`[  ]`内に変数を使うときは`" "`で囲むように！
※`[  ]`のやつは条件分！(ifとかwhileとかの)

##if