为什么这个bash expr命令不起作用?

时间:2011-01-24 17:32:39

标签: linux bash shell fedora

我试图在bash脚本中增加一个变量,但它无效。这是我的代码:

#! /bin/bash

COUNTER=0
while [ $COUNTER -lt 5 ]
do
    echo "i will add this line to file mycreation">>./myfile
    COUNTER = `expr $COUNTER + 1`
done

COUNTER作业周围的引号是反引号。

我尝试将COUNTER替换为$COUNTER,如下所示:

$COUNTER = `expr $COUNTER + 1`

但这并没有解决问题并给了我以下错误:

line7: 0: command not found. 

4 个答案:

答案 0 :(得分:32)

正如@Cory正确指出的那样,等号周围不应有空格,否则bash会混淆COUNTER命令。

COUNTER=$(expr $COUNTER + 1)

偏离主题......

也就是说,您可以通过使用以下替代方法避免将bash fork作为子进程:

实际上,你的while循环可以写成:

for ((COUNTER=0; COUNTER <= 5 ; COUNTER++))
do
    echo "i will add this line to file mycreation">>./myfile
done

分解错误消息

当您遇到错误时:

line 7:   0:    command not found.
'-----'  '--'  '------------------'
   |       |                 |
location   |            Description of error.
          culprit 

我的猜测就是你在第7行所拥有的

$COUNTER = `expr $COUNTER + 1`
--------   --------------------
    |                 |
Evaluated to 0        |
                  Evaluated to 1

bash最终看到的是0 = 1,并且由于bash语句通常采用command arg1 arg1 ...形式,因此bash会将其解释为运行带有参数0的命令= 1。因此错误消息:0: command not found

当您删除等号周围的空格时,bash最终解释的是:

0=1

表示运行没有参数的命令0=1,因此错误为0=1: command not found

变量分配应采用VAR_NAME=VALUE形式(不含$),因此您应使用的语法为:

COUNTER=`expr $COUNTER + 1` # or any of the variants above

哪个bash评估并最终解释为:

COUNTER=2

答案 1 :(得分:6)

删除等号周围的空格:

COUNTER=`expr $COUNTER + 1`

答案 2 :(得分:3)

另一种方式。

COUNTER=$(($COUNTER + 1))

答案 3 :(得分:2)

for i in {0..4}; do 
    echo "i will add this line to file mycreation" >> ./myfile
done