我感到困惑外$的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)
这很奇怪。
强制语法应该这样做的机制是什么?
是变量替换吗?
语法$[ ... ](和标准形式,$(( ... )))将它们的内容解释为算术表达式。没有$,它不会。它可能会将其解释为完全不同的东西。你可以通过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 语法非常挑剔,而且不是特别直观。去掉一两个符号(甚至只是在错误的地方添加或删除一个空格),你就完全改变了意思。
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |