当我执行以下脚本时,我收到以下错误: - 脚本执行无限,每次都打印下面的行。 "第9行:1 = 1 + 2:未找到命令"。为什么呢?
#!/bin/bash
echo "Script 1 - Linux Scripting Book"
x=1
while [ $x -le 45 ]
do
echo x : $x
$x=$x+2
done
echo "End Of Script 1"
exit 0
此外,如果我将$x=$x+2
更改为x+$x+2
,那么我也会收到以下错误。
line 6: [: 1+2: integer expression expected
执行此类脚本时运行正常。
#!/bin/bash
echo "Script 1 - Linux Scripting Book"
x=1
while [ $x -le 45 ]
do
echo x : $x
let x=x+2
done
echo "End Of Script 1"
exit 0
答案 0 :(得分:3)
您得到line 9: 1=1+2: command not found
,因为1=1+2
是$x=$x+2
扩展的内容。
使用expr
或let
或((...))
进行整数计算,使用bc
进行浮点运算:
let x=x+2
((x=x+2)) #same as above
((x+=2)) #same
((x++)) #if adding just one
((++x)) #if adding just one
x=$((x+2))
x=`expr $x + 2` #space before and after +
x=$(echo $x+2|bc) #using bc
x=$(echo $x+2.1|bc) #bc also works with floating points (numbers with decimals)
答案 1 :(得分:2)
因为它不是用于设置变量的Bourne shell语法;它看起来更像Perl或PHP。 $
用于parameter expansion,不属于变量名称。 Variable赋值仅使用=
,let
计算算术表达式(非常类似$((expression))
)。另一种应该起作用的语法是x=$((x+2))
。注意,这些算术评估是一个bash功能;标准的unix shell可能需要使用expr
之类的外部工具。
答案 2 :(得分:2)
由于这部分问题尚未清除,并且在评论中发布不合适,我添加了部分答案:
x=1; for i in 1 2 3 ; do x=$x+2; echo $x; done
1+2
1+2+2
1+2+2+2
作为旁注:如果没有充分的理由,请不要在脚本末尾使用exit 0。脚本完成后,它会在没有您帮助的情况下自行退出。退出状态将是执行的最后一个命令的退出状态,在您的情况下是一个简单的回声,几乎总是成功。在极少数情况下,它会失败,你可能会无意中隐藏失败。
如果您获取脚本,则退出将使您退出正在运行的shell。
但你可以像这样重写你的while循环:
x=0
while (($((x)) < 9))
do
echo x : $x
x=$x+2
done
echo $((x))
x : 0
x : 0+2
x : 0+2+2
x : 0+2+2+2
x : 0+2+2+2+2
10