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

Mar*_*rin 10 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
Run Code Online (Sandbox Code Playgroud)

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

我试图取代COUNTER$COUNTER这样的:

$COUNTER = `expr $COUNTER + 1`
Run Code Online (Sandbox Code Playgroud)

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

line7: 0: command not found. 
Run Code Online (Sandbox Code Playgroud)

Sha*_*hin 32

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

COUNTER=$(expr $COUNTER + 1)
Run Code Online (Sandbox Code Playgroud)

偏离主题......

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

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

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

分解错误消息

当您遇到错误时:

line 7:   0:    command not found.
'-----'  '--'  '------------------'
   |       |                 |
location   |            Description of error.
          culprit 
Run Code Online (Sandbox Code Playgroud)

我的猜测就是你在7号线上所拥有的

$COUNTER = `expr $COUNTER + 1`
--------   --------------------
    |                 |
Evaluated to 0        |
                  Evaluated to 1
Run Code Online (Sandbox Code Playgroud)

什么bash最终看到是0 = 1因为bash语句通常是在表单中command arg1 arg1 ...,bash将其解释为运行0带参数的命令= 1.因此错误信息:0: command not found.

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

0=1
Run Code Online (Sandbox Code Playgroud)

这意味着运行命令0=1没有参数,因此错误0=1: command not found.

变量赋值应该是VAR_NAME=VALUE(没有$)的形式,所以你应该使用的语法是:

COUNTER=`expr $COUNTER + 1` # or any of the variants above
Run Code Online (Sandbox Code Playgroud)

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

COUNTER=2
Run Code Online (Sandbox Code Playgroud)


Cor*_*ein 6

删除等号周围的空格:

COUNTER=`expr $COUNTER + 1`
Run Code Online (Sandbox Code Playgroud)