新手求教bash脚本错误:基数值过大

sh/bash/dash/ksh/zsh等Shell脚本
头像
匪兵甲乙
帖子: 10
注册时间: 2010-11-30 11:12
送出感谢: 0
接收感谢: 0

新手求教bash脚本错误:基数值过大

#1

帖子 匪兵甲乙 » 2010-12-15 18:21

写了这样一个简单脚本:
#!/bin/bash
#------------------------------------------
x=078
let y=$x+1
echo "$y" ;结果会报错:let: y=078: 基数值过大 (error token is "078");
因为专业的原因需要用“078”之类的三位数字,请教高手,这是什么原因呢?
竢实扬华,自强不息!
头像
匪兵甲乙
帖子: 10
注册时间: 2010-11-30 11:12
送出感谢: 0
接收感谢: 0

Re: 新手求教bash脚本错误:基数值过大

#2

帖子 匪兵甲乙 » 2010-12-15 19:05

我的程序设计需要这样:开始数为078,循环后+1,变成079;我用C#做了下,比如078+1后输出结果为79;有点搞不懂···
竢实扬华,自强不息!
huangyun
帖子: 49
注册时间: 2006-11-27 14:21
送出感谢: 0
接收感谢: 0
联系:

Re: 新手求教bash脚本错误:基数值过大

#3

帖子 huangyun » 2010-12-15 19:12

很简单啊,bash认为0开头的数字是8进制的,然而8进制只能使用0-7这几个数字,那个078里面有一个8,超过范围了。
huangyun
帖子: 49
注册时间: 2006-11-27 14:21
送出感谢: 0
接收感谢: 0
联系:

Re: 新手求教bash脚本错误:基数值过大

#4

帖子 huangyun » 2010-12-15 19:19

如果要去除最开始的0,可以用sed, 代码如下:

代码: 全选

#!/bin/bash

x=078
x=$(echo "$x" | sed "s/^00*//g")
let y=$x+1
echo "$y" 
当然了,这样也太难看了,你可以试试这个:

代码: 全选

#!/bin/bash

x=078
let y=10#$x+1
echo "$y" 
头像
匪兵甲乙
帖子: 10
注册时间: 2010-11-30 11:12
送出感谢: 0
接收感谢: 0

Re: 新手求教bash脚本错误:基数值过大

#5

帖子 匪兵甲乙 » 2010-12-15 20:34

谢谢三楼的具体回复,确实是bash中8进制的问题;而csh就没有这个问题;你讲的第二种代码很实用非常感谢!
竢实扬华,自强不息!
bomel
帖子: 8
注册时间: 2010-12-15 21:13
送出感谢: 0
接收感谢: 0

Re: 新手求教bash脚本错误:基数值过大

#6

帖子 bomel » 2010-12-15 21:27

代码: 全选

#!/bin/bash
x=078
y=`expr $x + 1`
echo $y
头像
匪兵甲乙
帖子: 10
注册时间: 2010-11-30 11:12
送出感谢: 0
接收感谢: 0

Re: 新手求教bash脚本错误:基数值过大

#7

帖子 匪兵甲乙 » 2010-12-16 8:35

谢谢6楼!这样也可以!我想有没有控制格式输出的命令?因为我用到的数字须是三位的,比如001 之类
竢实扬华,自强不息!
头像
fanhe
帖子: 2357
注册时间: 2007-03-24 23:45
送出感谢: 0
接收感谢: 9 次

Re: 新手求教bash脚本错误:基数值过大

#8

帖子 fanhe » 2010-12-16 9:17

代码: 全选

printf "%03d\n" 1
头像
linxiaoyu
帖子: 39
注册时间: 2009-05-03 21:09
送出感谢: 0
接收感谢: 0

Re: 新手求教bash脚本错误:基数值过大

#9

帖子 linxiaoyu » 2010-12-17 14:07

不懂楼主的意思,你好要用080么?你要用080的话,
x=078,你这么定义肯定不行。把问题发全给我们大家看看,
目前来看8楼的方法最好
GONE WITH THE WIND ~~~
头像
匪兵甲乙
帖子: 10
注册时间: 2010-11-30 11:12
送出感谢: 0
接收感谢: 0

Re: 新手求教bash脚本错误:基数值过大

#10

帖子 匪兵甲乙 » 2010-12-17 19:18

回复9楼:程序比较繁但是类似于这样
min=001
max=004
for((i=min;i<=max;i++))
do
mkdir $i
done

而创建的这个文件夹名格式必须为三位数,比如001,,002等;现在我是这样解决的:
min=001
max=004
let min=10#$min
let max=10#$max
for((i=min;i<=max;i++))
do
if (($i<10))
then
i=00idoy
elif (($i>=10)) && (($i<100))
then
i=0$i
fi
mkdir $i
let i=10#$i
done
比较笨的方法···
竢实扬华,自强不息!
huangyun
帖子: 49
注册时间: 2006-11-27 14:21
送出感谢: 0
接收感谢: 0
联系:

Re: 新手求教bash脚本错误:基数值过大

#11

帖子 huangyun » 2010-12-17 20:08

那个太复杂了,可以用 seq,比如

代码: 全选

for i in $(seq -w 1 100)
do
   mkdir $i
done
seq还可以用 -f 去控制格式
头像
linxiaoyu
帖子: 39
注册时间: 2009-05-03 21:09
送出感谢: 0
接收感谢: 0

Re: 新手求教bash脚本错误:基数值过大

#12

帖子 linxiaoyu » 2010-12-18 10:00

11楼的方法没试过,我不知道seq命令。。汗一个,
另外结合八楼说的给出脚本
#!/bin/bash
rm temp >& /dev/null
nawk 'BEGIN{min=1;max=55;for (i=min;i<=max;i++){printf ("%03d\n",i)>"temp"}}'
mkdir `cat temp`
rm temp >& /dev/null

这里min,max均为10进制数,自己设定
bash下测试通过
附件
Screenshot.png
GONE WITH THE WIND ~~~
头像
匪兵甲乙
帖子: 10
注册时间: 2010-11-30 11:12
送出感谢: 0
接收感谢: 0

Re: 新手求教bash脚本错误:基数值过大

#13

帖子 匪兵甲乙 » 2010-12-18 14:45

谢谢6 8 11 12楼的大力帮助!12楼的没怎么看懂···,我最后用的11楼的seq语句,感觉比较方便呵呵
竢实扬华,自强不息!
头像
trigger
帖子: 1585
注册时间: 2006-10-25 18:08
送出感谢: 0
接收感谢: 0

Re: 新手求教bash脚本错误:基数值过大

#14

帖子 trigger » 2010-12-18 14:57

匪兵甲乙 写了:谢谢6 8 11 12楼的大力帮助!12楼的没怎么看懂···,我最后用的11楼的seq语句,感觉比较方便呵呵
还有更方便的

代码: 全选

for i in {001..004};do echo $i ;done
001
002
003
004
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
头像
匪兵甲乙
帖子: 10
注册时间: 2010-11-30 11:12
送出感谢: 0
接收感谢: 0

Re: 新手求教bash脚本错误:基数值过大

#15

帖子 匪兵甲乙 » 2010-12-18 21:39

回复14楼:呵呵 谢谢! 果真更简洁, linux bash编程的确博大精深啊
竢实扬华,自强不息!
回复

回到 “Shell脚本”