Bash'de şartlı olarak ne komut “hiçbir şey yapma” demektir?


180

Bazen koşullu yaparken, hiçbir şey yapmamak için koda ihtiyacım var, örneğin, burada, Bash'in $a"10" dan büyük olduğunda hiçbir şey yapmamasını istiyorum , $a"5" den küçükse "1" yazdırın, aksi takdirde "2" yazdırın:

if [ "$a" -ge 10 ]
then
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

Bu bir hata yapar. Hiçbir şey yapmayacak ve betiğimi yavaşlatmayacak bir komut var mı?

Yanıtlar:


340

Kabuktaki no-op komutu :(iki nokta üst üste).

if [ "$a" -ge 10 ]
then
    :
elif [ "$a" -le 5 ]
then
    echo "1"
else
    echo "2"
fi

Gönderen bash kılavuzu :

:(iki nokta üst üste)
Argümanları genişletmenin ve yönlendirme yapmanın ötesinde hiçbir şey yapmayın. Dönüş durumu sıfırdır.


3
@SaintHax Hayır, çalışmıyor true. Kabuğun içine yerleştirilmiştir ve hiçbir şey yapmaz.
Barmar

1
kabuk yerleşiktir (haklısınız), aynen true gibi true (durum 0) döndürür ve okumak daha zordur. Bash bir DevOps dilidir ve ekibimdeki :biri tarafından yazılırsa, onları değiştirmelerini isterdim.
SaintHax

3
@SaintHax Birisi truekoşullu olmayan bir bağlamda kullansaydı , değiştirmesini isterdim. if trueiyi, then trueyanlış görünüyor.
Barmar

1
Tabii ki, if ! condition; then do something; fiyerine kullanmak için kodu yeniden yazabilirsiniz if condition; then :; else do something; fi.
Barmar

Size katılıyorum. Bu örnek, / elif / else bileşik koşulları kullanılarak yazılabilir ve daha iyi olur.
SaintHax

38

Muhtemelen şu truekomutu kullanabilirsiniz :

if [ "$a" -ge 10 ]; then
    true
elif [ "$a" -le 5 ]; then
    echo "1"
else
    echo "2"
fi

Alternatif, örnek durumunuzda (ancak her yerde olması gerekmez) if / else öğenizi yeniden sipariş etmektir:

if [ "$a" -le 5 ]; then
    echo "1"
elif [ "$a" -lt 10 ]; then
    echo "2"
fi

8
Eğer sonucu test hem yoksa trueve falseetkili bir şekilde uzak komut söz konusu olduğunda hiçbir-op, ama prensipte onlar olabilir belkide bu sözdizimini kabul eden bazı kabuklarda çatal :iyidir.
dmckee --- eski moderatör yavru kedi

3
Soru bash olarak etiketlendi. Bash trueve falseyerleşik vardır. Eski kabukları için true, falseve hatta :dış komutları olabilir (muhtemelen sadece ikincisi görürdük olsa çok eski kabukları).
Keith Thompson

6
Ben :sadece niyetin ne olduğunu daha açık olduğu için tercih ediyorum
Freedom_Ben

9

No-op komutuna dair orijinal soruyu cevaplamasam da, " bu dalda hiçbir şey yapmam gerekiyor " diye düşünebileceğim birçok (çoğu değilse) sorun , bu dalın kazanması için mantığı yeniden yapılandırarak atlanabilir. oluşmaz.

OP örneğini kullanarak genel bir kural vermeye çalışıyorum

$ a "10" dan büyük olduğunda hiçbir şey yapmayın, $ a "5" değerinden düşükse "1" yazdırın, aksi takdirde "2" yazdırın

Genel bir koşul, aşağıdaki koşulu takip edebilmek için $a10'dan fazla alan bir daldan kaçınmalıyız $a < 10.

Genel olarak, X olduğunda hiçbir şey yapmadığınızı söylediğinizde , X'in olduğu bir daldan kaçınmak için bunu tekrarlayın . Genellikle X'ten vazgeçerek ve diğer tüm koşullara uygulayarak kaçınmayı gerçekleştirebilirsiniz.

Dolayısıyla, uygulanan kurala sahip OP'ler örneği şu şekilde yeniden yapılandırılabilir:

if [ "$a" -lt 10 ] && [ "$a" -le 5 ]
then
    echo "1"
elif [ "$a" -lt 10 ]
then
    echo "2"
fi

Her şeyi $a < 10koşulda kapsayan, yukarıdakilerin sadece bir varyasyonu :

if [ "$a" -lt 10 ]
then
    if [ "$a" -le 5 ]
    then
        echo "1"
    else
        echo "2"
    fi
fi

(Bu özel örnek için @Flimzys'in yeniden yapılandırılması kesinlikle daha iyidir, ancak hiçbir şey yapmamak için arama yapan tüm insanlar için genel bir kural vermek istedim.)


5
Birinin bir op-op istememesinin bir nedeni, ilk olarak kodu, yanlışlıkla yan etkilere neden olmadan "buraya bir şeyler ekleyin" fikriyle yapılandırmasıdır. Örneğin, bir .bashrc'ye if-then-else-fi koyuyorsa, koyarsanız echo "put stuff here", oturum açma dışı kullanımlardan bazılarını (örn. Scp bozulur) kırar ve yalnızca boşluk / yorumlar bir çalışma zamanı hatasına neden olur.
Aphoid
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.