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直接 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”。无论哪种情况,它都不是有效的命令名称,因此您会收到“找不到命令”错误。var3file1.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

相关内容