bash - 意外标记“case”附近的语法错误
问题描述
这个问题之前可能已经被问过,但我不明白这段代码有什么问题。因此,此代码旨在在用户运行此代码时显示回复变量的菜单列表,而无需用户进行任何输入
#!/bin/bash
again='y'
while [ $again == 'y' ] || [ $again == 'Y' ];
do
clear
select menu in "Food1" "Food2" "Food3";
case $REPLY in
1) echo -n "Amount of plate =";
read sum
let pay=sum*1500;
;;
2) echo -n "Amount of food =";
read sum
let pay=sum*2000;
;;
3) exit 0
;;
*) echo "Sorry, its unavailable"
;;
esac
do
echo "Amount of pay = Rp. $pay"
echo "THX"
echo
echo -n "Count again (y/t) :";
read again;
#to validate input
while [ $again != 'y' ] && [ $again != 'Y' ] && [ $again != 't' ] && [ $again != 'T' ];
do
echo "Ops, input with (y/Y/t/Y)";
echo -n "Count again (y/t) :";
read again;
done
done
然后我得到这个错误
./script.sh: line 7: syntax error near unexpected token `case'
./script.sh: line 7: ` case $REPLY in'
解决方案
cf https://www.shellcheck.net/,它将为您检查您的 bash 语法。
Line 6:
select menu in "Food1" "Food2" "Food3";
^-- SC1073: Couldn't parse this select loop. Fix to allow more checks.
Line 7:
case $REPLY in
^-- SC1058: Expected 'do'.
^-- SC1072: Expected 'do'. Fix any mentioned problems and try again.
shellcheck 是你的朋友。:)
select menu in "Food1" "Food2" "Food3"
do : your logic here, AFTER the do
done
简化代码的另一件事-而不是检查所有内容的大小写,只需将其强制用于像这样的简单事情。
$ declare -l foo
$ foo=BAR
$ echo $foo
bar
所以如果你再次用 $ 做这个
declare -l again=y
while [[ y == "$again" ]]
do : ...
您永远不需要检查 Y,因为它将是 y。同理,在底部——
read again
until [[ "$again" =~ [yt] ]]
do printf "Y or T only please. Continue? [Y/t] "
read again
done
推荐阅读
- arm - cortex-M4中的时钟指令使用哪个时钟源
- java - 如何修复hashmap中arraylist的重复词?
- javascript - Socket.io 无法访问事件处理程序中的握手查询参数
- excel - VBA 帮助:设置具有动态范围的自动运行 VBA
- python - 有没有办法将python脚本中定义的数据调用和存储到julia?
- oracle - 规范化后创建表的问题
- video - ffmpeg -to 标志在处理相同文件和不同时间范围时并不总是正确识别
- json - 将 1 对多 json 转换为 csv
- python-3.x - 如何为不使用熊猫的个人账户创建具有平均每月、每季度提款金额的新列?
- javascript - 如何解决我的网站缺少谷歌分析数据的问题