Kiedy uruchamiam polecenia w mojej powłoce, jak poniżej, zwraca expr: non-integer argument
błąd. Czy ktoś może mi to wyjaśnić?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Kiedy uruchamiam polecenia w mojej powłoce, jak poniżej, zwraca expr: non-integer argument
błąd. Czy ktoś może mi to wyjaśnić?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Odpowiedzi:
Te zmienne są zmiennymi powłoki. Aby rozwinąć je jako parametry do innego programu ( tj. expr
), Musisz użyć $
przedrostka:
expr $x / $y
Narzekał, ponieważ sądził, że próbujesz operować na znakach alfabetycznych ( tj. Nie-całkowitych)
Jeśli używasz powłoki Bash, możesz osiągnąć ten sam wynik, używając składni wyrażenia:
echo $((x / y))
Lub:
z=$((x / y))
echo $z
man bash
po znaku zachęty ( q
aby wyjść)
Myślę, że wspomniano już o tym w innych wątkach:
calc(){ awk "BEGIN { print "$*" }"; }
możesz po prostu wpisać:
calc 7.5/3.2
2.34375
W Twoim przypadku będzie to:
x=20; y=3;
calc $x/$y
lub jeśli wolisz, dodaj to jako oddzielny skrypt i udostępnij w $ PATH, aby zawsze mieć go w swojej lokalnej powłoce:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
Dlaczego nie skorzystać z let; Uważam to za dużo łatwiejsze. Oto przykład, który może okazać się przydatny:
start=`date +%s`
# ... do something that takes a while ...
sleep 71
end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds
Kolejny prosty przykład - oblicz liczbę dni od 1970 roku:
let days=$(date +%s)/86400
Domyślną powłoką w większości dystrybucji Linuksa jest Bash. W Bash zmienne muszą używać przedrostka w postaci znaku dolara do rozwijania parametrów . Na przykład:
x=20
y=5
expr $x / $y
Oczywiście Bash ma również operatory arytmetyczne i specjalną składnię interpretacji arytmetycznej , więc nie ma potrzeby wywoływania pliku binarnego wyrażenia jako oddzielnego procesu. Możesz pozwolić powłoce wykonać całą pracę w ten sposób:
x=20; y=5
echo $((x / y))
expr
jest odradzane w 2013 roku.
Załóżmy, że
x=50
y=5
następnie
z=$((x/y))
to będzie działać poprawnie. Ale jeśli chcesz użyć operatora / w przypadku instrukcji, nie może tego rozwiązać. W takim przypadku użyj prostych łańcuchów, takich jak div, divide lub coś innego. Zobacz kod
/
działa dobrze jako etykieta typu shell-case. To, co nie działa, to *
mnożenie bez cytowania, co może być tym, co faktycznie zrobiłeś; to powoduje, że skutecznie zastępuje wszystkie następujące elementy w przypadku, które w twoim przykładzie to „devide” i „modulo”
Aby uzyskać liczby po przecinku, możesz to zrobić: -
read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div