答えが「no」になるまで、前のコマンドを実行します。 [条件付スクリプト]

答えが「no」になるまで、前のコマンドを実行します。 [条件付スクリプト]

私はコマンドを再実行する必要があるかどうかをユーザーに尋ねるスクリプトを書こうとしました。

答えが「はい」の場合は、最後のコマンドを再実行する必要があります。 2回目の実行後も最後のコマンドを実行する必要があるかどうかをユーザーに尋ねる必要があります。私は答えが「いいえ」になるまでこれが起こりたいのですが、答えが「いいえ」であれば終了する必要があります。

つまり

$ cat shellscript.sh
  echo foo
  printf 'Can I run the last command (y/n)?' 

私の答えが「はい」の場合は、「echo foo」コマンドを実行する必要があります。

  # after the 1st time execution
  printf 'Can I run the last command again (y/n)?'

答えが「はい」の場合は、コマンドを再実行し、答えが「はい」になるまで同じ操作(y / nを求めて実行)を実行します。それ以外の場合は終了する必要があります。

ある種のループを実装する必要があるようですが、これは条件付きスクリプトなので混乱しています。

答え1

バッシュ使用:

while [[ "$REPLY" != "no" ]]
do
  echo foo
  read -p "Can I run the last command (yes/no)?"
done

ループを終了するには、文字通り「いいえ」と答える必要があるので、「はい/いいえ」というプロンプトについて詳しく説明しました。

bashはreadカスタムプロンプト(-p以降および文字列)を受け入れ、ユーザーの応答を$ REPLY変数に保存します。ループに入る前は「いいえ」とは思いません(まだ何もなければread空です)。

答え2

代替ジェフの答え:

while true; do
    somecommand

    while true; do
        read -p 'Can I run the last command again (yes/no)? '

        case "$REPLY" in
            [Yy]*) break   ;;
            [Nn]*) break 2 ;;
            *) echo 'Sorry, what?' >&2
        esac
    done
done

ここで最大の違いは、ユーザーから有効な応答を受け取る必要があることです。有効な応答は、またはで始まる文字列ですyn大文字と小文字を無視)。

break回答読み取りループが中断され、break 2コマンドループも中断されます。

関連情報