
#!/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など、算術オーバーフロー時に例外をスローする言語を使用する。
- 各操作後に製品が減少したかどうかを確認します(すべての数値が正であるため)、または
- すべての数値を一度に掛け算する必要がないように、アプローチを再考してください (もちろん、常に可能であるとは限りません)。