1

我的脚本 ./make_shift_ln_o_dummy.sh:

for i in  `seq -w 0 272`
do
y=0
x=1
echo $i
y=$(($i +$x))
echo $y
done

我的输出带有错误消息:算术表达式:期望 EOF:“008 +1”

000
1
001
2
002
3
003
4
004
5
005
6
006
7
007
8
008
./make_shift_ln_o_dummy.sh: 25: arithmetic expression: expecting EOF: "008 +1"

为什么会这样?我做错了什么?我应该如何将其更改为 272 的输出?

4

3 回答 3

4

为什么会这样?

bash 表达式求值器看到前导0并假定八进制常量将跟随但8不是有效的八进制数字。

4.2 版bash给出了更有用的诊断:

$ echo $((007 + 1))
8
$ echo $((008 + 1))
bash: 008: value too great for base (error token is "008")

上面anubhava的答案给出了“如何解决”,这就是我赞成它的原因。

于 2012-05-09T12:09:23.110 回答
3

008 是八进制数。您可以指定要在算术表达式中使用以 10 为底的数字:

y=$((10#$i +$x))

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic

于 2012-05-09T14:37:16.040 回答
2

不需要在seq这里使用。您可以像这样使用 bash 算术功能:

for ((i=0; i<272; i++))
do
   y=0
   x=1
   printf "%03d\n" $i
   y=$(($i + $x))
   printf "%03d\n" $y
done
于 2012-05-09T11:53:54.003 回答