• 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

0 głosów
184 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 (22,600 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 696 wizyt
+1 głos
0 odpowiedzi 259 wizyt
pytanie zadane 26 września 2018 w Inne języki przez Moonmaker05 Początkujący (410 p.)
0 głosów
0 odpowiedzi 389 wizyt
pytanie zadane 2 stycznia 2018 w Inne języki przez Rakkos Nowicjusz (120 p.)

93,428 zapytań

142,423 odpowiedzi

322,652 komentarzy

62,789 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...