顯然,在$?下面的代碼中分配給指定回傳碼的退出狀態不是來自uno, dos,tres命令。如何正確處理?
我必須多次運行這三個命令,因為我不想執行dos和/或tres如果uno失敗,并且tres如果uno或dos失敗 - 我重新開始。換句話說:如果第一個/第一個失敗,繼續下去是沒有意義的。
實際程式中函式呼叫不止3個,其實函式呼叫有7個;該片段被簡化了一點。
local return_code=1
while (("${passed_time_in_seconds}" <= "${seconds_to_wait_for}")); do
if uno; uno_return_code=$? \
&& dos; dos_return_code=$? \
&& tres; tres_return_code=$?; then
return_code=0
break
else
sleep "${seconds_to_sleep}"
current_time_in_seconds=$(date %s)
passed_time_in_seconds=$(get_passed_time_in_seconds "${start_time_in_seconds}" "${current_time_in_seconds}")
fi
done
if [[ return_code -ne 0 ]]; then
do some checks on uno_return_code, dos_return_code, tres_return_code
fi
uj5u.com熱心網友回復:
命令串列的退出狀態是最后執行的命令的退出狀態。
分配的退出狀態(沒有任何命令替換)始終為 0。
if
uno
uno_return_code=$? && dos;
dos_return_code=$? && tres;
tres_return_code=$?
# ^^^^^^ last command executed, only it matters for `if`
# exit status of assignment is always 0
# 0 means success
then
: this will always execute
fi
而是檢查它們。
此外,在檢查超時時,檢查結束更容易(也更安全),然后每次計算差異。
return_code=1
# on bash use we can use (EPOCH-)SECONDS instead of date %s!
end=$((SECONDS seconds_to_wait_for))
while ((SECONDS < end)); do
uno
uno_return_code=$?
dos
dos_return_code=$?
tres
tres_return_code=$?
if ((uno_return_code == 0 && dos_return_code == 0 &&
tres_return_code == 0)); then
return_code=0
break
fi
done
if (( !return_code )); then
: something
fi
也許您的意思是“僅在 uno 成功時才執行 dos”。我會詳細而明確地做到這一點,例如:
uno
uno_return_code=$?
if ((!uno_return_code)); then
dos
dos_return_code=$?
if ((!dos_return_code)); then
tres
tres_return_code=$?
if ((!tres_return_code)); then
break
fi
fi
fi
或者它可能看起來更好continue:
uno
uno_return_code=$?
if ((uno_return_code)); then continue; fi
dos
dos_return_code=$?
if ((!dos_return_code)); then continue; fi
tres
tres_return_code=$?
if ((!tres_return_code)); then continue; fi
break
總的來說,我喜歡交換檢查超時和條件。您正在等待命令,而不是等待超時。這也注意如果超時為零,條件仍將執行一次。
while
uno
uno_return_code=$?
if ((!uno_return_code)); then
dos
dos_return_code=$?
if ((!dos_return_code)); then
tres
tres_return_code=$?
fi
fi
(( uno_return_code != 0 || dos_return_code != 0 ||
tres_return_code != 0 ))
do
if ((SECONDS > end)); do
break;
done
sleep "${seconds_to_sleep}"
done
uj5u.com熱心網友回復:
對于一個很好的解決方案演示,我制作了函式uno() dos(),tres()并且會因不同的回傳碼而失敗 3 次,而不是成功。
我洗掉了所有睡眠/約會的東西,這對你的問題并不重要。
#!/bin/bash
uno() {
echo "Executed uno"
((i ))
((i>3)) || return $i
}
dos() {
echo "Executed dos"
((j ))
((j>3)) || return $j
}
tres() {
echo "Executed tres"
((k ))
((k>3)) || return $k
}
i=0
j=0
k=0
for ((n=0;n<12;n )); do
lastf=uno && uno &&
lastf=dos && dos &&
lastf=tres && tres
echo "Function ${lastf} returned $?"
echo "zzzzzzzzzzzzzzzzzzzzzz Something with sleep zzzzzzzzzzzzzzzzzzzzzzzzzz"
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/408876.html
標籤:
上一篇:這里的檔案如何在shell中作業
