作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
仅当变量的先验值为零时,以下带有调试选项“set -e -v”的脚本才会在增量运算符处失败。
#!/bin/bash
set -e -v
i=1; let i++; echo "I am still here"
i=0; let i++; echo "I am still here"
i=0; ((i++)); echo "I am still here"
bash(GNU bash,版本 4.0.33(1)-release (x86_64-apple-darwin10) 还有 GNU bash,版本 4.2.4(1)-release (x86_64-unknown-linux-gnu))
有什么想法吗?
最佳答案
我的问题的答案不是使用let(或shift,或...)而是使用
i=$((i+1))
当尝试通过设置“非零状态代码退出”来检查 bash 脚本时
set -e
bash 手册指出 set -e 具有“如果简单命令以非零状态退出则立即退出。”的效果。
不幸的是,let(以及 shift 和 ...)返回计算结果('如果最后一个 arg 的计算结果为 0,let 返回 1;否则返回 0')。因此,一个人得到的不是状态代码,而是某种返回值。有时这个返回值将为零,有时为一,具体取决于计算。因此 set -e 将根据您的计算结果导致脚本退出!!!除非您永远不使用它或求助于
let i++ || true
正如 arnaud576875 所指出的,顺便说一句,它增加了额外的 CPU 负担。
使用
let ++i
仅适用于 i 不为 -1 的特定情况,如 let i++ 仅适用于 i 不为 0 的情况。因此是半解。
虽然我喜欢 Unix,但我别无选择。
关于bash set -e and i=0;让i++不同意,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7247279/
我是一名优秀的程序员,十分优秀!