如何不依赖bc工具在Bash中开发支持多参数的高级计算器
完整可运行实现方案
#!/bin/bash # 输入合法性校验:参数必须为奇数(数字、运算符交替出现) if (( $# % 2 == 0 )); then echo "输入错误:参数应为数字和运算符交替的奇数个,示例:./calc.sh 2 + 3 * 7 - 2 ^ 3" exit 1 fi # 按优先级从高到低定义运算符 operators=('^' '*' '/' '+' '-') # 初始化运算数组 calc_arr=("$@") # 按优先级遍历运算符 for op in "${operators[@]}"; do # 循环处理当前优先级的所有运算符 while true; do # 查找当前运算符在数组中的索引 op_index=-1 for i in "${!calc_arr[@]}"; do if [[ "${calc_arr[$i]}" == "$op" ]]; then op_index=$i break fi done # 找不到当前运算符,退出循环处理下一个优先级 if (( op_index == -1 )); then break fi # 取运算符左右的数字 left_num=${calc_arr[op_index-1]} right_num=${calc_arr[op_index+1]} # 根据运算符计算结果 case $op in '^') res=$(( left_num ** right_num )) ;; '*') res=$(( left_num * right_num )) ;; '/') res=$(( left_num / right_num )) ;; '+') res=$(( left_num + right_num )) ;; '-') res=$(( left_num - right_num )) ;; esac # 替换数组中的三个元素(左值、运算符、右值)为计算结果 calc_arr=( "${calc_arr[@]:0:op_index-1}" "$res" "${calc_arr[@]:op_index+2}" ) done done # 最终数组只剩一个元素,就是运算结果 echo "${calc_arr[0]}"
功能验证
- 异常输入校验:如果传入偶数个参数会直接报错提示
- 优先级运算支持:
执行示例命令./calc.sh 2 + 3 * 7 - 2 ^ 3,输出结果为15,符合运算规则 - 幂运算支持:执行
./calc.sh 2 ^ 3 * 4,输出结果为32
内容的提问来源于stack exchange,提问作者stud1234
相关产品推荐
相关产品推荐

