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