加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Bash退出状态的简写增量表示法

发布时间:2020-12-16 01:15:02 所属栏目:安全 来源:网络整理
导读:我注意到bash(())表示法的返回状态明显不一致. 考虑以下 $ A=0$ ((A=A+1))$ echo $? $A0 1 但是使用其他众所周知的速记增量表示法产生: $ A=0$ ((A++))$ echo $? $A1 1 如果脚本中有内置set -e,则第二种表示法将导致脚本退出,因为((A))的退出状态返回非零.
我注意到bash(())表示法的返回状态明显不一致.
考虑以下
$> A=0
$> ((A=A+1))
$> echo $? $A
0 1

但是使用其他众所周知的速记增量表示法产生:

$> A=0
$> ((A++))
$> echo $? $A
1 1

如果脚本中有内置set -e,则第二种表示法将导致脚本退出,因为((A))的退出状态返回非零.这个问题在this related question中或多或少得到解决.但它似乎没有解释两种符号((A = A 1))和((A))退出状态的差异

((A))当且仅当A等于0时似乎返回1.(免责声明:我没有做过详尽的测试.在bash 4.1.2和4.2.25中测试过).所以最后的问题归结为:

为什么A = 0; ((A))返回1?

a是后递增:它在评估语句后递增.相比之下,增量之前.从而:
$a=0 ; ((a++)) ; echo $a $?
1 1
$a=0 ; ((++a)) ; echo $a $?
1 0

在第一种情况下,((a)),首先计算算术表达式,而a仍然为零,产生零值(因此产生非零返回状态).然后,之后,a递增.

在第二种情况下,a增加到1然后评估((…)).由于a在计算算术表达式时非零,因此返回状态为零.

来自man bash:

id++ id--
          variable post-increment and post-decrement
   ++id --id
          variable pre-increment and pre-decrement

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读