Używam terminala szeregowego, aby zapewnić dane wejściowe do naszego eksperymentu laboratoryjnego. Znalazłem to za pomocą
$ echo "5X5"
po prostu zwraca ciąg "5X5"
. Czy istnieje polecenie wykonania operacji mnożenia?
Używam terminala szeregowego, aby zapewnić dane wejściowe do naszego eksperymentu laboratoryjnego. Znalazłem to za pomocą
$ echo "5X5"
po prostu zwraca ciąg "5X5"
. Czy istnieje polecenie wykonania operacji mnożenia?
Odpowiedzi:
Tak, możesz użyć wbudowanego rozszerzenia arytmetycznego basha,$(( ))
aby wykonać proste obliczenia
$ echo "$((5 * 5))"
25
Sprawdź sekcję Arytmetyka powłoki w podręczniku Bash Reference Manual, aby uzyskać pełną listę operatorów.
Ze względu na kompletność, jak wskazali inni, jeśli potrzebujesz dowolnej precyzji bc
lub dc
byłoby lepiej.
Bash obsługuje ekspansję arytmetyczną z $(( expression ))
. Na przykład:
$ echo $(( 5 * 5 ))
25
Szereg narzędzi zapewnia funkcje arytmetyczne, w tym bc i expr .
$ echo '5 * 5' | /usr/bin/bc
25
$ /usr/bin/expr 5 \* 5
25
Klasyczne rozwiązanie to:
expr 5 \* 5
Inną fajną opcją jest:
echo 5 5\*p | dc
Oba te rozwiązania będą działać tylko z operandami całkowitymi.
k
. Z pewnością pamiętam domyślną dokładność równą 0 (obcięcie do liczby całkowitej). Czy źle pamiętam, czy po prostu nowsze implementacje zmieniły zachowanie?
dc
Przez lata używałem rzadko, ponieważ jestem bardziej algebraiczny i mniej RPN, więc nie pamiętam. W systemie GNU, którego używam, wartością domyślną jest 0. Stara (1993) man
strona FreeBSD wspomina, że domyślną wartością jest zero, ale starsze man
strony BSD nie.
echo '4 k 50.5 7 / p' | dc
działa (wyjście:) 7.2142
.
Używam tej funkcji, która używa bc
i tym samym obsługuje obliczenia zmiennoprzecinkowe:
c () {
local a
(( $# > 0 )) && a="$@" || read -r -p "calc: " a
bc -l <<< "$a"
}
Przykład:
$ c '5*5'
25
$ c 5/5
1.00000000000000000000
$ c 3.4/7.9
.43037974683544303797
Rozwinięcie arytmetyczne Basha nie obsługuje pływaków (ale powłoka Korna i zsh tak).
Przykład:
$ ksh -c 'echo "$((3.0 / 4))"'
0.75
Mam do tego prosty skrypt:
me@mycomputer:~$ cat /usr/local/bin/c
#!/bin/sh
echo "$*" | sed 's/x/\*/g' | bc -l
Zmienia się x
na, *
ponieważ *
jest to znak specjalny w powłoce. Użyj go w następujący sposób:
c 5x5
c 5-4.2 + 1
c '(5 + 5) * 30'
(nadal musisz używać cudzysłowów, jeśli wyrażenie zawiera nawiasy).tr
może służyć do mapowania znaków dla wielu znaków.
Jeśli lubisz Pythona i masz możliwość zainstalowania pakietu, możesz użyć tego narzędzia, które stworzyłem.
# install pythonp
python -m pip install pythonp
pythonp "5*5"
25
pythonp "1 / (1+math.exp(0.5))"
0.3775406687981454
# define a custom function and pass it to another higher-order function
pythonp "n=10;functools.reduce(lambda x,y:x*y, range(1,n+1))"
3628800
dc
działa z pływakami. Spróbujecho '4 k 50 7 / p' | dc
. Wynik jest7.1428
.k
Polecenie ustawia precyzję.