変数に基づいて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アドレスを反映し、前に追加の番号を追加しました。数字を入力すると変数の数字と一致するので、答えを得ました。