Bash脚本:$ x = $ x + 2未被识别

时间:2018-03-24 07:55:55

标签: linux bash shell unix

当我执行以下脚本时,我收到以下错误: -  脚本执行无限,每次都打印下面的行。  "第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

3 个答案:

答案 0 :(得分:3)

您得到line 9: 1=1+2: command not found,因为1=1+2$x=$x+2 扩展的内容。

使用exprlet((...))进行整数计算,使用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