【问题标题】:Why '$' can be omitted within let construct为什么在 let 构造中可以省略“$”
【发布时间】:2017-07-08 09:27:01
【问题描述】:

$ 符号可以在 let(( ... )) 结构中省略。

鉴于$ 在使用ifwhile 时是强制性的,为什么会这样?

【问题讨论】:

  • 因为$放在((因此指定双括号内的变量需要展开。
  • 我认为这来自 ksh,所以答案将是 因为 David Korn 在他的 shell 添加 $(())(())let 时想要这样做
  • 顺便说一句:考虑到let 和@ 987654336@也可以作为ifwhile的条件句;例如,if let 'foo == 1'; then echo yes; else echo no; fiif (( foo == 1 )); then echo yes; else echo no; fi
  • @RamanSailopal:请注意,问题是关于使用$ inside (( … )),以便引用变量,而不是关于(( … ))$(( … ))。此外,是否以及使用什么语法变量在内部扩展与选择 (( … ))$(( … )) 无关 - 唯一的区别是后者 输出 算术计算的结果,而前者没有。

标签: bash syntax scripting


【解决方案1】:

算术表达式处理整数,而不是字符串。因此,如果一个字符串出现在表达式中,解释它的唯一合理方法是将其作为一个变量展开(根据需要递归),直到得到一个整数。

在其他情况下,字符串是允许的,因此区分字符串foo 和变量foo 的值的唯一方法是有一个显式的参数扩展语法(foo 是一个字符串,@ 987654324@ 产生参数foo 的值。

这一切的根源在于 shell 不会将变量传递给函数或命令;您实际上只是扩展宏并传递结果值。

【讨论】:

    【解决方案2】:
    ((i++)) or let i++
    

    只是增加 i。它是对值执行的操作。
    它返回任何内容,但返回一个退出代码。

    var=$((i+2))
    

    将 $((i+2)) 扩展到其总和。
    它返回一个结果

    【讨论】:

    • 这不是真的;如果 i 为 0, ((++i)) 将返回 0 - 非零结果成功; ((i++)) 将返回 1 - false,因为它在之后变得递增
    • 好吧,我的意思是算术上下文,而不是退出代码布尔值。做了一些修改。
    • 是的,但问题是关于使用$ inside (( … )),以便引用变量,而不是关于(( … ))$(( … )) 之间的区别.为避免术语混淆,我建议仅使用单词 return 来指代退出代码,而生成的数据是 [stdout] 输出。换句话说:$((…)) 产生输出,而((…))let 不产生。所有这些 - 总是作为 any 命令 - 返回一个退出代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2018-04-27
    • 2015-12-29
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多