我对外$
在感到困惑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
直接 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]
在这里,[$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]
...这被解释为,即它尝试将带有参数“file2.txt”、“file3.txt”等的命令的var=value command arguments...
变量设置为“[5”。除了您的情况之外,第一个文件当前目录中的(或目录)名为“Algorithms”而不是“file1.txt”。无论哪种情况,它都不是有效的命令名称,因此您会收到“找不到命令”错误。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 `('
BTW2,$6
意思还是不同的;它指的是当前脚本/函数/其他内容的第六个参数。在交互式 shell 中,通常没有任何参数,因此它的计算结果为空:
$ echo $[ 6 ] placeholder # This gets interpreted as arithmetic
6 placeholder
$ echo $6 placeholder # This doesn't
placeholder
基本要点:shell 语法是极其挑剔,而且不是特别直观。省略一两个符号(甚至只是在错误的位置添加或删除空格),您就完全改变了含义。
答案2
命令别名 [=test 已在 Linux 上使用,因此 [ 字符也调用 test 命令。
为了证明这一尝试man [
我实际上试图发布有关 BASH 中 $(xstr) 解析的问题或错误报告。我认为评估像 $(0) 一样发生,并且数据流被注入到 $0 变量,该变量始终是 bash。
需要注意的是,在某些语言中 $ 字符用于字符串,但在 bash 中它用于命令行参数(也称为参数),在 sed 命令中使用的正则表达式中 $ 相当于按 END 键。
我发现你需要阅读man bash
来学习展开的顺序。
我试图解释当 BASH 查看 $ 字符时再次运行 BASH 似乎是内存泄漏的巨大变化。
我来给你展示
//忽略顶部命令然后我按钮[1]+停止顶部
root@ubuntu-studio:/var# echo $0
bash
root@ubuntu-studio:/var# echo $(0)
0: command not found