【问题标题】:A strange error of 'let' in bash [duplicate]bash中'let'的一个奇怪错误[重复]
【发布时间】:2017-12-27 09:35:35
【问题描述】:

不知道下面的代码是不是语法错误?

#!/bin/bash
set -e
let "time_used = 1 - 1"
echo $time_used

当我运行它时,什么也没有打印出来。该脚本于let "time_used = 1 - 1" 终止。

如果我在第二行删除set -e,我会得到正确的结果0

为什么会这样?

【问题讨论】:

  • 见:help let
  • 你可以通过尝试非零情况来弄清楚,比如let "time_used = 2 - 1",在这种情况下你会看到echo输出

标签: bash


【解决方案1】:

let 是一个 bash built-in 用于 shell 算术

let "time_used = 1 - 1"

等价于

(( time_used = 1 - 1 ))

但是shell算术中的0表示错误并给出错误退出状态以避免在命令后添加-e|| true

(( 0 )) || true
let "time_used = 1 - 1" || true

|| true 允许为返回错误退出状态的命令“绕过”-e 选项,但是我们无法区分失败的命令和返回错误退出状态的命令。其他选项可以是使用算术来始终返回真实值。

(( (time_used = 1 - 1) || 1))

【讨论】:

  • OP 正在使用set -e
  • 它没有!查看其他答案
  • 好的,我正在更新我的答案
  • 非常感谢。为什么设计成这样?这是一个糟糕的设计吗?
  • -e 选项不是默认选项,这似乎更乏味,但最好在每个命令出现错误时明确退出:command to check || exit 1 就足够了,因为通常失败的命令会在 stderr 上写入消息,否则添加定义函数的特定消息command || exit_fail "message"
【解决方案2】:

因为如果let 的结果等于0,则返回1。 在其他情况下,它返回0

$ 帮助 |尾-n2 退出状态: 如果最后一个 ARG 的值为 0,则 let 返回 1;否则返回 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多