シェルスクリプトでユーザーに繰り返しメッセージを表示するには?

シェルスクリプトでユーザーに繰り返しメッセージを表示するには?

if/elif/else/fiステートメントセットで "else"にユーザーにエラーメッセージを表示させるようにしましたが、ユーザーがif / elseステートメントの前に尋ねた質問に戻り、ユーザーが試すことができるようにしたいと思います。その質問に返信するために。

ユーザーを以前のコード行に戻すにはどうすればよいですか?それともこれが可能でない場合、他の方法はありますか?

ベストアンサー1

最も簡単な方法は、プロンプトコードを関数でラップしてuntilループに入れることです。

実際に必要なのは、成功するまで関数を呼び出すことであるため、:Untilループにnoopコマンド ""を入れることができます。

このような:

#!/bin/bash

getgender() {
  read -p "What is the gender of the user? (male/female): " gender
  case "$gender" in
    m|M)
      grouptoaddto="boys"
      return 0
      ;;
    f|F)
      grouptoaddto="girls"
      return 0
      ;;
    *)
      printf %s\\n "Please enter 'M' or 'F'"
      return 1
      ;;
  esac
}

until getgender; do : ; done
sudo usermod -a -G "$grouptoaddto" "$username"

ここで重要なのは、呼び出された関数を使用することなので、until成功するまで繰り返し呼び出されます。関数内の大文字と小文字の変換は単なる例です。


関数を使用しないより簡単な例:

while [ -z "$groupname" ]; do
  read -p "What gender is the user?" answer
  case "$answer" in
    [MmBb]|[Mm]ale|[Bb]oy) groupname="boys" ;;
    [FfGg]|[Ff]emale|[Gg]irl) groupname="girls" ;;
    *) echo "Please choose male/female (or boy/girl)" ;;
  esac
done
sudo usermod -a -G "$groupname" "$username"

最後の例では、変数 "groupname"の長さがゼロの間、-zスイッチto(テスト)コマンドを使用してループを続行します。[

鍵はまたはwhileを使用することですuntil

最後の例を人間が読める疑似コードに変換します。

While groupname is empty,

  ask user for gender.

  If he answers with one letter "m" or "B",
    or the word "Male" or "boy",
    set the groupname as "boys".

  If she answers with one letter "F" or "g",
    or the word "female" or "Girl",
    set the groupname as "girls".

  If he/she answers anything else, complain.

(And then repeat, since groupname is still empty.)

Once you have groupname populated,
  add the user to that group.

変数がない別のgroupname例:

while true; do
  read -p "What gender is the user?" answer
  case "$answer" in
    [MmBb]|[Mm]ale|[Bb]oy)
      sudo usermod -a -G boys "$username"
      break
      ;;
    [FfGg]|[Ff]emale|[Gg]irl)
      sudo usermod -a -G girls "$username"
      break
      ;;
    *) echo "Please choose male/female (or boy/girl)" ;;
  esac
done

おすすめ記事