bash中'let'的一个奇怪错误

jin*_*nge 5 bash

我想知道下面的代码是否有错误的语法?

#!/bin/bash
set -e
let "time_used = 1 - 1"
echo $time_used
Run Code Online (Sandbox Code Playgroud)

当我运行它时,没有打印任何内容。剧本死了let "time_used = 1 - 1"

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

为什么会发生?

Nah*_*eul 5

let 是shell 算法的内置 bash

let "time_used = 1 - 1"
Run Code Online (Sandbox Code Playgroud)

相当于

(( time_used = 1 - 1 ))
Run Code Online (Sandbox Code Playgroud)

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

(( 0 )) || true
let "time_used = 1 - 1" || true
Run Code Online (Sandbox Code Playgroud)

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

(( (time_used = 1 - 1) || 1))
Run Code Online (Sandbox Code Playgroud)