#!/bin/bash
sed 's/[^0-9 ]*//g' $1 | tr " " "\n" > outfile.txt
sed '/^\s*$/d' outfile.txt > outfile1.txt
if [ $2 == "-s" ] || [ $2 == "-si" ] || [ $2 == "-is" ]
then
sum=0;
while read num;
do ((sum += num));
done < outfile1.txt;
echo "SUMA= $sum"
fi
if [ $2 == "-i" ] || [ $2 == "-si" ] || [ $2 == "-is" ]
then
ilo=1;
while read num1;
do((ilo = num1 * ilo));
echo $num1
done < outfile1.txt;
echo "ILOCZYN= $ilo"
fi
这是我的脚本,这是第一个参数文件
1 2 3 4 5 4 3 2 3 4 5 4 3
2 2 2 2 22 3 34 4 4 5 5 5 d
3 43 54 5 3
当我想获得所有数字及其总和的乘积时,这就是我从脚本中得到的结果
s17545@msh:~$ ./skrypt12.sh logfile.txt -si
SUMA= 241
1
.
. all of the numbers in outfile1.txt
.
3
ILOCZYN= -2888071394797551616
有什么想法我做错了吗?
答案1
作为页 由@steeldriver 链接解释说,算术溢出是 Bash 中不可避免的事实。你可以改为:
- 使用开箱即用支持任意大小数字的语言,例如(我相信)Haskell、Lisp 或Scheme,
- 使用一种会在算术溢出时抛出异常的语言,例如 Java 或 Rust,
- 检查每次操作后乘积是否减少(因为所有数字都是正数),或者
- 重新考虑你的方法,这样你就不需要一次性将所有数字相乘(当然这并不总是可能的)。