let count=0 有什么问题?

What is wrong with let count=0?

我认为这是有效代码:

#!/bin/bash

set -o errtrace

failure()
{
    local lineno=
    local msg=
    echo "Failed at $lineno: $msg"
    exit
}
trap 'failure ${LINENO} "$BASH_COMMAND"' ERR

let count=0

但不幸的是,我收到错误消息“在 14 点失败:让 count=0”

let count=0 可能有什么问题?

编辑

删除 let 可以防止错误,但稍后当我使用 let count++ 时仍然会出错。我认为这两种说法都是完全正确的。

来自手册:

   let arg [arg ...]
          Each arg is an arithmetic expression to be evaluated (see ARITH-
          METIC EVALUATION above).  If the last arg evaluates  to  0,  let
          returns 1; 0 is returned otherwise.

请注意 let 特别是 用于评估算术表达式,而不是任意变量赋值。算术表达式包括赋值,例如:

$ let "x = 3"
$ echo "$x"
3

但你可以使用任何算术表达式:

$ let "3 + 5"; echo $?
0
$ let "3 - 3"; echo $?
1

退出状态不是表达式的,而是表示值是0还是非零。赋值的值是被赋值的值。

通常情况下,如果你想计算一个算术表达式,写 count=$((...)) 而不是 let count=... 更安全,这样你就不必担心杂散的非零退出状态。

let 在现代 bash.

中有效地被算术语句 ((...)) 取代

不幸的是,在 bash 中似乎没有处理错误的好方法,考虑到错误代码并不总是意味着错误。我找不到确定错误代码是否意味着有错误的方法。我找到了 2 个问题的解决方案:

1 ) 管道为 true 或使用 ||是的。

let count=0 | true
let count++ | true

# Or
let count=0 || true
let count++ || true

2 ) 关闭错误处理程序行为以抑制该行为。

failure()
{
    if (( errsOff == 0 )); then
        local fileName=[=11=]
        local lineMo=
        local message=
        echo "Failed at $lineMo, in file $fileName: $message"
        exit
    fi
}
trap 'failure ${LINENO} "$BASH_COMMAND"' ERR

declare -g errsOff=0

errsOff=1
let count=0
let count++
errsOff=0

对于我自己编写的函数,我可以通过使用 echo 到 return 一个值来避免这个问题,而使用 return 仅用于 return 一个错误代码。