значение переменной не обновляется внутри цикла do while

#bash

#bash

Вопрос:

Я только начал изучать сценарии bash и пытаться практиковать циклы и операторы if, поэтому, пожалуйста, потерпите меня. Когда я запускаю скрипт, я всегда получаю печать

 You entered an invalid option. 
  

Независимо от того, какой вариант я выбираю, это означает, что loopControl значение не изменилось.

 loopControl="z"

echo "Choose one of the following options."

while [ "$loopControl" != "Q" ] amp;amp; [ "$loopControl" != "q" ] do

    echo  "A"
    echo  "B"
    echo  "C"
    echo  "Q";
    read $loopControl

    if [ "$loopControl" == "A" ] || [ "$loopControl" == "a" ]
        then echo "option A works"
    elif [ "$loopControl" == "B" ] || [ "$loopControl" == "b" ]
        then echo "option B works"
    elif [ "$loopControl" == "C" ] || [ "$loopControl" == "c" ]
        then echo "option c works"
    else
        echo "You entered an invalid option."
    fi
done
  

Ответ №1:

Заменить:

 read $loopControl
  

С:

 read loopControl
  

Тогда ваш код будет работать.

Полный сценарий:

 $ cat script.sh
#!bin/bash
loopControl="z"
echo "Choose one of the following options."
while [ "$loopControl" != "Q" ] amp;amp; [ "$loopControl" != "q" ]
do
    echo "A"
    echo "B"
    echo "C"
    echo "Q"
    read -r loopControl
    if [ "$loopControl" == "A" ] || [ "$loopControl" == "a" ]
    then
        echo "option A works"
    elif [ "$loopControl" == "B" ] || [ "$loopControl" == "b" ]
    then
        echo "option B works"
    elif [ "$loopControl" == "C" ] || [ "$loopControl" == "c" ]
    then
        echo "option c works"
    else
        echo "You entered an invalid option."
    fi
done
  

В процессе работы это работает следующим образом:

 $ bash script.sh 
Choose one of the following options.
A
B
C
Q
a
option A works
A
B
C
Q
B
option B works
A
B
C
Q
c
option c works
A
B
C
Q
q
You entered an invalid option.
  

Альтернатива: использование select

Более обычный способ получить меню bash — использовать select :

 $ cat script2.sh
#!bin/bash
loopControl="z"
echo "Choose one of the following options."
select loopControl in A B C Q
do
    case "$loopControl" in
        A) echo "option A works" ;;
        B) echo "option B works" ;;
        C) echo "option c works" ;;
        Q) exit ;;
        *) echo "You entered an invalid option." ;;
    esac
done
  

Это работает немного по-другому: вводится число для параметра. Но конечный результат очень похож:

 $ bash script2.sh 
Choose one of the following options.
1) A
2) B
3) C
4) Q
#? 1
option A works
#? 3
option c works
#? 5
You entered an invalid option.
#? 4
$