数字运算问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
novesky
帖子: 159
注册时间: 2008-07-12 17:18

数字运算问题

#1

帖子 novesky » 2011-07-19 11:49

其实我是想根据mplayer的到的视屏长度计算毫秒数的,mplayer给出的是xx.xxx形式,比如12.03输出应该为12030
我的计算脚本

v=12.03
a=`echo $v |cut -d. -f 1`
b=`echo $v |cut -d. -f2`
echo $(($((a*1000))+$b))

现在有些情况下算不来,其实归纳下就是比如
echo $((08)) 会报错,更小的数字不会
bash: 08: 数值太大不可为算数进制的基 (错误符号是 "08")
而echo $((8))不会
这是什么原因?

下面是我修改后的代码,很傻

代码: 全选

videolength=$1
secs=`echo $videolength |cut -d. -f 1`                   
msecs=`echo $videolength |cut -d. -f 2`

a=`echo $msecs |cut -c1`
if [ $a == 0 ]
then
  msecs=`echo $msecs |cut -c2-`
  [ $msecs -lt 10 ] && msecs=$(($msecs*10))
fi

vlen=$(($msecs+$(($secs*1000))))                           
echo $vlen 
还有,不许用bc
上次由 novesky 在 2011-07-19 14:25,总共编辑 2 次。
头像
poweroff
帖子: 395
注册时间: 2008-12-13 15:03

Re: 数字运算问题

#2

帖子 poweroff » 2011-07-19 12:10

08 bash 把它当成8进制了。
一条狗的马甲!
对不起,我承认我是一只穿着马甲的狗!
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 数字运算问题

#3

帖子 fnan » 2011-07-19 12:22

v=12.013;set ${v/.*(0)/ };echo $(($1*1000+$2))
12013
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
头像
cjxgm
帖子: 1952
注册时间: 2010-04-23 20:40
系统: Arch Linux
来自: 浙江·杭州
联系:

Re: 数字运算问题

#4

帖子 cjxgm » 2011-07-19 13:47

代码: 全选

echo $v*1000|bc
:em06
Clanjor Prods. | Develop for Developers. (C++, Lua) | 作曲编曲 | 实时渲染引擎
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 数字运算问题

#5

帖子 fnan » 2011-07-19 14:12

kose1@kose1-desktop:~/b$ v=12.03;set ${v/.*(0)/ };echo $(($1*1000+$2))
12003
kose1@kose1-desktop:~/b$ echo $v*1000|bc
12030.00
可不一样的结果。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
novesky
帖子: 159
注册时间: 2008-07-12 17:18

Re: 数字运算问题

#6

帖子 novesky » 2011-07-19 14:21

fnan 写了:v=12.013;set ${v/.*(0)/ };echo $(($1*1000+$2))
12013
可能我没说清楚,小数是表示时间,即12.01秒=12010毫秒,你的算出来就是12001
不过方法不错,还没看懂,那个set ${v/.*(0)/ }什么意思?
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 数字运算问题

#7

帖子 fnan » 2011-07-19 14:34

那知道lz实际想法,按例子修改而已,为何不许用bc?按你说的不就是变量v乘1000吗?
那个set ${v/.*(0)/ }什么意思?
去掉点号和零并设置位置参数。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 数字运算问题

#8

帖子 fnan » 2011-07-19 15:03

乘1000,即小数只保留三位,不用bc就:
v=12.013;set ${v/./ };expr substr $1$2000 1 $((${#1}+3))
12013
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
novesky
帖子: 159
注册时间: 2008-07-12 17:18

Re: 数字运算问题

#9

帖子 novesky » 2011-07-19 15:33

fnan 写了:那知道lz实际想法,按例子修改而已,为何不许用bc?按你说的不就是变量v乘1000吗?
那个set ${v/.*(0)/ }什么意思?
去掉点号和零并设置位置参数。
板子上没bc,移植又闲麻烦 :em09
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 数字运算问题

#10

帖子 fnan » 2011-07-19 15:35

修改了下代码:
videolength=$1
secs=`echo $videolength |cut -d. -f 1`
msecs=`echo $videolength |cut -d. -f 2`
vlen=$((${msecs##0}*10**(3-${#msecs})+$secs*1000))
echo $vlen
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
novesky
帖子: 159
注册时间: 2008-07-12 17:18

Re: 数字运算问题

#11

帖子 novesky » 2011-07-19 15:45

fnan 写了:乘1000,即小数只保留三位,不用bc就:
v=12.013;set ${v/./ };expr substr $1$2000 1 $((${#1}+3))
12013
好厉害!我板子上expr substr ${1}${2}000 1 $((${#1}+3)) 才行
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 数字运算问题

#12

帖子 fnan » 2011-07-19 16:03

板子需要超短代码?
set ${1/./ }000
echo $1${2:0:3}
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
novesky
帖子: 159
注册时间: 2008-07-12 17:18

Re: 数字运算问题

#13

帖子 novesky » 2011-07-19 23:06

fnan 写了:板子需要超短代码?
set ${1/./ }000
echo $1${2:0:3}
太崇拜你了!这些用法从来没见过!你是怎么学的呀?
fnan
帖子: 919
注册时间: 2009-07-01 22:04

Re: 数字运算问题

#14

帖子 fnan » 2011-07-19 23:25

novesky 写了:
fnan 写了:板子需要超短代码?
set ${1/./ }000
echo $1${2:0:3}
太崇拜你了!这些用法从来没见过!你是怎么学的呀?
装b小技罢了,写法几乎任何一本基础教程都有,怎样用就各人发挥了。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。
回复