22269
macでシェルスクリプトを作ってみようとしたのですが、

```

    #!/bin/sh
    dirPath="~/Library/Developer/Xcode/iOS Device Logs/tmp"
    mkdir $dirPath
    
```

とした場合に、

```

    mkdir: ~/Library/Developer/Xcode: No such file or directory
    mkdir: Device: File exists
    mkdir: Logs: No such file or directory
    
```

とでて、うまくいきませんでした。

ダブルクォーテーションを外して

```

    #!/bin/sh
    dirPath=~/Library/Developer/Xcode/iOS\ Device\ Logs/tmp
    mkdir $dirPath
    
```

としても

```

    mkdir: Device: File exists
    mkdir: Logs: No such file or directory
    
```

とでて、iOSというディレクトリが作られるだけでうまくいきませんでした。  
シェルスクリプトで名前に空白を含むディレクトリに対して作業したい場合  
どのようにすればよいのでしょう
CC BY-SA 3.0
2016-02-19T08:59:35.370
22264
2016-02-20T16:39:40.947
13404
question
shellscript sh
シェルスクリプトで名前に空白を含むディレクトリに対して作業する方法
変数を`"`ではさめば作成出来ると思います。

```

    mkdir "$dirPath"
    
```
CC BY-SA 3.0
2016-02-19T09:34:09.207
22266
2016-02-19T09:34:09.207
5008
22264
answer
`~`は実在するパスではなくシェルによってTilde Expansionが行われる必要があります。しかしこのTilde
Expansionはクオートされていないことが条件となります。`~`の代わりに環境変数`$HOME`を使うのが簡単でしょうか。環境変数の展開に関してはクオートされていても行われます。

```

    #!/bin/sh
    dirPath="$HOME/Library/Developer/Xcode/iOS Device Logs/tmp"
    mkdir $dirPath
    
```
CC BY-SA 3.0
2016-02-19T09:39:50.640
22267
2016-02-19T09:39:50.640
4236
22264
answer
シェルがどのようにコマンドライン等を解釈するかを理解しましょう。

まずチルダ展開によるホームディレクトリ名への展開は、ダブルクォートで括ると抑制されてチルダ `~` は展開されず、そのまま `~`
と解釈されます。よって、次のようにチルダはダブルクォートの外にすべきです。

```

    dirPath=~"/Library/Developer/Xcode/iOS Device Logs/tmp"
    
```

次にパラメーター展開 `$dirPath`
ですが、ダブルクォートで括らないと、パラメーター展開だけでなく、その後にワード分割が(さらにその後にパス名展開も)行なわれます。よって、空白文字(実際はそのときのシェル変数
IFS の値)を含むと分割され、`mkdir` には `~/Library/Developer/Xcode/iOS` と `Device` と
`Logs/tmp` の 3つの引数が渡されることになります。よって、ワード分割(とパス名展開)を抑制するために、ダブルクォートで括るべきです。

```

    mkdir "$dirPath"
    
```

ちなみに、チルダ展開の結果はワード分割やパス名展開などの対象にはならないため、ホームディレクトリのパス名に空白文字が含まれていたり `*`
などパス名展開対象のメタ文字が含まれていても、問題ありません。
CC BY-SA 3.0
2016-02-19T10:05:59.800
22269
2016-02-20T16:39:40.947
2016-02-20T16:39:40.947
3061
3061
22264
answer