シェルの変数展開を理解する

# 目的
シェルの変数展開を理解する

# 前提
- 通常、`sudo` コマンド等の特殊なことをしなければ、ホストマシンでは `ubuntu` ユーザ、コンテナ内では `root` ユーザを使うことになる。
- `-E` オプションは、`sudo` コマンドを使ったとき、ほとんどの環境変数を引き継ぐ。`HOME` も例外ではない。
```
> printenv | grep HOME
HOME=/home/ubuntu
> sudo printenv | grep HOME
HOME=/root
> sudo -E printenv | grep HOME
HOME=/home/ubuntu
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "printenv | grep HOME"
HOME=/root
```

# ホストマシン
## クォーテーションなし
```
> echo $HOME
/home/ubuntu
> echo ${HOME}
/home/ubuntu
> echo /home/ubuntu
/home/ubuntu
```

## ダブルクォーテーション使用
```
> echo "$HOME"
/home/ubuntu
> echo "${HOME}"
/home/ubuntu
> echo "/home/ubuntu"
/home/ubuntu
```

## シングルクオーテーション使用
```
> echo '$HOME'
$HOME
> echo '${HOME}'
${HOME}
> echo '/home/ubuntu'
/home/ubuntu
```

# コンテナ内
## クォーテーションなし
### エスケープなし
`$HOME` はホストマシンで展開されてから、コンテナ内に渡される。
```
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo $HOME"
/home/ubuntu
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo ${HOME}"
/home/ubuntu
```

### 変数展開をエスケープ
エスケープされていることで、`$HOME` はホストマシンで展開されずに、コンテナ内で展開される。
```
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \$HOME"
/root
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \${HOME}"
/root
```

## ダブルクォーテーション使用
### エスケープなし 
私の認識だと、ダブルクォーテーションの中にダブルクォーテーションのある状態は、エラーになるはずだったのだが、なぜかエラーにならない
```
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo "$HOME""
/home/ubuntu
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo "${HOME}""
/home/ubuntu
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo "/home/ubuntu""
/home/ubuntu
```

### ダブルクォーテーションをエスケープ
```
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \"$HOME\""
/home/ubuntu
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \"${HOME}\""
/home/ubuntu
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \"/home/ubuntu\""
/home/ubuntu
```

### 変数展開をエスケープ
私の認識だと、ダブルクォーテーションの中にダブルクォーテーションのある状態は、エラーになるはずだったのだが、なぜかエラーにならない
```
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo "\$HOME""
/root
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo "\${HOME}""
/root
```

### ダブルクォーテーションと変数展開をエスケープ
```
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \"\$HOME\""
/root
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \"\${HOME}\""
/root
```

## シングルクオーテーション使用
### エスケープなし
<font color="Red">一つ目について、コンテナ内で `echo '/home/ubuntu'` が実行されることと同じ。</font>
```
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo '$HOME'"
/home/ubuntu
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo '${HOME}'"
/home/ubuntu
```

### シングルクオーテーションをエスケープ
<font color="Red">一つ目について、コンテナ内で `echo \'/home/ubuntu\'` が実行されることと同じ。</font>
```
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \'$HOME\'"
'/home/ubuntu'
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \'${HOME}\'"
'/home/ubuntu'
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \'/home/ubuntu\'"
'/home/ubuntu'
```

### 変数展開をエスケープ
<font color="Red">一つ目について、コンテナ内で `echo '$HOME'` が実行されることと同じ。</font>
```
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo '\$HOME'"
$HOME
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo '\${HOME}'"
${HOME}
```

### シングルクオーテーションと変数展開をエスケープ
<font color="Red">一つ目について、コンテナ内で `"echo \'$HOME\'` が実行されることと同じ。</font>
```
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \'\$HOME\'"
'/root'
> sudo -E docker exec terraformmy-tfcontainer-1 sh -c "echo \'\${HOME}\'"
'/root'
```