为啥这个 bash expr 命令不起作用? [复制]

Posted

技术标签:

【中文标题】为啥这个 bash expr 命令不起作用? [复制]【英文标题】: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 尝试执行该命令。 【参考方案1】:

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

COUNTER=$(expr $COUNTER + 1)

跑题了……

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

使用bash builtin 'let' command:

let COUNTER="COUNTER + 1"

或者,使用 bash c 风格的表达式:

(( COUNTER++ ))

其实你的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

【讨论】:

以上是关于为啥这个 bash expr 命令不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Linux bash 中这个简单的 FOR LOOP 不起作用?

为啥 npm install 在 git bash 上不起作用

为啥这个 jquery 终端命令功能不起作用?

当 cron 运行时,bash 脚本中的一个特定命令不起作用,所有其他命令都可以

为啥在超级终端中工作的永久别名在 vs-code bash 终端中不起作用?

为啥重定向输出时测试退出状态不起作用?