首页 > 解决方案 > 变量值未在 do while 循环内更新

问题描述

我刚开始学习 bash 脚本并尝试练习循环和 if 语句,所以请多多包涵。当我运行脚本时,我总是得到打印

You entered an invalid option. 

无论我选择哪个选项,这意味着该loopControl值没有改变。

loopControl="z"

echo "Choose one of the following options."

while [ "$loopControl" != "Q" ] && [ "$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

标签: bash

解决方案


代替:

read $loopControl

和:

read loopControl

然后,您的代码将起作用。

完整的脚本是:

$ cat script.sh
#!bin/bash
loopControl="z"
echo "Choose one of the following options."
while [ "$loopControl" != "Q" ] && [ "$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
$ 

推荐阅读