bash - 变量值未在 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
解决方案
代替:
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
$
推荐阅读
- oracle - 我可以使用 `rownum` 来优化 apache spark 读取 oracle 表吗?
- reactjs - 更改为多行后文本输入失去焦点
- r - 使用 gtable/grob 自定义 ggplot 中的标签元素位置
- cookies - Flask Session() 对象不是永久的
- docker - 无法在 docker 中列出 docker 中的文件(dind)
- python - 如何在 Python 中用阿拉伯语重命名文件名
- c++ - 如何使用 if else 语句
- apache-spark - 在 pyspark 2.3 中,如何处理在 json 模式推断后不区分大小写导致的列名不明确?
- python - 根据另一个数据帧中的值从数据帧中选择行,并根据第二个数据帧用值更新其中一个列
- vhdl - 如何将 4 位全加器和 4:1 多路复用器加在一起?