Linux 사례 명령

Linux 사례 명령

메뉴 목록에 공백이나 탭을 포함하는 방법은 무엇입니까?

    PS3='Please enter your choice: '
    options=("Option 1" "Option 2" "Quit")
    select opt in "${options[@]}"
    do
      case $opt in
         "Option 1")
            echo "Your choise is 1"
            ;;
         "Option 2")
            echo "Your choise is 2"
            ;;
         "Quit")
            break
            ;;
         *) echo "Invalid option;;
      esac
    done

알 겠어:

[user@Server:/home/user] ./test.sh
1) Option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice:

하지만 나는 다음과 같은 것을 원합니다 :

[user@Server:/home/user] ./test.sh
   1) Option 1
   2) Option 2
   3) Option 3
   4) Quit
Please enter your choice:

아이디어가 있나요?

답변1

select적어도 다중 열 목록이 필요한 옵션이 너무 많지 않은 한 수동으로 (대략) 디스플레이를 다시 구현하고 미세 조정하는 것은 그리 어렵지 않습니다 .

#!/bin/bash

# print the prompt from $1, and a menu of the other arguments
choose() {
    local prompt=$1
    shift
    local i=0
    for opt in "$@"; do
        # we have to do the numbering manually...
        printf "  %2d) %s\n" "$((i += 1))" "$opt"
    done
    read -p "$prompt: "
}

options=("Foo" "Bar" "Quit")
while choose 'Please enter your choice'  "${options[@]}"; do
    case $REPLY in
    1) echo "you chose 'foo'" ;;
    2) echo "you chose 'bar'";;
    3) echo 'you chose to quit'; break;;
    *) echo 'invalid choice';;
    esac
done

물론 이것은 배열 키(인덱스)를 고려하여 카운터를 실행하는 대신 메뉴의 옵션으로 렌더링하도록 확장될 수 있습니다.

답변2

selectbash메뉴를 표시하는 문에서는 메뉴에 대한 들여쓰기를 지정할 수 없습니다 .


코드에 대한 설명: 선택한 문자열이 있는 변수에 대해 명령문을 적용하는 것보다 명령문을 case실행하는 것이 더 쉬운 경우가 많습니다. $REPLY문자열을 두 번 입력하지 않아도 됩니다.

예를 들어

select opt in "${options[@]}"
do
  case $REPLY in
     1)
        echo "Your choice is 1"
        ;;
     2)
        echo "Your choice is 2"
        ;;
     3)
        break
        ;;
     *) echo 'Invalid option' >&2
  esac
done

또는 이 구체적인 예에서는

select opt in "${options[@]}"
do
  case $REPLY in
     [1-2])
        printf 'Your choice is %s\n' "$REPLY"
        ;;
     3)
        break
        ;;
     *) echo 'Invalid option' >&2
  esac
done

관련 정보