Bash cinsinden tamsayıyı karşılaştır, tekli operatör bekleniyor


137

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:


295

Sorununuz, ifadeniz $ibaş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 $iboş olduğunu ya da daha açıklayıcı olduğunu düşünün, $ibunun bir sürü boşluk olduğunu varsayın ! Kabuk $iaş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 $iolursa $iboştur, aşağıdaki gibi:

if [ "${i:-0}" -ge 2 ] ; then ...

Bu değer, 0 yerine ikame edecektir $iolan $itanımlanmamış. Tırnakları hala koruyorum, çünkü yine, eğer $ibir 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.


7
değişken değişkeni tamsayı ifadesi
Néstor

@ Néstor yanlış , bir değişkenin alıntılanması , değişken sayısalsa beklenen tamsayı ifadesi gibi yeni bir hatayı yükseltmez ; alıntılanmış olsun olmasın sayısal olmayan bir değişken değeri sağlamak söz konusu hataya neden olacaktır .
vladr

6

Hata mesajından bakıldığında, i değerini 0 yürüttüğünüzde boş bir dizedir.


6

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


2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.