Bash - 한 줄에 여러 메뉴를 선택하는 대신 한 줄에 각 메뉴를 선택하는 방법

Bash - 한 줄에 여러 메뉴를 선택하는 대신 한 줄에 각 메뉴를 선택하는 방법

테마 메이커 스크립트에는 6가지 옵션이 있습니다. 1) 테마 업데이트 확인 2) 테마 재설치 3) 글꼴 설치 4) 배경화면 설치 5) 도구 업데이트 확인 6) 종료

이것은 코드입니다

clear
echo "==========================="
echo "Tool for theme"
echo "==========================="

function check_update {
echo "checking theme update"
}

function reinstall_theme {
echo "Reinstalling"
echo "==========================="
}

function font {
echo "Installing font"
}

function wall {
echo "Installing wallpaper"
}

function check_update_tool {
echo "Checking tool update"
}

all_done=0
while (( !all_done )); do
options=("Check theme update" "Reinstall theme" "Install font" "Install wallpaper" "Check tool update" "Quit")

echo "Choose an option: "
select opt in "${options[@]}"; do
case $REPLY in
1) check_update; break ;;
2) reinstall_theme; break ;;
3) font; break ;;
4) wall; break ;;
5) check_update_tool; break ;;
6) all_done=1; break ;;
*) echo "Invalid option" ;;
esac
done
done

echo "Exiting"
sleep 2

하지만 실행하면 메뉴 선택이 엉망이 됩니다.

==================
Tool for theme
==================
Choose an option:
1) Check theme update 2) Reinstall theme  3) Install font
4) Install Wallpaper     5) Check tool update      6) Quit

하지만 내가 원하는 건

===============
Tool for theme
===============
Choose an option:
1) Check theme update
2) Reinstall theme
3) Install font
4) Install wallpaper
5) Check tool update
6) Quit

그럼 메뉴는 어떻게 수정하나요?

답변1

COLUMNS변수를 설정하여 디스플레이 너비를 제한할 수 있습니다. 예를 들어 12로 설정하면 예제가 단일 열로 형식화됩니다.

COLUMNS=12
select opt in "${options[@]}"; do
case $REPLY in
1) check_update; break ;;
2) reinstall_theme; break ;;
3) font; break ;;
4) wall; break ;;
5) check_update_tool; break ;;
6) all_done=1; break ;;
*) echo "Invalid option" ;;
esac

생산하다

===========================
Tool for theme
===========================
Choose an option: 
1) Check theme update
2) Reinstall theme
3) Install font
4) Install wallpaper
5) Check tool update
6) Quit
#? 

이것배쉬 매뉴얼설명 열:

사용자select명령은 선택 목록을 인쇄할 때 터미널 너비를 결정합니다. 다음과 같은 경우 자동으로 설정됩니다.checkwinsize옵션이 활성화되었습니다(참조:내장 매장) 또는 대화형 셸에서 수신됨SIGWINCH.

매뉴얼 페이지의 기능을 보는 것 외에도 소스 코드를 읽는 것도 전체 내용을 이해하는 데 도움이 될 수 있습니다. 이 변수는 다음 용도로 사용됩니다.select_query주석이 포함된 함수

/* LIST의 요소를 한 줄에 하나씩 인쇄하고 앞에 1부터
   LIST_LEN. 그런 다음 PROMPT를 표시하고 사용자가 숫자를 입력할 때까지 기다립니다.
   숫자가 1과 LIST_LEN 사이이면 선택 항목이 반환됩니다. 파일이 끝나면
   읽은 후에는 빈 문자열이 반환됩니다. 입력 내용이 비어 있거나 유효하지 않은 경우
   숫자를 입력하고 루프를 다시 실행하십시오. */

그리고 나중에select_query기능

  t = get_string_value("열");
  COLS = (t && *t) ?atoi(t): 80;

당신이 주면합리적인값은 atoi합리적인 결과를 제공합니다(이 경우에는 0도 합리적입니다.더 적은atoiCOLUMNS숫자가 아닌 값으로 설정된 경우 80개가 넘는 열이 반환됩니다. 값이 없으면(즉 COLUMNS="", ) bash열 80이 사용됩니다.

추가 자료:

관련 정보