You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:33:22