首页 > 解决方案 > 意外标记“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'

标签: bashshell

解决方案


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

推荐阅读