【问题标题】:Why doesn't this bash expr command work? [duplicate]为什么这个 bash expr 命令不起作用? [复制]
【发布时间】:2011-06-14 16:17:35
【问题描述】:

我试图在 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. 

【问题讨论】:

  • 当您在分配的 LHS 上使用 $COUNTER 时出现命令 0 未找到错误 - $COUNTER 扩展为 0,然后 shell 尝试执行该命令。

标签: linux bash shell fedora


【解决方案1】:

正如@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 将其解释为运行带有参数 = 1 的命令 0。因此错误消息: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

【讨论】:

  • 如果使用 bashisms,请务必使用 /bin/bash 进行 shebang,我认为如果 bash 被调用为 /bin/sh (POSIX) 或 /bin/sh 没有指向,它们中的一些实际上会关闭彻底抨击(在某些系统上破折号)。
  • 您好,我删除了它周围的空格,但它所做的只是它现在给了我 line:7 0=1 command not found。为什么它从 0:0 变为 0:1 让我感到困惑。也许我根本不应该使用 expr ?我不明白为什么它被列为有用的命令。谢谢
  • @Marin 当你遇到错误时,你的开头有 $ 符号吗?它应该是 COUNTER=.. 而不是 $COUNTER=...
  • 答案已更新,假设我的预感是正确的。
  • 感谢肖恩!它起作用了,由于某种原因,空格起到了作用,但我仍然不明白为什么它如此敏感?谢谢,我想我应该坚持使用 AWK
【解决方案2】:

删除等号周围的空格:

COUNTER=`expr $COUNTER + 1`

【讨论】:

    【解决方案3】:

    另一种方式。

    COUNTER=$(($COUNTER + 1))
    

    【讨论】:

    • 没有很好的文档记录,但您不必取消引用算术表达式中的变量:COUNTER=$((COUNTER+1))((COUNTER++)) 如上所述
    【解决方案4】:
    for i in {0..4}; do 
        echo "i will add this line to file mycreation" >> ./myfile
    done
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      相关资源
      最近更新 更多