シェルスクリプトの変数割り当てのスペース


17

以下の変数の割り当ての違いは何ですか?

var=23
var =23
var= 23
var = 23

代入演算子の周りのスペースに違いはありますか?


ほとんどのプログラミング言語では、これはまったく違いはありません...実際に違いはありますか?また、あなたはここでオールドスクールのshを話している?ash / zsh / bashまたはその他の新しいものではありませんか?
セスタリアン

最初の例のみが変数を設定します。
DisplayName

次に、最後の3つは構文エラーをスローしませんか?または実際に意味を持っていますか?
セスタリアン

2
彼らは何かを意味することができ@Cestarianあなたが呼ばれるコマンドがある場合は、varその後のvar =23パスになり=23VARに、そしてvar = 23通過する=23VARへ。それとも、あなたが呼ばれるコマンドがある場合はvar=、その後をvar= 23通過する23コマンドにvar=
DisplayName

1
@Cestarianに置き換えられますbash。これは、sh4つの場合すべてとまったく同じことを行います。
-pfnuesel

回答:


14

それはシェルに大きく依存します。4つのメインシェルファミリ(Bourne、csh、rc、fish)のみを見る場合:

ボーンファミリー

これは、Bourneシェルとそのすべての亜種であるとkshbashash/ dashzshyash

  • var=23:それは正しい変数割り当て構文です:引用符で囲まれていない文字、数字、またはアンダースコアで構成され、=コマンド引数の前に現れる引用符で囲まれていない単語(ここでは単独)
  • var =23、引数としてのvarコマンド=23zshwhere =somethingsomethingコマンドのパスに展開する特別な演算子です。ここで23は、有効なコマンド名ではない可能性が高いため、エラーが発生する可能性があります)。
  • var= 23:割り当てのvar=後にコマンド名が続き23ます。これは、実行するためのものだ23var=その環境(に渡されたvar空の値を持つ環境変数)。
  • var = 23、および引数としてのvarコマンド。たとえばで試してみてください。=23echo = 23

Cshファミリー

cshおよびtcsh。そこにある変数の割り当てはset var = value、スカラー変数、set var = (a b)配列、setenv var value環境変数、@ var=1+1割り当て、および算術評価の構文を使用しています。

そう:

  • var=23var=23コマンドを呼び出すだけです。
  • var =23引数としてvarコマンドを呼び出して=23います。
  • var= 23引数としてvar=コマンドを呼び出して23います
  • var = 23およびを引数としてvarコマンドを呼び出しています。=23

Rcファミリー

それがrcesそしてakanga。これらのシェルでは、変数は配列であり、割り当てはでありvar = (foo bar)var = foo短いvar = (foo)(1つのfoo要素を持つ配列)とvar =短いvar = ()(1つの要素がないvar = ''配列、1つの空の要素を持つ配列に使用)です。

いずれの場合でも、周囲の空白(スペースまたはタブ)=は許可され、オプションです。したがって、これらのシェルでは、これらの4つのコマンドはvar = (23)、1つの要素を持つ配列を割り当てるのと同等であり、同等23です。

ではfish、変数割り当て構文はset var value1 value2です。のようにrc、変数は配列です。

したがって、動作はの場合と同じになりますが、名前にaを指定してコマンドを実行するcshことfishはできません=。そのようなコマンドがある場合は、次のようにして呼び出す必要がありshますsh -c 'exec weird===cmd'

だから、すべてvar=23var= 23あなたにエラーを与えるだろう、var =23呼ぶvarとコマンドを=23引数としてとvar = 23呼ぶvarにコマンドを=し、23引数として。


8

var=2323を変数に割り当てますvar

var =23var引数付きでコマンド(またはエイリアス、または関数)を実行しようとします=23

var = 23同じですが、引数=23

var= 23セットのvar空白文字列に環境変数は、コマンドを実行します23

はい、シェルはプログラミング言語としては奇妙です。しかし、コマンドと引数をスペースで区切る、インタラクティブな使用のためのシェルとしては完全に理にかなっています。ほとんどの「特殊文字」(=この場合)は、コマンドへのほぼ任意の引数を許可するために、特定の位置でのみ特別な意味を持ちます。上記の解釈を参照してください。


3
  • var=23 変数に値を割り当てるための正しい構文です。
  • var =23コマンドのオプション/引数をvar持つコマンドと見なされ=23ますvar(ただし、引数/オプションの正しい/標準の構文は-optionまたはです--option
  • var= 23var空白が割り当てのプロセスを中断し、23別のコマンドと見なされるため、何にも割り当てられません。回避策は、var=\ 23またはvar=' 23'空白を保存することです。
  • var = 232 番目のケースで説明したのと同様の効果があります。

    実際には、このタイプの周りのスペースの使用=は通常、内部の状態をテストする際に使用されます[[ ]]。Bashの例:

    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).

そして、結局のところ、空白の動作は=シェルとプログラミング言語に依存します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.