Bash
當 let 或 expr 計算為 0 時 bash -e 退出
我有一個設置 -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))