我有一個 CI 管道的包裝器腳本,它運行良好,但它總是回傳 0,即使 for 回圈中的子命令失敗。下面是一個例子:
#!/bin/bash
file_list=("file1 file2 file_nonexistant file3")
for file in $file_list
do
cat $file
done
>./listfiles.sh
file1 contents
file2 contents
cat: file_nonexistant: No such file or directory
file3 contents
>echo $?
>0
由于回圈的最后一次迭代成功,整個腳本以 0 退出。我想要的是回圈繼續失敗,如果任何回圈迭代回傳錯誤,腳本退出 1。
到目前為止我嘗試過的:
set -e但它會在迭代失敗時停止回圈并退出- 替換
done為done || exit 1- 無效 - 替換
cat $file為cat $file || continue- 無效
uj5u.com熱心網友回復:
備選方案 1
#!/bin/bash
for i in `seq 1 6`; do
if test $i == 4; then
z=1
fi
done
if [[ $z == 1 ]]; then
exit 1
fi
帶檔案
#!/bin/bash
touch ab c d e
for i in a b c d e; do
cat $i
if [[ $? -ne 0 ]]; then
fail=1
fi
done
if [[ $fail == 1 ]]; then
exit 1
fi
特殊引數$?保存最后一個命令的退出值。大于 0 的值表示失敗。所以只需將它存盤在一個變數中并在回圈后檢查它。
美元?引數實際上保存了前一個管道的退出狀態(如果存在)。如果命令被信號殺死,那么 $? 將是 128 SIGNAL。例如 128 2 在 SIGINT (ctrl c) 的情況下。
帶陷阱的過度殺傷解決方案
#!/bin/bash
trap ' echo X $FAIL; [[ $FAIL -eq 1 ]] && exit 22 ' EXIT
touch ab c d e
for i in c d e a b; do
cat $i || export FAIL=1
echo F $FAIL
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/341783.html
