2017-07-01 23 views
1

私は動的メニューを生成し、変数に保存するオプションを選択しようとしています。これまで私はこれを持っていますが、私は立ち往生しています。 何とかいつもデフォルトの動的に生成されたbashメニュー

"ERROR選択がリストにない、スクリプトを再実行します"。

IFACES=$(nmcli -t -f SSID dev wifi list | grep i) 
SELECTION=1 
while read -r line; do 
    echo "$SELECTION) $line" 
    ((SELECTION++)) 
done <<< "$IFACES" 
((SELECTION--)) 
echo 
printf 'Select an interface from the above list: ' 
read -r OPT 
if [[ `seq 1 $SELECTION` = $OPT ]]; then 
    sed -n "${OPT}p" <<< "$IFACES" 
    IFACE=$(sed -n "${OPT}p" <<< "$IFACES") #set interface 
else 
    echo "ERROR Selection not in list, rerun the script." 
    exit 0 
fi 
+1

あなたは 'seq 1 $ SELECTION'が何をすると思います – janos

+0

$ SELECTION以下の数字のシーケンスを出力します。 – Crow

+0

そうですね、 "$ OPT"(特定の数字)は "1 2 3 4 5 ..."と等しくなりましたか? –

答えて

1

これを試してみてください:

$ cat tst.sh 
mapfile -t ifaces < <(printf 'foo\nbar code\nstuff\nnonsense\n') 
for i in "${!ifaces[@]}"; do 
    printf "%s) %s\n" "$i" "${ifaces[$i]}" 
done 
printf 'Select an interface from the above list: ' 
IFS= read -r opt 
if [[ $opt =~ ^[0-9]+$ ]] && (((opt >= 0) && (opt <= "${#ifaces[@]}"))); then 
    printf 'good\n' 
else 
    printf 'bad\n' 
fi 

を。

$ ./tst.sh 
0) foo 
1) bar code 
2) stuff 
3) nonsense 
Select an interface from the above list: d 
bad 

$ ./tst.sh 
0) foo 
1) bar code 
2) stuff 
3) nonsense 
Select an interface from the above list: 5 
bad 

$ ./tst.sh 
0) foo 
1) bar code 
2) stuff 
3) nonsense 
Select an interface from the above list: 3 
good 

あなたnmcli ...コマンドでprintfを交換してください。

+1

ありがとう、私はこれに新しいです。 – Crow

+0

ようこそ。シェルスクリプトの作成を始める前に何らかの基盤を得る必要があります**非常に**簡単に間違ってしまいがちですが、バグはしばしば狡猾で結果は悲惨なので、Chris Johnsonの書籍「シェルスクリプトレシピ」を読んでアーカイブを検索してみてくださいStephane ChazelasさんやCharles Duffyさんのbashの回答もあります(正確に正しい答えを提供する人もいますが、完全なナンセンスであり、2つあります)。 –

+1

もう一度エド、ありがとう。 – Crow

関連する問題