ドットインストールのシェルスクリプト入門視聴メモ(#01~#09)


## はじめに

ドットインストールの[シェルスクリプト入門](http://dotinstall.com/lessons/basic_shellscript)を見たので、その視聴メモをまとめておきたいと思います。
この記事は、前半(#01~#09)のまとめです。  

> シェルスクリプト入門 (全18回) - ドットインストール
  http://dotinstall.com/lessons/basic_shellscript


##  [#01 シェルスクリプトとはなにか？](http://dotinstall.com/lessons/basic_shellscript/10601)

特に気になるところなし。


## [#02 はじめてのシェルスクリプト](http://dotinstall.com/lessons/basic_shellscript/10602)

### 1行目に実行するシェルを指定する

**/bin/bash** で実行する場合、1行目に下記のように書く。

```sh
#!/bin/bash
```

### ファイルのアクセス権限を変更する

シェルスクリプトを実行するためにファイルに実行権限を与える。
hoge.shの所有者、グループ、その他のユーザの権限をそれぞれ、rwx r-- r--にする場合、下記のようにchmodコマンドを実行する。
(所有者は読み出し書き込み実行権限、グループとその他のユーザには読み出しのみの権限を許可する場合)

```zsh
$ chmod 744 hoge.sh
```


## [#03 変数を使ってみよう](http://dotinstall.com/lessons/basic_shellscript/10603)

### 変数の使い方

* 変数に代入するとき **=** の前後にスペースを入れない
* **''**(シングルクォート) で括ると変数が展開されない

```hoge.sh
# ＝の前後にスペースを入れない
S="hoge"
echo $s
echo "$s"
# シングルクォートで括ると展開されない
echo '$s'
```

実行結果

```zsh
$ ./hoge.sh
hoge
hoge
$s
```


## [#04 数値演算をしてみよう](http://dotinstall.com/lessons/basic_shellscript/10604)

### 数値演算の仕方

* 数値演算を行う時は **\`\`**(バッククォート) で括る
* 数値演算をを行う時は **expr** を使う
* 記号の前後にはスペースを入れる

```hoge.sh
x=10
# バッククォートで括ると計算する
# 記号の前後にはスペースを入れる
echo `expr $x + 2`
```

実行結果

```zsh
$ ./hoge.sh
12
```


## [#05 四則演算をしてみよう](http://dotinstall.com/lessons/basic_shellscript/10605)

### 掛け算の仕方

* 掛け算する時は **\***(アスタリスク) を **\\**(バックスラッシュ) でエスケープする
* 計算の順序の **()**(括弧) も\でエスケープする

```hoge.sh
x=10
# 掛け算は*を\でエスケープする
# $x × 2
echo `expr $s \* 2`

# 括弧も\でエスケープする
# ( $x + 5 ) × 2
echo `expr ¥( \x + 5 \) \* 2`
```

実行結果

```zsh
$ ./hoge.sh
20
30
```


## [#06 配列を使ってみよう (1)](http://dotinstall.com/lessons/basic_shellscript/10606)

### 配列へのアクセス

* 配列で添字を使用する場合は **{}**(波括弧)で括る
* **$array** で先頭の要素
* **${array[@]}** で全ての要素
* **${array#[@]}** で要素数

```hoge.sh
#配列
a=(2 4 6)

# 先頭の要素
echo $a
# 添字を使用する場合は{}で括る
echo ${a[1]}

#全ての要素
echo ${a[@]}
# 要素数
echo ${#a[@]}

# {}で括るのを忘れると、$aが評価されて「2[1]」 となってしまう
echo $a[1]
```

実行結果

```zsh
$ ./hoge.sh
2
4
2 4 6
3
2[1]
```


## [#07 配列を使ってみよう (2)]()

### 配列への代入と要素の追加

* 配列への代入時は{}で括る必要はない
* 配列の要素の追加は **array+=(hoge foo)** とする

```hoge.sh
#配列
a=(2 4 6)

# 配列への代入時は{}で括る必要はない
a[2]=10
echo ${a[@]}

# 配列の要素の追加
a+=(20 30)
echo ${a[@]}
```

実行結果

```zsh
$ ./hoge.sh
2 4 10
2 4 10 20 30
```

**``**(バッククォート) で括ると実行結果を返す。  
この場合は、dateコマンドの結果を配列に格納する。


### ``で括ると実行結果を返す

* **``**(バッククォート) で括ると実行結果を返す

```hoge.sh
# ``で括ると実行結果を返す
d=(`date`)
echo ${d[0]}
```

実行結果

```zsh
$./hoge.sh
2015年
```

### 参考

dateコマンドは日付時刻を表示する。

```zsh
$ date
2015年 6月25日 木曜日 23時00分00秒 JST
```


## [#08 条件式を評価してみよう (1)](http://dotinstall.com/lessons/basic_shellscript/10608)

### 条件式について

* **$?** は、直前の条件式の評価の戻り値(真なら0,偽なら1)が格納されている
* **-eq** は等しいかどうか(equal)

```hoge.sh

# 条件式の評価
# 数値の評価
# 1 = 2
test 1 -eq 2; echo $?
# 1 = 1
test 1 -eq 1; echo $?
```

実行結果

```zsh
$ ./hoge.sh
1
0
```

### 色々な条件式
* **-eq** : 等しいか(equal)
* **-ne** : 等しくないか(not equal)
* **-gt** : 大きい(greater than)
* **-ge** : 以上(greater than or equal)
* **-lt** : 小さい(less tahn)
* **-le** : 以下(less than or equal)


## #09 [条件式を評価してみよう (2)](http://dotinstall.com/lessons/basic_shellscript/10609)

### 文字列の条件式

* **=** : 等しいか
* **!=** : 等しくないか


### ファイル(ディレクトリ)の条件式

* **-nt** : 新しいか(newer than)
* **-ot** : 古いか(older than)
* **-e**  : 存在するか(exist)
* **-d**  : ディレクトリか(directory)  

### 論理演算子

* **-a** : and
* **-o** : or
* **!**  : not

### 例

```hoge.sh
# ファイルの条件式
# カレントディレクトリにhoge.shが存在するかどうか
test -e hoge.sh; echo $?

#論理演算子
# 1は1と同じでかつ2は2と同じか
# (1 = 1) and (2=2)
test 1 -eq 1 -a 2 -eq 2; echo $?

```

実行結果

```zsh
$ ./hoge.sh
0
0
```