• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja read_choice nie wczytuje wartości do zmiennej - Bash

Object Storage Arubacloud
0 głosów
154 wizyt
pytanie zadane 20 czerwca 2021 w Inne języki przez mattaha Użytkownik (690 p.)

Witam. Mam problem z funkcją `read_choice`. Funkcja ma prosić użytkownika o podanie liczby odpowiadającej elementowi dostępnemu w liście opcji do wyboru. Problem polega na tym, że zmienna `answer` zamiast mieć przypisaną liczbę otrzymuje pustą wartość.

read_num() {
    local question=$1
    local -n answer=$2
    local default=${3:-}
    if [[ $default ]]; then
        question="$question (leave blank for $default): "
    else
        question="$question: "
    fi
    local re='^[0-9]+$'
    until
        read -rp "$question" answer
        [[ "$answer" =~ $re ]]
    do
        printf "%s: not a number.\n" "$answer" >&2
    done
}

read_choice() {
    local question=$1
    local -n answer=$2
    local choices=( "$@" )
    choices=( "${choices[@]:1}" )
    local user_choice
    while true; do
        printf "%s\n" "$question"
        for (( i = 0; i < ${#choices[@]}; ++i )); do
            printf "%d) %s\n" "$i" "${choices[$i]}"
        done
        read_num "Your choice" user_choice
        if [ "$user_choice" -ge 0 ] && [ "$user_choice" -lt ${#choices[@]} ]; then
            answer=$user_choice
            break
        else
            printf "Invalid choice!\n\n"
        fi
    done
}

user_choice=""
choices=( "Single data HDD" "ZFS on root" "ZFS on root + RAID 1" )
read_choice "Select desired setup" user_choice "${choices[@]}"

root_dev=""
case $user_choice in
    "Single data HDD")
        storage_dev=""
        read_device "Enter storage device path" storage_dev
        create_data_pool "$storage_dev"
        ;;
    "ZFS on root")
        read_device "Enter root device path" root_dev
        create_partitions "$root_dev"
        create_rootfs "$root_dev"
        ;;
    "ZFS on root + RAID 1")
        read_devices "Enter target devices separated by spaces" root_dev
        create_partitions "${root_dev[@]}"
        create_rootfs "${root_dev[@]}"
        ;;
    *)
        die "invalid choice '$user_choice'"
esac

 

1 odpowiedź

0 głosów
odpowiedź 21 czerwca 2021 przez overcq Pasjonat (21,650 p.)

Jest problem ze zmienną lokalną o tej samej nazwie co globalna user_choice. Po zmianie na przykład na local user_choice_ i późniejszych wystąpień działa. Tylko trzeba jeszcze zmienić, co się przypisuje do answer (np. na answer="${choices[$user_choice_]}"), albo przypadki w późniejszym case.

Podobne pytania

0 głosów
0 odpowiedzi 306 wizyt
+1 głos
0 odpowiedzi 228 wizyt
pytanie zadane 26 września 2018 w Inne języki przez Moonmaker05 Początkujący (410 p.)
0 głosów
0 odpowiedzi 356 wizyt
pytanie zadane 2 stycznia 2018 w Inne języki przez Rakkos Nowicjusz (120 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...