Null-operatörü “:” bashının iki noktası nedir?


13

BASH betiğindeki "null" operatörünün anlamı nedir? Söyleyecek bir ifşeyiniz olmadığında, bir komutun ardından yer tutucu olarak kullanıldığını , ancak programın düzgün çalışmasına izin vermek için bir komuta ihtiyaç duyduğunu anlıyorum . Ancak bunun genel kullanımı nedir? Ne zaman kullanırsın? Kullanmak ne zaman mantıklı?


ayrıca Bir
Kolonun

1
Alıntı yapma sebebiniz oldukça önemli. Neden daha fazlasına ihtiyacınız var?
terdon

Yanıtlar:


16

Parametre genişletmeleri yan etkilerinin oluşmasına izin vermek bazen yararlı olabilir.

Örneğin, varsayılan bir değer ayarlamak

read -p "Enter your name: " name
: ${name:=John Doe}  # if the user entered an empty string
echo "$name"

2
İkinci satırın nasıl çalıştığını sembol-sembol açıklayabilir misiniz?
Ruslan

Bash kılavuzundaki :komut ve parametre genişletme hakkında bilgi edinin .
glenn jackman

4
@Glennjackman'ın neye atıfta bulunduğunu özetlemek için, ikinci satır null komutunu çağırır: ve ${name:="John Doe"}genişletilir ve atamanın gerçekleşmesine neden olur: Olmadan: kabuk "John Doe" komutunu veya $nameönceden ayarlanmışsa değeri çalıştırmayı dener
imkendal

13

Sonsuz döngüler için de kullanabilirsiniz:

while : ; do 
   # ....
done

4
Ancak belki while truede daha okunabilirdir, çünkü (a) daha az noktalama işareti kullanır ve (b) C'den türetilmiş dillere daha benzerdir.
wchargin

9

Bir programı çalıştırmadan bir dosya oluşturmak için kullanabilirsiniz ::

: > /path/to/file

Bu, touch /path/to/file ( touchprogramın çalıştırılmasını gerektirmediğinden ) sonsuz derecede daha hızlıdır ve sadece düz olmaktan çok daha taşınabilir olabilir

> /path/to/file

bu da birçok sistemde çalışıyor gibi görünüyor. Benzer şekilde, bir dosyaya yazma erişiminizin olup olmadığını kontrol etmek için kullanılabilir :

if { : >> /path/to/file;} 2> /dev/null
then
    echo "writeable"
else
    echo "write permission denied"
fi

her ne kadar bu da, genellikle, olmadan yapılabilir :. Uyarılar:

  • Bu, dosyanın zaten var olup olmadığını kontrol etmez. Başlamazsa, dosya izni varsa dosya oluşturulur.
  • Dosya mevcut değilse ve komut dosyanızın oluşturma izni yoksa, bu "yazma izni reddedildi" bildirir.

(Bunun neden daha güvenilir olduğu için bağlantılı soruya bakın if [ -w /path/to/file ].)


5

Geri dönüş, Unix V6 ve Thompson Shell'de, ifadenin bir :parçası olarak kullanıldı goto. El kitabına göre , orijinal olarak Unix'in 3. sürümünde ortaya çıktı:

Komut dosyasının tamamı, ilk boş olmayan karakter olarak a: ile başlayan bir satır, ardından bir veya daha fazla boşluk ve ardından etiketle aranır. Böyle bir satır bulunursa, goto komut dosyası ofsetini etiketten sonraki satıra yeniden konumlandırır ve çıkar. Bu, kabuğun etiketli hatta aktarılmasına neden olur.

Günümüzde, bashbaşarılı olmayan bir operatörü olarak kullanılıyor. Gerçekten de, kaynak koduna bakarsanız, her ikisini de görür trueve altında :aynı işlevi kullanırsınız int colon_builtin(). :Yerleşik olmayan bir komut yoktur ve /bin/trueaslında yaptığı şey için oldukça büyük bir komuttur .

:her yerde truekullanılabilir, örneğin command_that_can_fail || true, uzman olmayanları karıştırması muhtemeldir. Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz .


3

ifYalnızca negatif tarafta bir şey yapmak istediğinizde bir komutun pozitif testinde kullanabilirsiniz . Örneğin:

if [[ True == False ]]; then
    :
else
    echo "true <> flase"
fi

:Bash olmadan bir sözdizimi hatası üretecekti.

Bu çok basitleştirilmiş bir örnektir. Genel olarak, bu kod segmentini henüz yazmadığınızda ve sadece hata üretmeyen bir şeye ihtiyacınız olduğunda, ön kodlamada böyle bir teknik kullanırsınız.


İyi cevap, ilk başta belirgin olmasa da, bunun test koşulu içindeki gerçek bir komutla en yararlı olduğu, örneğin if pgrep firefox >/dev/null ; then : ; else echo "Firefox not running"; fiyalnızca firefox çalışmadığında hata göstereceğini söyledi. Başka bir deyişle, yalnızca komutun bir hatası olduğunda bir şey yapmanız gerektiğinde. pgrep firefox || echo "Firefox not running"Daha okunabilir olmasına rağmen bu bir bakıma eşdeğerdir ve daha fazla komuta izin verir
Sergiy Kolodyazhnyy

0

Ben sadece komut dosyası hata önlemek için SSH komutları ile bir komut dosyasında kullanılır.

Bu durumda, bir kullanıcının bir dizi sunucuya bağlanıp bağlanamayacağını görmek istiyorum. Bağlantı TAMAM ise, uzak ana bilgisayar Tamam yankılanacaktır. Bağlantı başarısız olursa, SSH hatayla yanıt verecektir. Ancak, komut dosyası başarısız olursa SSH komutunun değeri değil 0 ile çıkmak istiyorum. Yani aslında ||null komutuyla ORing tarafından SSH hatası tuzak :. Buna benzer:

#!/bin/bash
for i in $(cat servers.txt); do
    echo -n "$i "; 
    ssh user@${i} 'echo OK' || :; 
done

Bu şekilde SSH'den çıktı alıyorum, ancak hata kodunu değil:

....
swl06 ok
swl07 ok
swl08 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
swl09 ok
swl10 Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
....
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.