2011-10-31 29 views
3

我有一個bash腳本,它打印一個標題並測試值爲「Y」或「N」。bash - 如果返回代碼> = 1重新運行腳本,從頭開始

當有人輸入不等於「Y」或「N」的文本時,我想將它們發回到腳本的開頭,以便再次打印標題和問題。

我知道你可以用goto做到這一點,但我想知道是否有另一種方式,因爲我聽到很多人說你不應該使用goto或者它已被棄用。無論真實與否,我想看看是否有其他人有辦法解決這個問題。

在此先感謝。

回答

2

作爲直接回答你的問題,你可以使用exec更換當前進程與另一進程或當前進程的另一新副本(視情況而定)。

read -p "Yes? Or no? " yn 
case $yn in 
    [YyNn]) ;; 
    *) exec "$0" "[email protected]" 
esac 
4

你可以在一個循環中實現它:

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 - 在上下文中理解起來要容易得多。

+1

您可以用'while true; do'和'case'語句將被替換爲簡單的'if',如果匹配,將會'break'。所以你不需要加變量('$ exit_loop')。 – uzsolt

+0

非常真實。唉,不知道我想在循環中做什麼,我只是一起扔了:) – septical

1

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 
+0

我以前沒有見過這樣的事情,[[! 「$ {action-}」=〜^ [SsRr] $]],整齊。 – jonschipp

-2
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 
+0

對不起,我不知道,它需要4個空格來做代碼,但這個工程! – Brian

+0

不,它不是真的;特別是,'else [「$ a」!=「y || n」]'不是語法錯誤,但也不是你想象的那樣。在循環內定義函數也是很有原創性的。 – tripleee

+0

這是我的第一個bash腳本,它的工作方式與我打算的一樣。你能解釋它是怎麼錯的嗎? – Brian