將文件中每一行的數字相乘得到負值

將文件中每一行的數字相乘得到負值
#!/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,
  • 檢查每次操作後乘積是否減少(因為所有數字都是正數),或者
  • 重新考慮你的方法,這樣你就不需要一次性將所有數字相乘(當然這並不總是可能的)。

相關內容