var=$[3 * 2]直感的な認識と競合しているようです[閉じる]

var=$[3 * 2]直感的な認識と競合しているようです[閉じる]

$外が嫌いです。var3=$[$var1 * $var2]

次のスクリプトがあるとします。

$ var1=5; var2=6; var3=$[$var1 * $var2]; echo $var3
30

削除すると$エラーが報告されます。

$ var1=5; var2=6; var3=[$var1 * $var2]; echo $var3
-bash: Algorithms: command not found
30
$ var=[3 * 2]; echo $var
-bash: Algorithms: command not found
[3*2]

そう言うと気持ちが変です。

$ var=$[3 * 2]; echo $var
6

直感的に実行可能性は高い。

$ var=$6; echo $var

これは変です。

文法にこれを実行させるメカニズムは何ですか?

変数置換ですか?

ベストアンサー1

文法$[ ... ](および標準形式$(( ... )))は内容を算術表現として解釈します。そうでなければそう$ではありません。まったく異なると解釈されることがあります。echo結果を直接入力すると、これをよりよく見ることができます。

$ var1=5; var2=6
$ echo $[$var1 * $var2]    # This gets interpreted as arithmetic
30
$ echo [$var1 * $var2]    # This doesn't
[5 file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt 6]

ここで、および[$var1$var2]完全に独立した文字列として扱われ、それぞれ「[5」と「6]」と評価されます。一方、*ファイル名はワイルドカードとして解釈され、現在のディレクトリのファイルリストに展開されます。それでは、コマンドを発行してください。

$ var3=[$var1 * $var2]
-bash: file1.txt: command not found

何が起こるかは上記と非常に似ています。*ファイルのリストに展開されるため、コマンドは機能します。

var3=[5 file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt 6]

var=value command arguments......これは、「file2.txt」、「file3.txt」などのパラメータを持つコマンドの変数を「[5」に設定しようとすると解釈されます。あなたの場合を除き、現在のディレクトリ(またはディレクトリ)の最初のファイル名は、「file1.txt」の代わりに「Algorithms」と指定されます。どちらの場合も、有効なコマンド名ではないため、「コマンドが見つかりません」というエラーが発生します。var3file1.txt

ちなみに@devWeekが指摘したように、$[ ]これ以上使用されていないので、代わりに使用する必要があります$(( ))。しかし、繰り返しますが、これは$オプションではありません。

$ echo $(($var1 * $var2))    # This gets interpreted as arithmetic
30
$ echo (($var1 * $var2))    # This doesn't
-bash: syntax error near unexpected token `('

しかし、$6意味はまだ異なります。現在のスクリプト/関数/その他のコンテンツの6番目のパラメータを表します。対話型シェルには通常引数がないため、空であると評価されます。

$ echo $[ 6 ] placeholder    # This gets interpreted as arithmetic
6 placeholder
$ echo $6 placeholder    # This doesn't
placeholder

基本的なポイント:シェル構文はとてもトリッキーです、特に直感的ではありません。 1つまたは2つの記号を省略すると(または間違った場所にスペースを追加または削除しても)意味が完全に変わります。

おすすめ記事