Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

select

『select』はユーザーが対話的にメニューから選択できるループを生成します。番号付きメニューが自動的に表示され、ユーザーの入力した番号に対応する処理を実行します。シェルスクリプトで簡単なインタラクティブメニューを作るときに使います。

構文
# 基本構文
select 変数 in 選択肢リスト; do
    処理($変数 に選択された値が入る)
    break   # ループを終了するには明示的に break が必要
done

# プロンプト文字列を変更する(デフォルトは "#? ")
PS3="選択してください: "
select 変数 in 選択肢リスト; do
    処理
done
関連変数・動作一覧
変数/動作概要
$REPLYユーザーが入力した数字(選択番号)が入ります。
$変数ユーザーが選択したメニュー項目のテキストが入ります。
PS3メニュー選択プロンプトのテキストです(デフォルトは "#? ")。
breakselect ループを終了します。break を書かない場合は繰り返し表示されます。
範囲外の数字入力$変数 が空文字列になります。if で判定してエラーを出せます。
空行(Enter のみ)メニューが再表示されます。
サンプルコード

『select』と『case』を組み合わせて対話メニューを作成します。『PS3』でプロンプト文字列を変更できます。

#!/bin/bash
PS3="実行する操作を選んでください: "

select action in "ファイル一覧" "現在地を表示" "日付を確認" "終了"; do
    case "$action" in
        "ファイル一覧")
            ls -la
            ;;
        "現在地を表示")
            pwd
            ;;
        "日付を確認")
            date
            ;;
        "終了")
            echo "終了します"
            break
            ;;
        *)
            echo "無効な選択です(入力: $REPLY)"
            ;;
    esac
done
1) ファイル一覧
2) 現在地を表示
3) 日付を確認
4) 終了
実行する操作を選んでください: 2
/home/alice/project
実行する操作を選んでください: 4
終了します

配列からメニューを生成し、無効な番号の入力にも対応します。

PS3="言語を選択してください: "
languages=("Bash" "Python" "PHP" "Kotlin" "終了")

select lang in "${languages[@]}"; do
    if [[ -z "$lang" ]]; then
        echo "無効な番号です"
        continue
    fi
    if [[ "$lang" = "終了" ]]; then
        echo "キャンセルしました"
        break
    fi
    echo "選択された言語: $lang(番号: $REPLY)"
    break
done
1) Bash
2) Python
3) PHP
4) Kotlin
5) 終了
言語を選択してください: 3
選択された言語: PHP(番号: 3)
概要

『select』は内部で while ループのように動作し、明示的に『break』を実行するか Ctrl+D(EOF)が入力されるまで繰り返しメニューを表示します。

本番スクリプトで非対話的に実行される場合(パイプや cron など)は select は使えません。対話処理が必要な場合のみ使用し、非対話環境ではコマンドライン引数で処理を切り替える設計にしましょう。

コマンドライン引数の処理には 特殊変数 $1〜$9case 文 が便利です。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。