
我有一個用例,其中Dummy.sh
加載數據並fix.sh
修復有問題的數據,然後再次加載數據。如果修復腳本在 3 次嘗試中無法解決問題,我必須實作重試邏輯。
但它進入遞歸調用,其中一個腳本在無限循環中調用另一個腳本。
有人可以指出我的錯誤或建議任何其他解決方案嗎?
假人.sh
#!/bin/bash -x
echo "Load data"
/home/user/etc/fix.sh
修復程式
#!/bin/bash -x
TEMCOUNTER_TMP=FILE_NAME"_tmp6"
RETRY_C=0
echo $RETRY_C > $TEMCOUNTER_TMP
RETRY_LOGIC=`cat /home/user/etc/$TEMCOUNTER_TMP`
echo $RETRY_LOGIC
while [ $RETRY_LOGIC -le 3 ]
do
/home/user/etc/Dummy.sh
RETRY_LOGIC=`expr $RETRY_LOGIC + 1`
echo $RETRY_LOGIC > $TEMCOUNTER_TMP
done
作業系統:SunOS 5.10 Generic_144488-06 sun4u sparc SUNW、Sun-Fire-V210
PS:除了呼叫之外,我無法在 Dummy.sh 中實作任何邏輯fix.sh
答案1
這裡有幾個問題。主要是,您迭代兩個循環,一個在內部fix.sh
(使用 while 循環),然後透過回呼 再次遞歸dummy.sh
。另外,您在 開始時將計數器檔案重設為零fix.sh
,因此它永遠無法計數。您也可以向後排序,因此(遞歸)呼叫會dummy.sh
在遞增計數器之前發生。
假設只需要遞歸行為(因為您可以更改 dummy.sh):
修復程式
#!/bin/bash -x
TEMCOUNTER_TMP=/home/user/etc/FILE_NAME"_tmp6"
RETRY_LOGIC=`cat $TEMCOUNTER_TMP`
echo $RETRY_LOGIC
# Does RETRY_LOGIC have a value?
if [ -z "$RETRY_LOGIC" ]
then
RETRY_LOGIC=0
echo 0 > $TEMCOUNTER_TMP
fi
# Try to apply fix
[ $((RANDOM %3)) = 0 ]
# Did it work?
if [ $? = 0 ]
then
echo "Success!"
rm $TEMCOUNTER_TMP
exit
fi
if [ $RETRY_LOGIC -le 3 ]
then
export RETRY_LOGIC=`expr $RETRY_LOGIC + 1`
echo $RETRY_LOGIC > $TEMCOUNTER_TMP
echo "Retrying..."
/home/user/etc/Dummy.sh
else
echo "Giving up"
rm $TEMCOUNTER_TMP
fi
另外,請仔細檢查您的路徑,您僅在一個位置TEMCOUNTER_TMP
為變數添加了前綴。/home/user/etc/
請注意,export
命令$RETRY_LOGIC
在後續嘗試中可用,因此只要變數不在其他地方使用,您就可以刪除引用的所有行TEMCOUNTER_TMP
並且它的工作方式相同。如果你做需要該文件,請注意陷阱之後清理可能會更好。