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 一个错误代码。
我认为这是有效代码:
#!/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 一个错误代码。