【问题标题】:Why does "let" sometimes exit when run with bash -e? [duplicate]为什么使用 bash -e 运行时“让”有时会退出? [复制]
【发布时间】:2020-04-30 03:01:51
【问题描述】:

a.sh的内容是

echo start
let index=(RANDOM % 4)
echo $index

a.sh 有时无法生成数字

gqqnbig@instance-1:~/test/systemd$ vim a.sh
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
3
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
3
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
2
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
2
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
2
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
3
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
3
gqqnbig@instance-1:~/test/systemd$ bash -e a.sh
start
gqqnbig@instance-1:~/test/systemd$ echo $?
1
gqqnbig@instance-1:~/test/systemd$

看我上次运行a.sh,它只输出“start”,不输出index,说明let index=(RANDOM % 4)有问题,退出码为1。

为什么 RANDOM 变量会产生这种随机错误?我该如何解决?

【问题讨论】:

  • 如果你使用let index=($RANDOM % 4)会发生什么?
  • 没关系,我观察到两种组合的行为相同。一个简单的触发测试:for i in {1..10}; do { let test=($RANDOM % 4) && echo $test; } || break; done。它将尝试 10 次(在我的情况下肯定会失败),在第一次失败时中断。
  • 如果使用传统的算术扩展而不是let,它不会失败。
  • @Oppen 你读过发布的答案了吗?
  • 查看BashFAQ #105 中的练习,了解bash -e 使您的代码更难预测、更难移植、更依赖上下文和更难以可靠审查的各种方式。

标签: linux bash


【解决方案1】:

使用-e 会导致bash 在出错时终止。

let 计算结果为0 时,它被认为是一个错误。 Bash 将在打印值 0 之前终止脚本。


为避免意外终止,您可以使用以下方法之一:

  1. 不要使用-e标志

  2. 确保语句始终成功:

let 'index=(RANDOM % 4)' || true

let 'index=(RANDOM % 4)' || :
  1. 避免使用let(根据@LéaGris):
index=$((RANDOM % 4))

【讨论】:

  • 为了防止算术表达式返回失败,请改用这种形式:bash -ec 'for i in {1..10}; do { test=$((RANDOM % 4)); echo $test; } || break; done'
  • 我没有说明我理解-e 标志的含义,但我无权删除此标志。这是 GitHub Actions 中的默认标志,他们这样做是有原因的。不过非常感谢let的解释。
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2019-10-07
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多