선택 옵션이 표시되는 방식을 변경할 수 있나요?

선택 옵션이 표시되는 방식을 변경할 수 있나요?

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

답변1

자신만의 "선택"을 만드세요:

#!/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) 종료                  
#?

답변2

이것을 설정할 수 있습니다 COLUMNS. bash 매뉴얼 페이지를 참조하세요.

COLUMNS
    Used  by the select compound command to determine the terminal width when 
    printing selection lists. Automatically set if the checkwinsize option is 
    enabled or in an interactive shell upon receipt of a SIGWINCH.
#!/bin/bash

COLUMNS=X

select item in {a..f}; do
    # ...
done

# COLUMNS=20
# 1) a  3) c  5) e
# 2) b  4) d  6) f 

# COLUMNS=15
# 1) a  4) d
# 2) b  5) e
# 3) c  6) f

관련 정보