如何在脚本中添加算术变量


26

我想累积一个文件夹中包含的许多文件的行大小。我写了以下脚本:

let a=0
let num=0
for i in folder/*
do
        num=`cat $i | wc -l`
        a=$a+$num
done
echo $a

我在脚本末尾得到的是123 + 234 + 432 + ...,而不是加法算术运算的结果。

Answers:


50

您的算术评估语法错误。使用以下任何的(第一个是非常便携,但速度慢,二是POSIX和除了Bourne shell的便携和更早版本的Almquist外壳,最后三个要求kshbashzsh):

a=`expr "$a" + "$num"`

a=$(($a+$num))

((a=a+num))

let a=a+num

((a+=num))

或者,您可以跳过整个for循环并执行以下操作:

wc -l folder/*

或者,如果您只想要总数:

cat folder/* | wc -l

或使用zsh及其mult_ios选项:

wc -l < folder/*

$里面不需要((...))a=$((a+num))已经可以了
周卫军

如果没有设置变量或值为空,那么如果没有其他方法可以解决这个问题,将可以正常工作。
巴拉特

7

您也可以使用此代码

    a=`expr $a + $num`
    echo $a

确保在“ $ a + $ num”的两个边上都有一个空格


使用expr命令进行计算时,请始终在运算符的两侧留出空间。
user1678213


1

抱歉,之前的编辑是针对其他帖子。在这里,只需对原始脚本进行少量修改:

设a = 0
令num = 0
为我在文件夹/ *
做
        num =`cat $ i | wc -l`
        a = $(回显$ a + $ num | bc)
做完了
回声$ a

1
投票否决,因为答案似乎无法解决问题。
Time4Tea

抱歉,现在纠正了
Leo

1

答案需要指定代码在哪个外壳中有效。例如,在bourne Shell(sh)中,只有以下说明有效:

a=$((a+num))
a=$(($a+$num))

@manatwork列出的其他可能性可能在bourne中再次有效shell(bash


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.