AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 571801
Accepted
glarry
glarry
Asked: 2020-03-09 06:42:47 +0800 CST2020-03-09 06:42:47 +0800 CST 2020-03-09 06:42:47 +0800 CST

Bash变量递增,行为不一致

  • 772

我怀疑这是故意的(而不仅仅是一个错误)。如果是这样,请指导我查看相关文档以获取理由。

~$ i=0; ((i++)) && echo true || echo false
false
~$ i=1; ((i++)) && echo true || echo false
true

这两行之间的唯一区别是i=0vs i=1。

bash
  • 2 2 个回答
  • 219 Views

2 个回答

  • Voted
  1. Best Answer
    Arkadiusz Drabczyk
    2020-03-09T06:54:29+08:002020-03-09T06:54:29+08:00

    这是因为i++确实 进行了 post-increment,如 中所述man bash。这意味着表达式的值是 的原始值i,而不是增量值。

    ARITHMETIC EVALUATION
           The  shell  allows  arithmetic  expressions  to  be  evaluated, under certain circumstances (see the let and
           declare builtin commands and Arithmetic Expansion).  Evaluation is done  in  fixed-width  integers  with  no
           check for overflow, though division by 0 is trapped and flagged as an error.  The operators and their prece-
           dence, associativity, and values are the same as in the C language.  The  following  list  of  operators  is
           grouped into levels of equal-precedence operators.  The levels are listed in order of decreasing precedence.
    
           id++ id--
                  variable post-increment and post-decrement
    

    以便:

    i=0; ((i++)) && echo true || echo false
    

    行为像:

    i=0; ((0)) && echo true || echo false
    

    除了i也增加了;然后:

    i=1; ((i++)) && echo true || echo false
    

    行为像:

    i=1; ((1)) && echo true || echo false
    

    除了这i也增加了。

    如果值非零,则构造的返回值(( ))是truthy ( 0),反之亦然。

    您还可以测试后增量运算符是如何工作的:

    $ i=0
    $ echo $((i++))
    0
    $ echo $i
    1
    

    和预增量进行比较:

    $ i=0
    $ echo $((++i))
    1
    $ echo $i
    1
    
    • 8
  2. user373503
    2020-03-09T06:56:21+08:002020-03-09T06:56:21+08:00
    ]# i=0; ((i++)) && echo true || echo false
    false
    
    ]# i=0; ((++i)) && echo true || echo false
    true
    

    an 的“返回”值((expression))取决于前缀或后缀。然后逻辑是这样的:

         ((expression))
    
         The expression is evaluated according to the rules described be low under ARITHMETIC EVALUATION.
    
         If the value of the expression is non-zero,
         the return status is 0; 
    
         otherwise the return status is 1.
    

    这意味着它被转为正常,而不是像返回值。

    • 3

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve