Mam ten skrypt Bash i miałem problem z wierszem 16. Jak mogę pobrać poprzedni wynik z wiersza 15 i dodać go do zmiennej w wierszu 16?
#!/bin/bash
num=0
metab=0
for ((i=1; i<=2; i++)); do
for j in `ls output-$i-*`; do
echo "$j"
metab=$(cat $j|grep EndBuffer|awk '{sum+=$2} END { print sum/120}') (line15)
num= $num + $metab (line16)
done
echo "$num"
done
Odpowiedzi:
Dla liczb całkowitych :
Użyj rozszerzenia arytmetycznego :
$((EXPR))
Korzystanie z zewnętrznego
expr
narzędzia. Pamiętaj, że jest to potrzebne tylko w przypadku naprawdę starych systemów.Dla zmiennoprzecinkowego :
Bash nie obsługuje tego bezpośrednio, ale jest kilka zewnętrznych narzędzi, których możesz użyć:
Możesz także użyć notacji naukowej (na przykład
2.5e+2
).Typowe pułapki :
Podczas ustawiania zmiennej nie możesz mieć białych znaków po żadnej stronie
=
, w przeciwnym razie wymusi ona na powłoce interpretację pierwszego słowa jako nazwy aplikacji do uruchomienia (na przykładnum=
lubnum
)num= 1
num =2
bc
iexpr
oczekuj każdej liczby i operatora jako osobnego argumentu, więc spacja jest ważna. Nie mogą przetwarzać argumentów takich jak3+
+4
.num=`expr $num1+ $num2`
źródło
num1
inum2
istnieniu miały wartości całkowite?$((..))
ocena arytmetyczna jest wykonywana w trybie bash.expr
jest wykonywany jako osobny proces, więc będzie o wiele wolniejszy. użyj tego drugiego w systemach, w których ocena arytmetyczna nie jest obsługiwana (sh! = bash)$((…))
jest standaryzowany przez POSIX, powinno to być coraz rzadsze, coexpr
jest konieczne.Użyj
$(( ))
rozszerzenia arytmetycznego.Aby uzyskać więcej informacji, zobacz Rozdział 13. Rozbudowa arytmetyczna .
źródło
191.003 + 190
.Jest na to tysiąc sposobów. Oto jeden z nich
dc
(odwrócony polski kalkulator biurkowy, który obsługuje arytmetykę o nieograniczonej precyzji):Ale jeśli to dla ciebie zbyt błaha (lub ważne jest przenośność), możesz powiedzieć
Ale może jesteś jedną z tych osób, które uważają RPN za niegrzeczne i dziwne; nie martw się!
bc
jest tu dla ciebie:To powiedziawszy, istnieje kilka niepowiązanych ulepszeń w skrypcie:
Jak opisano w Bash FAQ 022 , Bash natywnie nie obsługuje liczb zmiennoprzecinkowych. Jeśli chcesz zsumować liczby zmiennoprzecinkowe, wymagane jest użycie zewnętrznego narzędzia (takiego jak
bc
lubdc
).W takim przypadku rozwiązaniem byłoby
Aby dodać kumulować możliwie zmiennoprzecinkowe liczby do
num
.źródło
W bash
Zauważ, że bash obsługuje tylko arytmetykę całkowitoliczbową, więc jeśli twoje polecenie awk zwróci ułamek, to będziesz chciał przeprojektować: oto twój kod przepisany, by zrobić całą matematykę w awk.
źródło
Zawsze zapominam o składni, więc wchodzę na google, ale nigdy nie znajduję tej, którą znam: P. To jest dla mnie najczystsze i bardziej zgodne z tym, czego oczekiwałbym w innych językach.
źródło
źródło
Bardzo podoba mi się również ta metoda, mniej bałaganu:
źródło
Powinieneś zadeklarować metab jako liczbę całkowitą, a następnie zastosować ocenę arytmetyczną
Aby uzyskać więcej informacji, zobacz https://www.gnu.org/software/bash/manual/html_node/Shell-Arithmetic.html#Shell-Arithmetic
źródło
Kolejny przenośny
POSIX
zgodny sposóbbash
, który można zdefiniować jako funkcję.bashrc
dla wszystkich operatorów arytmetycznych dla wygody.i po prostu wywołaj to w wierszu poleceń jako,
Chodzi o to, aby użyć Separatora pól wejściowych (IFS) , specjalnej zmiennej
bash
używanej do dzielenia słów po rozwinięciu i dzielenia linii na słowa. Funkcja zmienia lokalnie wartość, aby użyć znaku dzielącego słowa jako operatora sumy+
.Pamiętaj, że
IFS
zmiany są zmieniane lokalnie i NIE wpływają na domyślneIFS
zachowanie poza zakresem funkcji. Fragmentman bash
strony"$(( $* ))"
Przedstawia listę argumentów przekazanych do podziału przez+
a później wartość suma jest odtwarzany za pomocąprintf
funkcji. Funkcję tę można rozszerzyć, aby dodać także zakres innych operacji arytmetycznych.źródło
źródło
użyj wbudowanej powłoki
let
, jest podobny do(( expr ))
źródło: https://www.computerhope.com/unix/bash/let.htm
źródło