回答:
引用符はで必要とされるexport foo="$var"
かlocal foo="$var"
(またはreadonly
、typeset
、declare
およびその他の変数宣言コマンドで):
dash
sh
NetBSD(またAlmquistシェルに基づきます)。sh
FreeBSDの9.2以前の(参照9.3の変化を)yash
zsh
5.1 in ksh
またはsh
エミュレーションより前のバージョン(またはそれ以外の場合(グロビングではなく)単語分割を実行するexport var="$(cmd)"
場所zsh
)。それ以外の場合、変数の展開は、他のコマンドの引数のように、単語の分割やファイル名の生成の対象となります。
また、次のものには必要ありません。
bash
ksh
(すべての実装)sh
FreeBSDの9.3以降のsh
(2005年以降)zsh
ではzsh
、in sh
またはksh
エミュレーションでない限り、split + globはパラメーター展開時に行われませんが、コマンド置換時にsplit(globではなく)が行われます。バージョン5.1以降、export
/ local
およびその他の宣言コマンドは、上記の他のシェルのようにデュアルキーワード / 組み込みコマンドになっています。つまり、sh
/ ksh
エミュレーションやコマンド置換でも引用符は不要です。
これらのシェルでもクォートが必要な特別な場合があります:
a="b=some value"
export "$a"
または、より一般的に、=
(を含む=
)の残りが引用されるか、何らかの拡張の結果(export 'foo'="$var"
、export foo\="$var"
またはexport foo$((n+=1))="$var"
($((...))
実際に引用されるべきです)...)または、の引数export
がexport
。
場合export
/ local
コマンド名自体が引用されている(でも同様の部分には"export" a="$b"
、'ex'port a="$b"
、\export a="$b"
、またはさえ""export a="$b"
)、周りの引用符は$b
AT&T以外で必要とされているksh
とmksh
。
場合はexport
/ local
(のようにいくつかの拡張の結果であるか、それの一部cmd=export; "$cmd" a="$b"
あるいはexport$(:) a="$b"
またはのようなもので)dryrun=; $dryrun export a="$b"
)、その後、引用符は、すべてのシェルで必要とされます。
の場合> /dev/null export a="$b"
、引用符pdksh
とその派生物の一部が必要です。
の場合command export a="$b"
、引用符はすべてのシェルで必要ですがmksh
、ksh93
(command
およびexport
拡張の結果についてではなく、同じ警告があります)。
記述されている場合、これらはシェルでは必要ありません。
foo=$var export foo
(その構文はBourneシェルとも互換性がありますが、の最新バージョンでzsh
はsh
/ ksh
エミュレーションでのみ機能します)。
(var=value local var
動作はシェルによって異なるため、使用しないでください)。
またexport
、割り当てで使用すると、cmd
in の終了ステータスexport var="$(cmd)"
が失われることにもなります。export var; var=$(cmd)
そんなことはありません。
また、次の特殊なケースにも注意してくださいbash
。
$ bash -c 'IFS=; export a="$*"; echo "$a"' bash a b
ab
$ bash -c 'IFS=; export a=$*; echo "$a"' bash a b
a b
私のアドバイスは、常に引用することです。
zsh
引用符されるために必要local foo="$(cmd)"
wordsplitting(ただし、ファイル名の生成)があるためされ引用符で囲まれていないコマンド置換を行う(ただし、引用符で囲まれていないパラメータ展開のためには)、ない限りは、KSH_TYPESET
ケースの引用符をする、有効化されていない必要。理にかなっていますか?いや?次に、何をしているのか正確にわからない限り、常にすべてを引用します。
私は通常、空白などの文字が存在する可能性のある変数の使用法を引用しています。そうしないと、次のような問題が発生します。
#!/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
、我々はの内容のcognoscenteしなければならなかった$myvar
、我々はそれを使用するために行ったとき。
bash
とksh
してlocal
/ typeset
...特殊な組み込みコマンド)。