web-dev-qa-db-ja.com

ローカル変数の割り当てには引用符が必要ですか?

ローカル割り当ての右側の引用を安全に省略できますか?

function foo {
    local myvar=${bar}
    stuff()
}

私は主にbashに興味がありますが、他のシェルのコーナーケースに関する情報は大歓迎です。

38
rahmu

通常、空白などの文字が含まれる可能性がある変数の使用法を引用します。そうしないと、次のような問題が発生します。

#!/bin/bash

bar="hi bye"

function foo {
  local myvar=${bar}
  printf "%s\n" $myvar
  printf "%s\n" "$myvar"
}

foo

割り当てでの変数の使用法は引用符を必要としないように見えますが、printfなどで使用する場合は、引用符で囲む必要があります。

  printf "%s\n" "$myvar"

注:変数$IFSは、区切り文字を決定するものであることを覚えておいてください。

IFS    The  Internal  Field  Separator that is used for Word splitting after 
       expansion and to split lines into words with the read builtin command. 
       The default value is ``<space><tab><newline>''.

Bashでデバッグを有効にすると、舞台裏で何が起こっているかを確認できます。

$ bash -x cmd.bash 
+ bar='hi bye'
+ foo
+ local 'myvar=hi bye'
+ printf '%s\n' hi bye
hi
bye
+ printf '%s\n' 'hi bye'
hi bye

上記では、変数$bar$myvarに正常に渡されたことがわかりますが、$myvarを使用するときは、$myvarの内容を認識している必要があります。

3
slm