LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1761|回复: 20

关于用expr处理两个整数的除法和余数的计算的问题[已解决]

[复制链接]
发表于 2004-4-6 22:06:09 | 显示全部楼层 |阅读模式
看下面的程序,输入两个整数的参数可以实现除法和余数的计算:

for i in / %
do
        result=`expr $1 $i $2`
        echo "$1 $i $2 = $result "
done

可是令我不解的是当我打算在in 后面再添加+ - * 以实现其他的运算的时候,却老是出错。
这是怎么回事呢?
大虾帮忙解释一下吧,这几个运算符难道有什么不同吗。谢谢
要不我睡不着觉了。
发表于 2004-4-6 22:22:30 | 显示全部楼层
  1. for i in + - '*' / % ;do
  2.         result=$(echo "$1$i$2"|bc)
  3. #       result=`expr $1 $i $2`
  4.         echo "$1 $i $2 = $result "
  5. done
复制代码
因为expr在进行乘法操作中,乘法的运算符号需要用\*来转义的,要不你就加个判断,要不就想我的那样用bc
发表于 2004-4-6 22:54:55 | 显示全部楼层

  1. #/bin/bash
  2. for i in + - \* / %
  3. do
  4. echo "$1 $i $2 = "`expr $1 "$i" $2`
  5. done

  6. [linuxer@mydesktop test]$ . test.sh 4 2
  7. 4 + 2 = 6
  8. 4 - 2 = 2
  9. 4 * 2 = 8
  10. 4 / 2 = 2
  11. 4 % 2 = 0
复制代码
发表于 2004-4-7 03:11:57 | 显示全部楼层
  1. for i in + - \* / %;do
  2.         echo "$1${i}$2=$((1${i}2))"
  3. #use awk :-)
  4. #        echo -n "$1${i}$2=";awk 'BEGIN{print '$1''$i''$2'}'
  5. done
复制代码

ps:expr对浮点数的支持很不好~,如要对浮点有要求,还是用bc
的-l选项和scale=n比较好~
发表于 2004-4-7 08:56:47 | 显示全部楼层
最初由 javalee 发表

  1. for i in + - '*' / % ;do
  2.         result=$(echo "$1$i$2"|bc)
  3. #       result=`expr $1 $i $2`
  4.         echo "$1 $i $2 = $result "
  5. done

复制代码

因为expr在进行乘法操作中,乘法的运算符号需要用\*来转义的,要不你就加个判断,要不就想我的那样用bc

expr 并不需要什么 \* 转意,只是 bash 会把 * 理解为文件通配符
发表于 2004-4-7 10:38:01 | 显示全部楼层
最初由 dearvoid 发表
expr 并不需要什么 \* 转意,只是 bash 会把 * 理解为文件通配符

home/javalee:expr 4 * 5
expr: syntax error
/home/javalee:bash
/home/javalee:expr 4 * 5
expr: syntax error
/home/javalee:expr 5 \* 4
20
/home/javalee:exit
exit
/home/javaleeD KSH v5.2.14 99/07/13.2
发表于 2004-4-7 10:48:12 | 显示全部楼层
没错,的确如javalee所言,要加上"\"来屏蔽"*"这个通配符。
在命令行处理的第10步──"路径名扩展"中,shell会把*进行通配符扩展,也就是把它换成当前目录下的所有文件。而在这里,"*"应该作为expr的操作符,所以要加上"\"来屏蔽"*"。
发表于 2004-4-7 10:57:21 | 显示全部楼层
知其然不知其所以然

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2004-4-7 11:11:46 | 显示全部楼层
最初由 dearvoid 发表
知其然不知其所以然

兄弟的插图正好验证了命令行处理!的确要加"\"来屏蔽通配符扩展的。注意,所谓屏蔽的本质就是转义,expr的确不需要"\"转义,但bash需要用它来转义后再传递给expr
发表于 2004-4-7 11:17:24 | 显示全部楼层
最初由 dearvoid 发表
知其然不知其所以然

dearvoid兄教训的是,:thank
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表