ネストされたcaseステートメント内からwhileループを抜け出すにはどうすればよいですか?[閉まっている]


18

以下のスクリプトでは-潜在的に悪いスクリプトの実行を続行することを確認するようユーザーにプロンプ​​トを表示します-ユーザーYがプロンプトで入力すると、caseブロックから抜け出し、while再びループに送り返されます。

#! /bin/bash
set -e

echo
echo "bad install start"
echo "-----------------------------------------"

while true; do
        read -p "this script will probably fail - do you want to run anyway?" yn
        case $yn in
                [Yy]*)
                        ##### WHAT GOES HERE?? #####
                        ;;
                [Nn]*)
                        exit ;;
                *)
                        echo "answer y or n" ;;
        esac

        echo "script has broken out of case back into while loop"
done

echo -e "\e[33m Installing bad packagename \e[0m"
apt-get install sdfsdfdfsd

echo "rest of script - will i keep running?"

ときにn入力され、スクリプトは、所望の全体として存在します。Yスクリプトが入力されたときに、ブロックがwhileブロックcase whileブロックの両方から抜け出すが、完全には終了しないようにする方法を知りたい。それを行うためにプレースホルダーに入れることができるものはありますか(「ここに何が??」)。


最初に注意してください[Yn]*)。おそらくあなたが意味した[Yy]*)
ダグ

1
私が最初に答えてからコードを編集しましたが、どのような場合でもそうで$TEST=1あることTEST=1に注意してください。スクリプトはこの変更で動作する可能性が非常に高いです。
dhag

doh、はい、テスト時にそれを見ました!
-the_velour_fog

@dhag編集を改善したと思います。ご覧ください。あなたの目標は、受け入れられた答えがうまく適合するものにコードを書き直すことだと思われますが、今はもっと近いと思います。
デロバート

@derobert:あなたの編集は私には見栄えが良いです。それは確かに質問を明確にします。
ダグ

回答:


30

ユーザーが「y」を入力した場合、whileとcaseの両方を終了できます。

break [n]
       Exit from within a for, while, until, or select loop.  If  n  is
       specified, break n levels.  n must be  1.  If n is greater than
       the number of enclosing loops, all enclosing loops  are  exited.
       The  return  value is 0 unless n is not greater than or equal to
       1.

あなたの場合、あなたがしたいbreak 2


1
ありがとう、はいbreak 2、上記のコメントに関して、はい、私は変数を設定しようとしましたが、うまくいきませんでした-bashはwhileおよびcaseブロック内にローカルスコープを持っていると思いますか?とは異なり、たとえばPHP
the_velour_fog

いいえ、bash変数はローカルではないので(明示的に宣言しない限り)、casewhileループのテストに反映する必要があります。
dhag

ああ、わかった、私は[Yy]ケースブロック内で別の割り当てを行っていた。私の質問内で少し編集して反映しましたが、あなたの権利は機能します-おかげで私はいくつかのクールなことを学びました!
-the_velour_fog

その場合は、break十分です。コードに2つのレベルのループはありません。
xhienne

@xhienne:あなたは正しいようです!何を考えていたのかわかりません。
-dhag

1

@dhagにはすばらしい答えがあります。以下も使用できます。

a=0
while [ "$a" -eq 0 ]; do
     ...
     [Nn]*)
          a=1;
          ;;
      ...
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.