【问题标题】:Testing a command's stored exit status with var=$?; [[ $var ]] is always true, whether 0 or 1用 var=$?; 测试命令的存储退出状态[[ $var ]] 始终为真,无论是 0 还是 1
【发布时间】:2020-02-13 12:41:06
【问题描述】:

考虑:

true; run_backup=$?
if [[ $run_backup ]]; then
  echo "The user wants to run the backup"
fi

...和...

false; run_backup=$?
if [[ $run_backup ]]; then
  echo "The user wants to run the backup"
fi

The user wants to run the backup 无论run_backup 是0(成功)还是1(假)都会发出!

这是怎么回事?

(我真正的命令,而不是truefalse,格式为zenity --question --text "...")。

【问题讨论】:

  • 请构建一个minimal reproducible example -- 尽可能短的 代码,在不更改运行时演示问题。在发布之前,应删除任何与展示特定问题行为无关的内容。
  • 也就是说——为什么zenity在问题里?并确保您的代码仍然实际工作来演示错误;没有主体的空函数是语法错误,所以这段代码肯定行不通;尝试运行它的人会得到一个错误,而不是您试图向我们展示的错误。
  • @CharlesDuffy 你必须滚动,但是RUN_BACKUPzenity 的退出状态。
  • 我希望看到编辑的描述以引用实际的函数名称和感兴趣的条件;原样......'一个条件','另一个条件','强制条件','调用一个函数','调用另一个函数','移动到下一个函数'......如果我没有太大帮助'我不得不猜测将这些通用术语映射到示例代码
  • @chepner, ...当然,但我看不出有任何正当理由让这个问题实际上包括 zenity。硬编码RUN_BACKUP=0 将使没有 zenity 的复制者可以测试(如果它没有,则 OP 可以将问题缩小到仅关于 zenity 而没有其他问题)。

标签: bash function return


【解决方案1】:

答案是肯定的,因为 0 和 1 都不是 NULL。

【讨论】:

  • [[ NULL ]] 也会成功退出
【解决方案2】:

[[ $run_backup ]] 不是布尔检查;只有当它的参数是一个空字符串(既不是 0 也不是 1)时它才会失败。

由于zenity 如果单击“确定”会返回 0,因此您想要类似的东西

[[ $run_backup -eq 0 ]] && echo "The user wants to run the backup"

(( run_backup == 0 )) && echo "The user wants to run the backup"

# You need to negate the value because success(0)/failure(!=0) use
# the opposite convention of true(1)/false(0)
(( ! run_backup )) && echo "The user wants to run the backup"

基于run_backup 是原始问题中zenity 命令的退出状态这一事实,最简单的方法是简单地使用&&zenity 和您的函数组合成一个命令。

zenity --question --width=300 --text "..." && echo "The user wants to run the backup"

【讨论】:

  • 我已经编辑了这个问题,只关注 OP 对 bash-the-language 的潜在误解,因为很难找到一个好的副本;希望这样做不会过多地破坏这个答案。
  • 如果你点击取消 zenity 返回 null,这就是为什么条件是它的格式。但是使用退出代码是我没有想到的。
猜你喜欢
  • 1970-01-01
  • 2014-12-03
  • 2021-10-29
  • 2021-05-31
  • 1970-01-01
  • 2010-09-29
  • 2020-03-07
相关资源
最近更新 更多