Shell脚本switch case无法识别操作项 报语法错误排查
错误原因
你的脚本存在4处核心问题,和运行报错一一对应:
- 第7行定义
operations变量时使用了中文弯单引号’,不符合Shell语法要求的英文直单引号',导致变量赋值失效,Shell将引号后的subtract识别为待执行命令,触发subtract: command not found报错。 case结构语法错误,触发syntax error near unexpected token ')'报错:all操作对应的分支末尾缺少分支终止标记;;- 用于匹配退出逻辑的
*)分支被错误嵌套在all分支内部,未与add、subtract等其他操作分支保持平级 - 操作列表中定义了
quit选项,但未编写对应的匹配规则
all分支内有两行将两个独立的echo命令写在同一行,未通过换行或分号分隔,运行时会将第二个echo的内容识别为第一个echo的参数,导致输出错乱。- 减法、除法、取模的输出语句中,运算符与第一个数字之间缺少空格,输出格式不规整;另外
$[ 算术表达式 ]是已废弃的旧版Shell算术语法,兼容性差,建议使用标准写法$(( 算术表达式 ))。
修正后完整脚本
#!/bin/bash #This is our sixth script switch. echo "Print two numbers" read num1 num2 echo "What operation do you want to do?" operations='add subtract multiply divide exponentiate modulo all quit' select oper in $operations ; do case $oper in "add" ) echo "$num1 + $num2 = $((num1 + num2))" ;; "subtract" ) echo "$num1 - $num2 = $((num1 - num2))" ;; "multiply" ) echo "$num1 * $num2 = $((num1 * num2))" ;; "exponentiate" ) echo "$num1 ** $num2 = $((num1 ** num2))" ;; "divide" ) echo "$num1 / $num2 = $((num1 / num2))" ;; "modulo" ) echo "$num1 % $num2 = $((num1 % num2))" ;; "all" ) echo "$num1 + $num2 = $((num1 + num2))" echo "$num1 - $num2 = $((num1 - num2))" echo "$num1 * $num2 = $((num1 * num2))" echo "$num1 ** $num2 = $((num1 ** $num2))" echo "$num1 / $num2 = $((num1 / num2))" echo "$num1 % $num2 = $((num1 % num2))" ;; "quit" ) exit ;; *) echo "Invalid selection, please try again" ;; esac done
编写注意事项
- Shell脚本中所有语法符号(引号、括号、分号等)必须使用英文半角格式,中文符号会直接导致解析失败。
case语句的每个逻辑分支末尾必须添加;;标记分支结束,所有分支需保持平级,不能出现嵌套错位。- 同一行书写多条独立命令时,必须用
;做分隔,否则Shell会将后续内容识别为前一条命令的传入参数。
内容的提问来源于stack exchange,提问作者Md Rahman
相关产品推荐
相关产品推荐

