Умножение чисел из каждой строки в файле дает отрицательное значение

1 практический пример inode:

у вас есть файл с хитрым именем (пример ~ *), и вам нужно его удалить.

ls
~*

rm -rf ~ * повреждает ваш $ HOME, поэтому вам придется удалить его другим способом.

Прочтите здесь , как удалять файлы по индексному дескриптору.

Удалить файл по индексу:

find . -type f -inum 1234 - exec rm -rf {} /;

хорошо, я знаю, что вы можете избежать специальных символов и просто удалить его с помощью rm или использовать трюк -, но все же.

2
02.06.2018, 01:58
2 ответа

Como explica la página enlazada por @steeldriver , el desbordamiento aritmético es una realidad en Bash. En su lugar, podrías:

  • use un lenguaje que admita números de tamaño arbitrarios -listos para usar, como (Creo que )Haskell, Lisp o Scheme,
  • use un lenguaje que lanzará una excepción en el desbordamiento aritmético, como Java o Rust,
  • compruebe si el producto ha disminuido después de cada operación (ya que todos sus números son positivos )o
  • reconsidere su enfoque para que no necesite multiplicar todos los números de una vez (lo que, por supuesto, no siempre es posible ).
2
27.01.2020, 22:09

La ​​aritmética de shell se limita a la representación interna de enteros.
La aritmética de Bash en computadoras de 64 bits debe ser menor que:

$ echo "$((2**63-1))"
9223372036854775807

Usando el siguiente re -escriba su secuencia de comandos para usar bcy obtenga el valor correcto (eliminando el carácter dque parece un error en su pregunta):

#!/bin/bash

myf="outfile.txt"
sed  's/[^0-9 ]*//g'  "$1" | tr " " "\n" | sed '/^\s*$/d' > "$myf"

sum=$(bc <<< "$(cat "$myf"| tr -s ' \n' '++')0")
ilo=$(bc <<< "$(cat "$myf"| tr -s ' \n' '**')1")

[[ $2 =~ s ]] && echo "SUMA= $sum"
[[ $2 =~ i ]] && echo "ILOCZYN= $ilo"

Obtenemos:

$./skrypt12.sh logfile.txt -si
SUMA= 241
ILOCZYN= 15558672678912000000

Como puede ver, el resultado de la multiplicación es más grande de lo que bash podría manejar.

0
27.01.2020, 22:09

Теги

Похожие вопросы