Bash脚本多read命令引发expr语法错误,请求排查解决
问题分析与解决方案
错误原因1:expr运算符转义错误
你在expr中转义运算符时多添加了空格,比如\ +会被Shell解析为带空格的+参数,导致expr无法正确识别运算符,抛出syntax error。正确的转义方式是直接在运算符前加反斜杠,不需要额外空格。
错误原因2:一次性输入多值的输出异常
当你一次性输入「1 1 1」时,三个read命令会依次读取这三个值(n=1、a=1、b=1),但因为expr的语法错误,计算部分执行失败,所以只输出了1+1 =而没有结果。
修复后的脚本
方案1:修正expr的转义写法
#!/bin/bash echo "1.Addition 2.Subtraction 3.Multiplication 4.Division" read n echo "Enter the operends" read a read b case $n in "1") echo "$a+$b =`expr $a \+ $b`";;; "2") echo "$a-$b=`expr $a \- $b`";;; "3") echo "$a*$b=`expr $a \* $b`";;; "4") echo "$a/$b=`expr $a \/ $b`";;; esac
方案2:使用Bash内置算术扩展(更推荐)
Bash支持$((...))进行算术运算,无需依赖expr,也不需要转义运算符,简洁且可靠:
#!/bin/bash echo "1.Addition 2.Subtraction 3.Multiplication 4.Division" read n echo "Enter the operends" read a read b case $n in "1") echo "$a+$b = $((a + b))";;; "2") echo "$a-$b = $((a - b))";;; "3") echo "$a*$b = $((a * b))";;; "4") echo "$a/$b = $((a / b))";;; esac
验证效果
- 依次输入
1、1、1时,会输出1+1 = 2 - 一次性输入
1 1 1时,脚本会自动分配n=1、a=1、b=1,同样输出1+1 = 2
内容的提问来源于stack exchange,提问作者varun prasad
相关产品推荐
相关产品推荐

