選択オプションの表示方法を変更できますか?


8

私はbashでselectとcaseを使用しています。私には現在9つのオプションがあり、オプションの3x3グリッドをきれいに整頓していますが、次のように表示されます。

    1) show all elements  4) write to file      7) clear elements
    2) add elements       5) generate lines     8) choose file
    3) load file          6) clear file         9) exit

列の前の行に表示したいのですが。

1) show all elements  2) add elements    3) load file
4) write to file      5) generate lines  6) clear file  
7) clear elements     8) choose file     9) exit

これを達成する方法はありますか?シェルオプションのように、スクリプト内で簡単に設定および設定解除できるものが望ましい。必要に応じて、オプションは配列に格納され、配列のインデックスによってケースブロックで参照されます。

OPTIONS=("show all elements" "add elements" "load file" "write to file" "generate lines" "clear file" "clear elements" "choose file" "exit")

...

select opt in "${OPTIONS[@]}"
do
case $opt in
    "${OPTIONS[0]}")

...

    "${OPTIONS[8]}")
        echo "Bye bye!"
        exit 0
        break
        ;;

    *)
        echo "Please enter a valid option."
esac
done

回答:


7

独自の「選択」を作成します。

#!/bin/bash

options=("show all elements" "add elements" "load file" "write to file" "generate lines" "clear file" "clear elements" "choose file" "exit")
width=25
cols=3

for ((i=0;i<${#options[@]};i++)); do 
  string="$(($i+1))) ${options[$i]}"
  printf "%s" "$string"
  printf "%$(($width-${#string}))s" " "
  [[ $(((i+1)%$cols)) -eq 0 ]] && echo
done

while true; do
  echo
  read -p '#? ' opt
  case $opt in
    1)
      echo "${options[$opt-1]}"
      ;;

    2)
      echo "${options[$opt-1]}"
      ;;

    9)
      echo "Bye bye!"
      break
      ;;
  esac
done

出力:

1)すべての要素を表示2)要素を追加3)ファイルをロード             
4)ファイルに書き込む5)行を生成する6)ファイルをクリアする            
7)要素をクリア8)ファイルを選択9)終了                  
#? 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.