次の変数割り当ての違いは何ですか?
var=23
var =23
var= 23
var = 23
代入演算子の周りのスペースはどのような違いをもたらしますか?
答え1
多くはケーシングに依存します。 4つの主要なシェル系列(Bourne、csh、rc、fish)だけを見ると、次のようになります。
バーンファミリー
これはBourneシェルとそのすべてのバリアント、、、、ksh
/ 、です。bash
ash
dash
zsh
yash
var=23
: これは正しいスカラー変数割り当て構文です。引用符のない文字、数字、またはアンダースコアで構成される単語、および=
コマンド引数の前に表示される引用符のない単語(ここでのみ)。var =23
、asパラメータを持つvar
コマンド=23
(inは、コマンドパスに拡張された特殊演算子であるzsh
場合は除外されます。有効なコマンド名ではない可能性が高いため、エラーが発生する可能性があります)。=something
something
23
var= 23
:割り当てvar=
の後にはコマンド名が続きます23
。これは23
、実行する環境(NULL値を持つ環境変数)に渡すことを意味します。var=
var
var = 23
、var
コマンドは、=
および23
パラメータを使用します。echo = 23
たとえば、試してみてください。
ksh
、zsh
およびいくつかのフォームもサポートしていますbash
。yash
大量に/リスト構文変更変数展開と拡張のため。ksh93
、zsh
またbash
支えます連想配列3. 構文がksh93
異なります。複合変数そしてタイプ、オブジェクトプログラミング言語のオブジェクトとクラスを連想させます。
Cesファミリー
csh
そしてtcsh
。変数の割り当てには、set var = value
スカラー変数、set var = (a b)
配列、setenv var value
環境変数、割り当て、および算術評価の@ var=1+1
構文があります。
だから:
var=23
var=23
コマンドを呼び出すだけです。var =23
var
パラメータを使用してコマンドが呼び出されます=23
。var= 23
var=
パラメータを使用したコマンドの呼び出し23
var = 23
コマンドはおよび引数を使用して呼び出されますvar
。=
23
RCファミリー
つまりrc
、、、es
そしてakanga
。これらのシェルでは、変数は配列であり、割り当てはwith、var = (foo bar)
short var = foo
for with ( var = (foo)
1つの要素を持つ配列foo
)、およびvar =
short for var = ()
(要素のない配列、空の要素を持つ配列の場合、var = ''
または使用)です。var = ('')
いずれにせよ、周囲のスペース(スペースまたはタブ)は=
許可され、オプションです。したがって、これらのシェルでは、この4つのコマンドはvar = (23)
要素の配列を割り当てるのと同じです23
。
魚
のfish
変数割り当て構文はですset var value1 value2
。のように、rc
変数は配列です。
したがって、名前にaを含むコマンドをcsh
実行できないことを除いて、動作はwithと同じです。そのようなコマンドがある場合は、たとえば呼び出す必要があります。fish
=
sh
sh -c 'exec weird===cmd'
したがって、すべてvar=23
およびvar= 23
エラーは、コマンドを引数としてvar =23
呼び出し、コマンドを引数として呼び出すことです。var
=23
var = 23
var
=
23
答え2
var=23
変数に23を割り当てますvar
。
var =23
var
引数を使用してコマンド(またはエイリアスまたは関数)を実行してみてください。=23
var = 23
上記と同じですが、引数=
と23
var= 23
環境変数をvar
空の文字列に設定し、コマンドを実行します。23
はい、シェルはプログラミング言語として奇妙です。しかし、それは完全に意味がありますシェル対話型使用のために、スペースはコマンドと引数を区別します。ほとんどの「特殊文字」(=
この場合)は、コマンドのほぼランダムな引数を可能にするために、特定の場所でのみ特別な意味を持ちます。上記の説明をご覧ください。
答え3
var=23
変数に値を割り当てる正しい構文です。var =23
var
コマンド=23
オプション/引数を持つコマンドとして扱われますvar
(引数/オプションの正しい/標準構文は、-option
またはそれにもかかわらず--option
)。var= 23
var
スペースは割り当てプロセスを妨げ、23
他のコマンドで処理されるため、何も割り当てません。解決策はスペースを使用var=\ 23
またはvar=' 23'
保存することです。var = 23
2番目のケースで説明したのと同様の効果があります。実際、これらの周辺空間の活用は
=
内部状態をテストするためによく使用されます[[ ]]
。大きな打撃の例:string1 = string2 True if the strings are equal. = should be used with the test command for POSIX conformance. When used with the [[ command, this performs pattern matching as described above (Compound Commands).
結局のところ、周囲のスペースの動作は=
シェルとプログラミング言語によって異なります。