0

ここで何が起こっているのか、そしてその理由を理解しようとしていますか?

「why」という名前の関数が最初に呼び出され、次に結果は関数への別の呼び出しまたは完全な終了のいずれかになります。期待される結果は、ifステートメントの下でループを実行することはできません。これはif-else-fiステートメントまたはif-elif-else-fiである可能性があり、重要ではありません。

問題は、なぜそれがエコーエンドなのかということです。

最後のエコーを呼び出すことができる理由がわかりません。

why ()  {
  read -p 'Loop now?  [y/n]' answer
      case $answer in
        y | Y | yes | YES ) answer="y";;
        *) exit;;
       esac
}

if [ $answer = 'y' ]
then
    why
fi
why 
echo "End"
4

2 に答える 2

1

を呼び出すプログラムの部分の周りにループはありませんwhy。これですか?

while true; do
  why ">" y n
  if [ $answer = y ]; then
    do something
  else
    do something else
  fi
done
echo "I'll never get here"
于 2012-12-12T01:36:40.123 に答える
0

ifステートメントは、関数の完了時にそれが自己実行されたと見なします。この例の方が適切であり、スクリプトはエコー開始にループバックしません。

echo start
why ()  {
  read -p 'Loop now?  [y/n]' answer
      case $answer in
        y | Y | yes | YES ) answer="y";;
        *) echo 'Invalid response -- exiting now'
           exit;;
       esac
}

answer=y

if [ $answer = 'y' ]
then

    why
    echo "Ok done running the if statement ready to exit the condition now"
fi

したがって、ifステートメントをラップする関数を前後にループするには、次のように使用します。

echo start
why ()  {
  read -p 'Loop now?  [y/n]' answer
      case $answer in
        y | Y | yes | YES ) answer="y";;
        n | N | no | NO ) answer="n";;
        *) echo 'Invalid response -- exiting now'
           exit;;
       esac
  ifFunction
}

ifFunction () { 
  if [ $answer = 'y' ]
  then

    why
    echo "yes"
  elif [ $answer = 'n' ]
  then
    echo "to bad looping anyway"
    why
  else
    echo "else nothing but another question"
    why
  fi
}
why
echo never

したがって、答えは、関数が完了し、期待どおりにスクリプトを進めます。これは、提供された例では、完了する次のタスクとしてendをエコーし​​ます。

于 2012-12-12T18:43:17.157 に答える