$
外が嫌いです。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」と指定されます。どちらの場合も、有効なコマンド名ではないため、「コマンドが見つかりません」というエラーが発生します。var3
file1.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