![在 bash 中嘗試指令的次數有限](https://rvso.com/image/1543335/%E5%9C%A8%20bash%20%E4%B8%AD%E5%98%97%E8%A9%A6%E6%8C%87%E4%BB%A4%E7%9A%84%E6%AC%A1%E6%95%B8%E6%9C%89%E9%99%90.png)
想要重試函數中的命令。為了測試我寫了錯誤的命令(lsss
)。它應該嘗試 5 次並失敗,但它陷入了無限循環。
#!/bin/bash
RETRY () {
Attempt=0
Max_Attempts=5
CMD=$1
while [ $Attempt -lt $Max_Attempts ]
do
$CMD
if [ $? -eq 0 ]; then
echo "succeeded on Attempt $Attempt" >> /tmp/err.txt
break
else
Attempt=$( expr $Attempt + 1 )
echo "Command failed. Attempting $Attempt/$Max_Attempts" >> /tmp/err.txt
sleep 2
fi
done
}
LIST () {
lsss # COMMAND WRITTEN WRONGLY FOR TESTING
if [ $? -eq 0 ]; then
echo "SUCCESS"
else
RETRY LIST
echo "FAILED"
fi
}
LIST
答案1
你的「問題」中沒有任何問題。我認為問題是“為什麼?”。
每當LIST
運行lsss
失敗時,就會RETRY LIST
被呼叫。然後(從 的內部RETRY
)LIST
(as $CMD
) 再次運行,我們可以從頭開始解釋。
Bash 永遠無法進入$CMD
內部RETRY
。你的兩個函數互相調用,它們的堆疊越來越多;他們沒有一個真正存在。
我認為你的整個方法都是有缺陷的。我不知道確切的目的是什麼,但要“嘗試有限次數的命令”,這可能是您的起點:
(max=5; for n in `seq 1 $max`; do your_command && break; done)
子 shell 用於封鎖$max
目前 shell。請注意,整個命令會傳回相當正常的退出代碼。