为啥这个 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 上不起作用
当 cron 运行时,bash 脚本中的一个特定命令不起作用,所有其他命令都可以