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つの記号を省略すると(または間違った場所にスペースを追加または削除しても)意味が完全に変わります。

答え2

コマンドエイリアス[= testはLinuxで使用されるため、[文字もtestコマンドを呼び出します。

この試みを証明するためにman [

実際、BASHの$(xstr)解析に関連する問題やバグレポートを公開しようとしています。私の考えでは、評価は$(0)のように起こり、データストリームは常にbashの$ 0変数に注入されます。

一部の言語では$文字が文字列に使用されますが、bashではコマンドライン引数(引数とも呼ばれます)に使用され、sedコマンドで使用される正規表現では$は終了キーです。

man bash展開の順序を学ぶために読まなければならないと思います。

私はBASHが$文字を見たときにBASHを再実行するときにメモリリークに見えることに大きな変化を説明したいと思います。

見せてあげるよ

//上位コマンドを無視してiボタン[1]+上段停止

root@ubuntu-studio:/var# echo $0
bash
root@ubuntu-studio:/var# echo $(0)
0: command not found

関連情報