Aşağıdaki kod verir
[: -ge: tekli operatör bekleniyor
ne zaman
i=0
if [ $i -ge 2 ]
then
#some code
fi
neden?
Aşağıdaki kod verir
[: -ge: tekli operatör bekleniyor
ne zaman
i=0
if [ $i -ge 2 ]
then
#some code
fi
neden?
Yanıtlar:
Sorununuz, ifadeniz $i
başarısız olduğunda boş bir değere sahip olmasından kaynaklanmaktadır . Bunlardan birinin boş olma ihtimali en düşükse, karşılaştırma yaparken her zaman değişkenlerinizi belirtin, örneğin:
if [ "$i" -ge 2 ] ; then
...
fi
Bunun nedeni kabuğun değişkenlere nasıl davrandığıdır. Orijinal örneği varsayalım,
if [ $i -ge 2 ] ; then ...
Belirli bir kod satırını yürütürken kabuğun yaptığı ilk şey $i
, tıpkı favori editörünüzün arama ve değiştirme işlevinin yaptığı gibi , değerinin yerine geçer . Öyleyse bunun $i
boş olduğunu ya da daha açıklayıcı olduğunu düşünün, $i
bunun bir sürü boşluk olduğunu varsayın ! Kabuk $i
aşağıdaki gibi değiştirilecektir :
if [ -ge 2 ] ; then ...
O bir şey anlaşılır göremiyorum çünkü Şimdi değişken değiştirmelerin yapıldığı söylenir, kabuk karşılaştırma ile ilerler ve .... başarısız solun içinde -gt
. Ancak, alıntı $i
:
if [ "$i" -ge 2 ] ; then ...
dönüşür:
if [ " " -ge 2 ] ; then ...
Kabuk şimdi çift tırnakları görüyor ve aslında dört boşluğu 2 ile karşılaştırdığınızı biliyor ve atlayacak if
.
Ayrıca için varsayılan değer belirtme seçeneğine sahip $i
olursa $i
boştur, aşağıdaki gibi:
if [ "${i:-0}" -ge 2 ] ; then ...
Bu değer, 0 yerine ikame edecektir $i
olan $i
tanımlanmamış. Tırnakları hala koruyorum, çünkü yine, eğer $i
bir sürü boşluk varsa tanımsız olarak sayılmaz , 0 ile değiştirilmez ve bir kez daha problemle karşılaşırsınız.
Lütfen okuyun bu zaman varken. Kabuk, birçok kişi tarafından kara bir kutu gibi ele alınır, ancak çok az ve çok basit kurallarla çalışır - bu kuralların ne olduğunun farkında olduğunuzda (bunlardan biri, yukarıda açıklandığı gibi, kabukta değişkenlerin nasıl çalıştığıdır) senin için daha fazla sır yok.
5 sent eklemem gerekiyor. Herkesin kullandığını görüyorum [
ya da [[
, ancak sözdiziminin bir parçası olmadıklarını belirtmek gerekir.
Aritmetik karşılaştırmalar için ((...))
kullanın.
((...)), ifade sıfırdan farklıysa 0 veya ifade sıfırsa 1 çıkış durumunu döndüren aritmetik bir komuttur. Yan etkilere (atamalara) gerek duyulursa "let" kelimesinin eş anlamlısı olarak da kullanılır.
Bakınız: Aritmetik Ekspresyon
Senaryonuz harika çalışıyor. İf "i" karakterinden önce başka bir şey atamadığınızdan emin misiniz?
Yaygın bir hata da köşeli parantezlerden önce ve sonra bir boşluk bırakmak değildir.