Bash

當 let 或 expr 計算為 0 時 bash -e 退出

  • October 19, 2018

我有一個設置 -e 的 bash 腳本,因此腳本將在任何退出狀態下退出!= 0。

我正在嘗試做一些分配給變數的基本 shell 算術,有時表達式等於 0,這會導致 let 或 expr 命令的退出狀態為“1”。

這是一個例子:

#!/bin/bash -ex
echo "Test 1"
Z=`expr 1 - 1` || true
echo "Z will print"
let "A=4 - 4"
echo "A WILL NEVER PRINT $A"
Y=`expr 1 - 1`
echo "Y WILL NEVER PRINT $Y"
X=$(expr 2 - 2)
echo "X WILL NEVER PRINT $X"

輸出是:

$ ./test_error.sh 
+ echo 'Test 1'
Test 1
++ expr 1 - 1
+ Z=0
+ true
+ echo 'Z will print'
Z will print
+ let 'A=4 - 4'

我的問題是什麼是慣用的 bash 腳本編寫方式來允許腳本在真正的退出錯誤而不是在等於 0 的基本算術上失敗。我可以在所有這些表達式後綴:

A=`expr $C - $D`    || true

但這似乎很老套。

不要expr用於算術。它早就過時了:shell 現在內置了算術,帶有$((…))構造 (POSIX),或者帶有let內置 (ksh/bash/zsh) 或((…))構造 (ksh/bash/zsh)。

let如果最後評估的表達式為 0 ,((…))則返回 1(失敗狀態程式碼)。為避免這導致腳本在 下退出set -e,請安排最後一個表達式不返回 0,例如:

let "a = 2 - 2" 1
((a = 2 - 2, 1))

或者,使用|| true成語:

((a = 2 - 2)) || true

或者,在裡面做算術$((…)),在外面做作業。賦值返回值中最後一個命令替換的狀態,如果沒有命令替換,則返回 0,因此您是安全的。這具有在任何 POSIX shell(例如 dash)中工作的額外好處。

a=$((2 - 2))

引用自:https://unix.stackexchange.com/questions/63166