変数に基づいてx項目を含むメニューを作成する

変数に基づいてx項目を含むメニューを作成する

変数に基づいてx行を含むメニューを取得しようとしています。

設定:

x個のIPアドレスを持つネットワークがあります

ユーザーが数字を入力して単にIPアドレスを選択できるメニューを提供したいと思います。

たとえば、

IPアドレスが4つあります。

ip1=192.168.1.1
ip2=192.168.1.2
ip3=192.168.1.3
ip4=192.168.1.4

ユーザーがこのメニューを取得したい

1. 192.168.1.1
2. 192.168.1.2
3. 192.168.1.3
4. 192.168.1.4
Please enter your choice:

ただし、IP アドレスの数は異なる場合があります。

私は次のような場合にこれをしようとします:

echo -n "Please enter your choice: "
read opt
case $opt in
    ipnum=ip$opt

    1)  echo ${!ipnum}
esac

しかし、ループに入ることはできません。

答え1

bash(または同様のシェル)を使用する場合:

ipnums=( 192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4 )

select ip in "${ipnums[@]}"; do
    case $ip in
        "") echo 'Invalid choice' >&2 ;;
        *)  break
    esac
done

printf 'You picked IP %s\n' "$ip"

以下のようにメニューとプロンプトが表示されます。

1) 192.168.1.1
2) 192.168.1.2
3) 192.168.1.3
4) 192.168.1.4
#? 

PS3使用するプロンプト文字列を設定してプロンプトを変更できます。

このselectループは入力を検証し、ユーザーから有効な入力が得られるまで繰り返します。

サイクルが終了すると、選択したIPアドレスをで使用できます$ip

アドレスを配列に保存したくない場合は、関連変数を一覧表示する必要があります。 (これはN変数として簡単に一般化されていないので、私の答えに配列を使用することを提案しました。その他の質問):

select ip in "$ip1" "$ip2" "$ip3" "$ip4"; do ...; done

答え2

私の場合は見つけました。

@fra-sanが言ったように、単に印刷してユーザーに選択するように要求するのではなく、ケースを使用するのはなぜですか?

ちょうど配列を使用してすべてのIPアドレスを反映し、前に追加の番号を追加しました。数字を入力すると変数の数字と一致するので、答えを得ました。

関連情報