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
#2
帖子
由 poweroff » 2011-07-19 12:10
08 bash 把它当成8进制了。
一条狗的马甲!
对不起,我承认我是一只穿着马甲的狗!
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#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
- 来自: 浙江·杭州
-
联系:
#4
帖子
由 cjxgm » 2011-07-19 13:47
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#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
#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
#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
#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
#9
帖子
由 novesky » 2011-07-19 15:33
fnan 写了:那知道lz实际想法,按例子修改而已,为何不许用bc?按你说的不就是变量v乘1000吗?
那个set ${v/.*(0)/ }什么意思?
去掉点号和零并设置位置参数。
板子上没bc,移植又闲麻烦

-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#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
#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
#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
#13
帖子
由 novesky » 2011-07-19 23:06
fnan 写了:板子需要超短代码?
set ${1/./ }000
echo $1${2:0:3}
太崇拜你了!这些用法从来没见过!你是怎么学的呀?
-
fnan
- 帖子: 919
- 注册时间: 2009-07-01 22:04
#14
帖子
由 fnan » 2011-07-19 23:25
novesky 写了:fnan 写了:板子需要超短代码?
set ${1/./ }000
echo $1${2:0:3}
太崇拜你了!这些用法从来没见过!你是怎么学的呀?
装b小技罢了,写法几乎任何一本基础教程都有,怎样用就各人发挥了。
bash不如perl精妙,学不到lisp的皮毛,远不够c++强悍,不过可以用。