Poniższy kod daje
[: -ge: oczekiwano jednoargumentowego operatora
kiedy
i=0
if [ $i -ge 2 ]
then
#some code
fi
czemu?
Poniższy kod daje
[: -ge: oczekiwano jednoargumentowego operatora
kiedy
i=0
if [ $i -ge 2 ]
then
#some code
fi
czemu?
Odpowiedzi:
Twój problem wynika z faktu, że $i
ma wartość pustą, gdy wyciąg nie powiedzie się. Zawsze cytuj swoje zmienne podczas wykonywania porównań, jeśli istnieje najmniejsza szansa, że jedna z nich może być pusta, np .:
if [ "$i" -ge 2 ] ; then
...
fi
Dzieje się tak z powodu sposobu, w jaki powłoka traktuje zmienne. Przyjmijmy oryginalny przykład,
if [ $i -ge 2 ] ; then ...
Pierwszą rzeczą, jaką wykonuje powłoka podczas wykonywania tej konkretnej linii kodu, jest podstawienie wartości $i
, tak jak zrobiłaby to funkcja wyszukiwania i zamiany w Twoim ulubionym edytorze . Więc załóżmy, że $i
to jest puste lub, jeszcze bardziej obrazowe, załóżmy, że $i
jest to kilka spacji! Powłoka zastąpi $i
w następujący sposób:
if [ -ge 2 ] ; then ...
Teraz, zmienne podstawienia są wykonywane, wpływy powłoki z porównania i .... nie dlatego, że nie widzę nic zrozumiałego dla lewej z -gt
. Jednak cytując $i
:
if [ "$i" -ge 2 ] ; then ...
staje się:
if [ " " -ge 2 ] ; then ...
Powłoka widzi teraz podwójne cudzysłowy i wie, że faktycznie porównujesz cztery spacje z 2 i pominie if
.
Masz również możliwość określenia domyślnej wartości, $i
jeśli $i
jest pusta, w następujący sposób:
if [ "${i:-0}" -ge 2 ] ; then ...
Będzie to zastąpić wartość 0 zamiast $i
jest $i
nieokreślona. Nadal utrzymuję cudzysłowy, ponieważ znowu, jeśli $i
jest to kilka pustych znaków, to nie liczy się jako niezdefiniowane , nie zostanie zastąpione przez 0 i ponownie napotkasz problem.
Przeczytaj to, kiedy będziesz mieć czas. Powłoka jest przez wielu traktowana jak czarna skrzynka, ale działa na bardzo niewielu i bardzo prostych zasadach - kiedy już wiesz, jakie są te reguły (jedną z nich jest sposób działania zmiennych w powłoce, jak wyjaśniono powyżej), powłoka będzie nie mam już dla ciebie tajemnic.
Muszę dodać moje 5 centów. Widzę, że wszyscy używają [
lub [[
, ale warto wspomnieć, że nie są one częścią składni if.
W przypadku porównań arytmetycznych użyj ((...))
zamiast tego.
((...)) jest poleceniem arytmetycznym, które zwraca kod zakończenia równy 0, jeśli wyrażenie jest różne od zera, lub 1, jeśli wyrażenie ma wartość zero. Używany również jako synonim „let”, jeśli potrzebne są efekty uboczne (przypisania).
Zobacz: ArithmeticExpression
Twój fragment scenariusza działa po prostu świetnie. Czy na pewno nie przypisujesz niczego innego przed if do „i”?
Częstym błędem jest również niepozostawianie spacji po i przed nawiasami kwadratowymi.