我需要对数字求和,将值向前推进,并在 Linux Bash 中的 if/else 循环中将其存储在变量中。我只得到了最后一次迭代的值,而不是整个和。
在下面的例子中,两个条件符合标准。在第一次迭代中,得分将为 100,第二次迭代得分将为 200。我需要对每次迭代的 fscore 变量中的值求和并打印最终得分。
代码:
score=0
x=10
y=20
fscore=0
arr=("abc" "efg" "ijk")
for str in ${arr[@]}
do
if [[ "$str" = "abc" && "$x" -eq 10 ]]
then
score=100
elif [[ "$str" = "efg" && "$y" -eq 20 ]]
then
score=200
else
:
fi
res=`expr $score + $fscore`
done
echo $res
输出:
200
期望输出:
300
提前致谢!
我怀疑你想要这样的东西:
或者使用 Korn 风格
[[...]]
和((...))
结构而不是它们的标准等效结构¹,使其在算术运算方面看起来更像 C:(你的代码
[[ "$str" = "abc" && "$x" -eq 10 ]]
在类似 Korn 的 shell 中也可以工作²,你的那部分代码很好)。主要问题是您没有在迭代中累积结果。上面,我们通过将添加
score
到res
变量中来累积它。其他问题:
${arr[@]}
。如果没有加引号,则使用数组没有任何意义${arr[@]}
。score
不符合任何条件的情况,因此它将继承上一次迭代的值。expr
。所有类似 POSIX 的 shell 都内置了整数运算支持。同样`cmd`
, 已被 取代$(cmd)
。for
和循环外的内容。¹ 无论如何,标准中没有数组
sh
。要使其成为标准sh
语法,您需要arr=(...)
用set -- ...
和for str in "${arr[@]}"; do
替换for str do
。[
² 请注意,它们并不完全相同。在 bash 中,-eq
仅适用于十进制整数(例如,012 被解释为 12),而对于(( ... ))
和[[...]]
的-eq
,操作数被视为算术表达式,其中5+5
、和 有时被解释为。它们也更危险,因为如果与未净化的数据一起使用,最终可能会0xA
运行任意命令,因此如果足以达到目的,通常最好使用标准命令。012
RANDOM
10
[