var=$[3 * 2] 似乎与直觉相冲突

Abs*_*cDo -1 bash

我感到困惑外$var3=$[$var1 * $var2]

假设有以下脚本:

$ var1=5; var2=6; var3=$[$var1 * $var2]; echo $var3
30
Run Code Online (Sandbox Code Playgroud)

如果$删除,则报错:

$ 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]
Run Code Online (Sandbox Code Playgroud)

我觉得声明很奇怪;

$ var=$[3 * 2]; echo $var
6
Run Code Online (Sandbox Code Playgroud)

从直觉上很可能执行:

$ var=$6; echo $var
Run Code Online (Sandbox Code Playgroud)

这很奇怪。

强制语法应该这样做的机制是什么?

是变量替换吗?

Gor*_*son 5

语法$[ ... ](和标准形式,$(( ... )))将它们的内容解释为算术表达式。没有$,它不会。它可能会将其解释为完全不同的东西。你可以通过echo直接 ing 结果更好地看到这一点:

$ 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]
Run Code Online (Sandbox Code Playgroud)

在这里,[$var1$var2]被视为完全独立的字符串,分别计算为“[5”和“6]”。的*,而另一方面,得到了解释为一个文件名通配符并扩展到文件列表在当前目录。现在,就您的命令而言:

$ var3=[$var1 * $var2]
-bash: file1.txt: command not found
Run Code Online (Sandbox Code Playgroud)

发生的事情与上面的非常相似:*扩展为文件列表,因此该命令有效:

var3=[5 file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt 6]
Run Code Online (Sandbox Code Playgroud)

...这被解释为var=value command arguments...,即它尝试var3将命令的变量设置为“[5”,file1.txt参数为“file2.txt”、“file3.txt”等。除了在您的情况下,第一个文件(或目录)在当前目录中命名为“Algorithms”而不是“file1.txt”。在任何一种情况下,它都不是有效的命令名称,因此您会收到“找不到命令”错误。

顺便说一句,正如@devWeek 指出的那样,$[ ]已被弃用,您应该$(( ))改用它。但同样,这$不是可选的:

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

BTW2,$6意味着仍然不同的东西;它指的是当前脚本/函数/任何东西的第六个参数。在交互式 shell 中,通常没有任何参数,因此它将评估为空:

$ echo $[ 6 ] placeholder    # This gets interpreted as arithmetic
6 placeholder
$ echo $6 placeholder    # This doesn't
placeholder
Run Code Online (Sandbox Code Playgroud)

基本要点:shell 语法非常挑剔,而且不是特别直观。去掉一两个符号(甚至只是在错误的地方添加或删除一个空格),你就完全改变了意思。