【问题标题】:Does syntax of bash variables change when being passed to bc?bash 变量的语法在传递给 bc 时会发生变化吗?
【发布时间】:2020-07-22 16:55:21
【问题描述】:

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

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

我的问题是关于使用的变量(m,x,counter)。为什么 bash 允许使用变量而不使用 $variable_name?

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

【问题讨论】:

  • 这些是bc 变量,而不是bash 变量。
  • 对不起。我不明白。 bc 不只是一个计算大算术表达式的工具。运行脚本对变量的处理方式与在传递给 bc 的字符串之外写入时有何不同。提前致谢。
  • @tankris:阅读man bc 了解它如何处理变量。
  • @choroba 男人!这就是我需要的。非常感谢。我假设在字符串内部,bash 程序有不同的语法。非常感谢。

标签: bc


【解决方案1】:

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

&lt;&lt;&lt; 操作符引入了一个“Here String”(参见man bash),下面的单词经过扩展,除了路径名扩展和分词,并被发送到命令的标准输入,在这种情况下为bc .

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

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

dc <<< '
100 3 /
p'

另请注意,bash 使用$x${x},而不是$(x)(这将运行命令x 并返回其输出)。不过,$(x) 的变量 x 在 Makefiles 中使用。

【讨论】:

  • 我想知道的是,是 x、m 等 bash 变量吗?如果我没记错的话,一旦声明,bash 变量需要使用 $variable_name 访问。但是,这个程序显然没有这样做(除了我理解的第一个参数 $1 的情况)。
  • 双引号中的整个内容是一个bc 程序。对于 bash,它只是一个字符串。
  • 感谢您的及时回复。我有点困惑。那么字符串中使用的语言是什么?
  • 如前所述,字符串被发送到&lt;&lt;&lt;左侧命令的标准输入。如果它恰好是一个语言解释器(bcpythondc 等等),它会将字符串解释为一个程序并运行它。
【解决方案2】:

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

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

【讨论】:

  • 原谅我的无知,但如果我没记错的话,这确实属于 bash,因为它以 !/bin/bash 开头,对吧?
  • @tankris 您的问题与 bash 相关,因为您询问的是 bash 在解释此脚本的逻辑中的作用。鉴于您现在所知道的,如果您试图修复 bc 脚本中的数学错误,您可以想象它纯粹是一个 bc 问题而不是 bash 问题(除非问题是正确调用脚本,而不是编写首先是脚本)
  • @thatotherguy 谢谢。我将删除 bash 标签。请让我知道我是否可以做任何其他事情来提高问题/描述的清晰度,以帮助遇到类似问题的其他人。
  • 不需要去掉标签;我只是想指出bash 不参与字符串的解释。
猜你喜欢
  • 2020-04-15
  • 2019-10-29
  • 1970-01-01
  • 2022-11-26
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
相关资源
最近更新 更多