Burada Bash yerleşkesi true
ve daha spesifik olarak Bash'in parantez içindeki ifadeleri nasıl genişlettiği ve yorumladığı hakkında bazı yanlış anlaşılmalar var gibi görünüyor .
Miku'nun cevabındaki kodun , Bash yerleşkesi true
ile ne /bin/true
de true
komutanın başka bir lezzeti ile hiçbir ilgisi yoktur . Bu durumda, true
basit bir karakter dizesinden başka bir şey değildir ve true
ne değişken ataması ne de koşullu ifadenin değerlendirilmesi ile hiçbir zaman komuta / yerleşik'e çağrı yapılmaz .
Aşağıdaki kod, miku'nun cevabındaki kodla işlevsel olarak aynıdır:
the_world_is_flat=yeah
if [ "$the_world_is_flat" = yeah ]; then
echo 'Be careful not to fall off!'
fi
Buradaki tek fark, karşılaştırılan dört karakterin 't', 'r', 'u' ve 'e' yerine 'y', 'e', 'a' ve 'h' olmasıdır. Bu kadar. yeah
Bash tokenini ayrıştırdığında herhangi bir özel işlem veya miku örneği olarak adlandırılan bir komut çağırma girişimi yoktur true
. Bu sadece bir ip ve tamamen keyfi bir ip.
Güncelleme (2014-02-19): Miku'nun cevabındaki bağlantıyı takip ettikten sonra, şimdi bazı karışıklıkların nereden geldiğini görüyorum. Miku'nun yanıtı tek parantez kullanır, ancak bağlandığı kod snippet'i parantez kullanmaz. Bu sadece:
the_world_is_flat=true
if $the_world_is_flat; then
echo 'Be careful not to fall off!'
fi
Her iki kod parçacığı da aynı şekilde davranacaktır , ancak parantezler kaputun altında neler olup bittiğini tamamen değiştirecektir.
Bash'in her durumda yaptığı şey:
Parantez yok:
- Değişkeni
$the_world_is_flat
dizeye genişletin "true"
.
- Dizeyi
"true"
komut olarak ayrıştırma girişimi .
true
Komutu bulun ve çalıştırın (yerleşik veya /bin/true
Bash sürümüne bağlı olarak).
true
Komutun çıkış kodunu (her zaman 0 olan) 0 ile karşılaştırın. Çoğu kabukta, 0'lık bir çıkış kodunun başarıyı ve diğer her şeyin başarısızlığı gösterdiğini hatırlayın.
- Çıkış kodu 0 (başarılı) olduğundan,
if
ifadenin then
yan tümcesini yürütün
Parantez:
- Değişkeni
$the_world_is_flat
dizeye genişletin "true"
.
- Şu anda tamamen genişleyen koşullu ifadeyi, biçimdedir
string1 = string2
. =
Operatör Bash'in olan dizge karşılaştırma operatörü. Yani...
- Üzerinde bir dize karşılaştırma yapın
"true"
ve "true"
.
- Evet, iki dize aynıydı, bu yüzden koşulun değeri doğrudur.
- Yürütme
if
ifadenin then
maddesini.
Köşeli parantez içermeyen kod çalışır, çünkü true
komut, başarıyı gösteren 0 çıkış kodunu döndürür. Köşeli ayraçlı kod çalışır, çünkü değeri, $the_world_is_flat
öğesinin true
sağ tarafındaki dize hazır bilgisi ile aynıdır =
.
Sadece noktayı eve götürmek için aşağıdaki iki kod snippet'ini düşünün:
Bu kod (kök ayrıcalıklarıyla çalıştırılırsa) bilgisayarınızı yeniden başlatır:
var=reboot
if $var; then
echo 'Muahahaha! You are going down!'
fi
Bu kod sadece "İyi deneme" yazdırır. Reboot komutu çağrılmaz.
var=reboot
if [ $var ]; then
echo 'Nice try.'
fi
Güncelleme (2014-04-14)=
ve ==
: AFAIK arasındaki farkla ilgili yorumlarda soruyu cevaplamak için hiçbir fark yoktur. ==
Operatör için Bash özgü eşanlamlı olduğunu =
ve çok gördüm gibi, hepsi bağlamlarda aynı çalışır.
Ancak, özellikle veya testlerde kullanılan =
ve ==
dize karşılaştırma işleçleri hakkında konuştuğumu unutmayın . Ben bunu önermiyorum ve bash her yerde değiştirilebilir .[ ]
[[ ]]
=
==
Örneğin, ( ==
örneğin var=="foo"
teknik olarak bunu yapabilirsiniz , ancak değeri var
olacaktır "=foo"
, çünkü Bash ==
burada bir operatör görmediği için bir =
(atama) operatörü görüyor , ardından gerçek değeri ="foo"
olur "=foo"
).
Ayrıca her ne kadar =
ve ==
birbirleriyle değiştirilebilir bu testler iş nasıl, sen akılda tutmalı yok içinizde kullanmaya bağlı olarak değişir [ ]
ya da [[ ]]
ve ayrıca üzerinde işlenenler cinsindendir olsun veya olmasın. Daha bu konuda okumak içinde olabilir 7.3 Diğer Karşılaştırma Operatörleri: İleri Bash komut dosyası Kılavuzu (tartışmasına aşağı kaydırın =
ve ==
).
true
vefalse
en snippet'lerinde bağlamında aşağıda sadece düz dizeleri vardır değilbash built-ins
!!! Lütfen aşağıdaki Mike Holt'un cevabını okuyun. (Bu, çok oylanan ve kabul edilen bir yanıtın