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


## はじめに

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

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


## [#10 if文で条件分岐をしてみよう (1)](http://dotinstall.com/lessons/basic_shellscript/10610)

### if文

* if文の書き方

 ```sh
 if test 条件式; then
      処理
 fi
 ```
  
* testコマンドは、 **[]**(大括弧)で書き換えることができる

```hoge.sh
X=70
# if test $x -gt 60; then  と同じ
if [ $x -gt 60 ]; then
  echo "OK!"
fi
```

実行結果

```zsh
$ ./hoge.sh
OK!
```

### 参考
**[]**(大括弧) は、testを代替する命令。

```zsh
$ which [
[: shell built-in command
```


## [#11 if文で条件分岐をしてみよう (2)](http://dotinstall.com/lessons/basic_shellscript/10611)

###  else文とelsif文

* **elif** は、 else if文。

```hoge.sh
X=20
if [ $x -gt 60 ]; then
  echo "OK!"
elif [ $x -gt 40]; then
  echo "Soso..."
else
  echo "NG..."
fi
```

実行結果

```zsh
$ ./hoge.sh
NG...
```


## [#12 case文で条件分岐をしてみよう](http://dotinstall.com/lessons/basic_shellscript/10612)

### case文

* case文の書き方

  ```sh
    case 値 in
    パターン1) 処理;;
    パターン2) 処理;;
    ...
    パターンn) 処理;;
    *)  処理;; (どれにも当てはまらないパターン)
    esac
  ```

```hoge.sh
# case文

signal="red"
case $signal in
  "red")
    echo "Stop!"
    ;;
  "yellow")
    echo "Caution!"
    ;;
  "green")
    echo "Go!"
    ;;
  # どれにも当てはまらないパターンは *) を使う
  *)
    echo "..."
    ;;
esac
```

実行結果

```zsh
$ ./hoge.sh
Stop!
```


## [#13 while文でループ処理をしてみよう](http://dotinstall.com/lessons/basic_shellscript/10613)

### while文

* while文の書き方

  ```sh
  while 条件式
  do
      処理
  done
  ```

```hoge.sh
# while文

i=0
while [ $i -lt 10 ]
do
  i=`expr $i + 1`
  echo $i
done
```

実行結果

```zsh
$ ./hoge.sh
1
2
3
4
(中略)
9
10
```

### while文で無限ループ

* while文で無限ループさせる場合は、 ヌルコマンド(**:**(コロン))を使う
* break文でループから抜ける

```foo.sh
# while文

i=0
while :
do
  i=`expr $i + 1`

  if [ $i -eq 3 ]; then
    continue
  fi
  
  if [$i -gt 10]; then
    break
  fi
  
  echo $i
done
```

実行結果(3をスキップした結果)

```zsh
./ foo.sh
1
2
4
5
6
(中略)
9
10
```


## [#14 for文でループ処理をしてみよう](http://dotinstall.com/lessons/basic_shellscript/10614)

### for文

* for文の書き方

  ```sh
  for 変数 in 値リスト
  do
      処理
   done
  ```

* **seq** コマンドは連番を出力するコマンド
  \`seq 1 5\` は、1から5までの数字、つまり「1 2 3 4 5」と同じ意味になる。

```hoge.sh
# for文

a=(1 2 3 4 5)

# 全て同じ結果になる
# for i in 1 2 3 4 5
# for i in ${a[@]}
for i in `seq 1 5`
do
  echo $i
done
```

実行結果

```zsh
$ ./hoge.sh
1
2
3
4
5
```


##  [#15 コマンド引数を使ってみよう](http://dotinstall.com/lessons/basic_shellscript/10615)

### コマンドライン引数

* コマンドライン引数の処理に使用する変数のいろいろ

```hoge.sh
# コマンドライン引数

# $0はプログラム自身
echo $0
# $1は1番目の引数
echo $1
# $2は2番目の引数
echo $2

# 10番目以降は{}を付けないといけない
# echo ${10}

# $@は引数全部
echo $@
# $#は引数の数
echo $#
```

実行結果

```zsh
$ ./hoge.sh a b
./hoge.sh
a
b
a b
2
```


## [#16 ユーザーからの入力を受け付けよう](http://dotinstall.com/lessons/basic_shellscript/10616)

### ユーザからの入力の受付

* **read**文 でユーザーからの入力を受け付ける。

```hoge.sh
# read

while :
do
  # ユーザからの入力を key に格納する
  read key
  echo "You pressed $key"
  if [ $key = "end ]; then
    break
  fi
done
```

実行結果

```zsh
$ ./hoge.sh
hoge
You pressed hoge
foo
You pressed foo
end
You pressed end
(プログラムの処理終了)
```

### ユーザからの入力を選択肢で受付

* **select**文 でユーザからの入力を選択肢で受け付ける。

```foo.sh
# select

# ユーザから入力を CODE DIE の中で選ばせる
select option in CODE DIE
do
 echo "You pressed $option"
 break;
done
```

実行結果

```zsh
$ ./foo.sh
1) CODE
2) DIE
#? 1  (1を入力する)
You pressed CODE
```


## [#17 ファイルから入力してみよう](http://dotinstall.com/lessons/basic_shellscript/10617)

### ファイルから入力

* while文にリダイレクションするには done の直後に **<** を書く

```date.txt
hoge
foo
bar
piyo
```

```hoge.sh
i=1
# 1行ずつ読み込みlineに格納する
while read line
do
  echo "$i: $liine"
  i=`expr $i + 1`
# 引数の1つ目に指定したファイルから入力を受け付ける  
done <$1
```

実行結果

```zsh
$ ./hoge.sh date.txt
1: hoge
2: foo
3: bar
4: piyo
```


## [#18 関数を使ってみよう](http://dotinstall.com/lessons/basic_shellscript/10618)

### 関数

* 関数の宣言は **function** を使う(省略可)
  
  ```sh
  fuction 関数名() {
      処理
      ruturn 値
  }
  ```
  
* 関数の呼び出しは () を省略可
* 関数内で宣言した変数は関数外でも使える

```hoge.sh
# 関数
# 関数の宣言 hello()だけでも可
function hello() {
  # $1と$2は関数の1番目の引数と2番目の引数
  echo "Hello $1 and $2"
  i=5
  echo $i
}

hello Tom Mike

# 関数内で宣言した変数も関数外でも使える
echo $i
```

実行結果

```zsh
$ ./hoge.sh
Hello Tom and Mike
5
5
```