bash 变量的语法在传递给 bc 时会发生变化吗?

Does syntax of bash variables change when being passed to bc?

我注意到 Codewars 上的一个解决方案具有以下语法:

#!/bin/bash
seven () {
    bc <<< "
    scale=0
    counter=0
    m=
    while( m > 99 ) {
        counter = counter + 1
        x = m / 10
        y = m % 10
        m = x - 2 * y
    }
    print m, \", \", counter
    "
}
seven ""

我的问题是关于使用的变量(m、x、计数器)。为什么 bash 允许在不使用 $variable_name 的情况下使用变量?

是否有允许这样做的特殊情况(例如用双引号引起来的代码)?

这些不是 bash 变量,而是 bc 变量。

<<<运算符引入了一个“Here String”(参见man bash),后面的词除了路径名扩展和分词外进行扩展,并被发送到命令的标准输入, bc 在这种情况下。

您可以通过这种方式包含任何其他解释器的程序,即

python3 <<< 'x="Hello world!"
print(x)'

dc <<< '
100 3 /
p'

还要注意 bash 使用 $x${x},而不是 $(x)(那将 运行 命令 x 和 return 它的输出)。 $(x) 因为变量 x 在 Makefile 中使用。

该答案中几乎没有 bash 代码。这是一个 shell 函数,除了 运行 bc 什么都不做。此处字符串中的所有内容都是 bc 脚本,与 bash.

无关

bash 而言,这里的字符串不包含任何变量或任何可辨别的结构:它只是不透明的文本,它将提供给 bc 的标准输入。