BASH - case statment z sql range jako jedna z opcji w menu.

1

Cześć,
wziąłem sobie na warsztat skrypty w bashu i mam takie pytanie.

Poniżej wklejam kod skryptu funkcji MAIN_MENU , który po uruchomieniu wyświetla menu #) <service> gdzie # i <service> to zapytanie z bazy danych.
I to jest logiczne że tyle ile jest usług tyle wyświetli nam pozycji.
Za pomocą case statment chciałem wywołać kolejne funkcje w zależności jaki numer poda użytkownik. Jeżeli poda liczbę z zakresu [1-$SERVICES_NUMBER] to przechodz do funkcji SERVICE. Ale to mi nie działa.
Mam wrażenie, że problem jest w formacie tzn. w range daje 1 - $SERVICES_NUMBER, gdzie $SERVICES_NUMBER to jest string ?
Może mi ktoś podpowiedzieć jak to zrobić poprawnie. Tak, żeby niezależnie od liczby usług zawsze przejść do odpowiedniej funkcji.

MAIN_MENU() {
  shopt -s nocasematch
  if [[ $1 ]]
  then
    echo -e "\n$1"
  fi

  # Available services' list.
  AVAILABLE_SERVICES=$($PSQL "SELECT * FROM services")
  echo "$AVAILABLE_SERVICES" | while read SERVICE_ID BAR NAME
  do 
    echo "$SERVICE_ID) $NAME"
  done
  echo "q) quit"
  
  SERVICES_NUMBER=$($PSQL "SELECT COUNT(*) FROM services")
  read SERVICE_ID_SELECTED

  case $SERVICE_ID_SELECTED in
    [1-$SERVICES_NUMBER]) SERVICE ;;
    # q) EXIT ;;
    *) MAIN_MENU "I could not find that service. What would you like today?"
  esac
}
2

Na mój gust to po prostu próbujesz re-implementować select.

declare -a SERVICES
SERVICES=($(echo 'whoami'; echo 'pwd'; echo 'groups'; echo 'lsmem'))

PS3='> '
select sel in "${SERVICES[@]}"
do
    if [ $sel ]
        then
            echo "Wybrano nr $REPLY z wartością $sel"
            echo "$($sel)"
        break
    else
        echo "nieprawidłowy wybór"
    fi			
done

W użyciu

$ bash test.sh 
1) whoami
2) pwd
3) groups
4) lsmem
> 12
nieprawidłowy wybór
> 4
Wybrano nr 4 z wartością lsmem
RANGE                                  SIZE  STATE REMOVABLE  BLOCK
0x0000000000000000-0x000000005fffffff  1,5G online       yes   0-11
0x0000000100000000-0x000000049fffffff 14,5G online       yes 32-147

Memory block size:       128M
Total online memory:      16G
Total offline memory:      0B

Konstrukcja select wykonuje następujące czynności:

  • generuje pozycję menu dla każdego elementu listy i poprzedza je numerem
  • oczekuje wybrania numeru
  • przypisuje wybraną wartość podaj zmiennej i zapisuje wybrany numer w zmiennej wbudowanej REPLY
  • wykonuje instrukcje w ciele konstrukcji
  • powtarza proces w nieskończoność

Wbudowana zmienna powłoki PS3 zawiera znak zachęty wykorzystywany. Z konstrukcji wychodzimy instrukcją break.

case działa dla wzorców z symbolami wieloznacznymi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1