我有一個bash腳本,它打印一個標題並測試值爲「Y」或「N」。bash - 如果返回代碼> = 1重新運行腳本,從頭開始
當有人輸入不等於「Y」或「N」的文本時,我想將它們發回到腳本的開頭,以便再次打印標題和問題。
我知道你可以用goto做到這一點,但我想知道是否有另一種方式,因爲我聽到很多人說你不應該使用goto或者它已被棄用。無論真實與否,我想看看是否有其他人有辦法解決這個問題。
在此先感謝。
我有一個bash腳本,它打印一個標題並測試值爲「Y」或「N」。bash - 如果返回代碼> = 1重新運行腳本,從頭開始
當有人輸入不等於「Y」或「N」的文本時,我想將它們發回到腳本的開頭,以便再次打印標題和問題。
我知道你可以用goto做到這一點,但我想知道是否有另一種方式,因爲我聽到很多人說你不應該使用goto或者它已被棄用。無論真實與否,我想看看是否有其他人有辦法解決這個問題。
在此先感謝。
作爲直接回答你的問題,你可以使用exec
更換當前進程與另一進程或當前進程的另一新副本(視情況而定)。
read -p "Yes? Or no? " yn
case $yn in
[YyNn]) ;;
*) exec "$0" "[email protected]"
esac
如果您想要更結構化的方法,您可以使用while or until loop。
你可以在一個循環中實現它:
while [ !$exit_loop ]
do
echo "enter choice - "
read -n 1 input
case "$input" in
y|Y) $exit_loop = 1;;
n|N) $exit_loop = 1;;
*) echo "invalid choice";;
esac
done
個人而言,我發現使用goto語句/迴路或其他任何方式沒有什麼區別。我總是會說要使用最適合這種情況的東西 - 對於你的情況,我會用goto。
例如如果你有多行縮進,並且你需要跳回到函數的開頭,我會使用goto - 在上下文中理解起來要容易得多。
Example(稍微簡化)使用@邁克爾的建議如下。退出條件是在while循環,但用戶也可以做一箇中介作用,以決定採取何種行動:
while [[ ! "${action-}" =~ ^[SsRr]$ ]]
do
echo "What do you want to do?"
read -n 1 -p $'[d]iff, [s]kip, [S]kip all, [r]eplace, [R]eplace all: \n' action
if [[ "${action-}" =~ ^[Dd]$ ]]
then
diff "$target_path" "$source_path"
fi
done
我以前沒有見過這樣的事情,[[! 「$ {action-}」=〜^ [SsRr] $]],整齊。 – jonschipp
echo "Hello User, are you ready to learn some Linux?"
while true; do
echo "Please enter y/n:"
read a
bfunc() {
if [ "$a" == "y" ]
then
echo "That is great, lets get started!"
echo "This Script is under construction, functionality coming soon"
exit 0
elif [ "$a" == "n" ]
then
echo "That is too bad, see you next time!"
echo "You are now exiting the script"
exit 0
else [ "$a" != "y||n" ]
echo "Please only enter y or n!"
fi
}
bfunc
done
您可以用'while true; do'和'case'語句將被替換爲簡單的'if',如果匹配,將會'break'。所以你不需要加變量('$ exit_loop')。 – uzsolt
非常真實。唉,不知道我想在循環中做什麼,我只是一起扔了:) – septical