|| durumunda iki komutu çalıştırın veya &&


11

&& ve || hakkında okudum ve yanlış durumda iki komut çalıştırmak istiyorum.

Denedim ;ama her zaman çalışıyor . Kıvırcık parantez içine koymayı denedim { command1; command2 }ama bu bir sözdizimi hatasıyla sonuçlanır.

Gibi bir şey yapmak istiyorum

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

ancak İnternet bağlantısı olmadığında bu durumdan çıkılır.


1
Bu basit bir yazım hatası gibi görünüyor. Daha ilginç bir soru sormak için bir yolu arasındaki farklar olduğunu ()ve {}.
edwinksl

Yanıtlar:


27

Parens kullanmak, komutları her zaman istediğiniz gibi olmayan bir alt kabuğa koyar. Alternatif olarak, kıvırcık parantez kullanın:

command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }

Buradaki hile, parenslerin aksine, parantez içindeki son komutun takip edilmesi gerektiğidir ;.

Neden noktalı virgül veya satırsonu gerekli?

Kıvrık ayraç bir komut için geçerli bir argüman. Örneğin, burada argüman olarak kıvırcık bir ayraç var echo:

$ echo }
}

Sonuç olarak, kabuk görürse:

{ command1; command2 }

Kabuk, command1 komutunu bağımsız değişken içermiyor ve command2 karakterini içeren bir bağımsız değişkene sahip olarak yorumlar }. Kıvrık ayraç }, yalnızca noktalı virgül veya satırsonu izliyorsa gruplamayı kapatmak olarak yorumlanır. Yukarıdakilerin çalışması için:

{ command1; command2; }

Altkabuklarda arasındaki fark {...}ve(...)

Aşağıdakilerin x10 olarak ayarlandığını, ancak echokomut çalıştırılmadan önce bu ayarın unutulduğunu gözlemleyin :

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

Kıvırcık parantezlerde, aksine, ayarı x=10hatırlanır:

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10

Fark, bir alt kabuktaki değişken atamaların, alt kabuk tamamlandıktan sonra hayatta kalmamasıdır.

belgeleme

Gönderen man bash:

(liste)

listesi bir alt kabuk ortamında yürütülür (aşağıdaki KOMUT YÜRÜTME ORTAMI'na bakın). Kabuğun ortamını etkileyen değişken atamaları ve yerleşik komutlar, komut tamamlandıktan sonra geçerli olmaz. Dönüş durumu listenin çıkış durumudur.

{ liste; }

liste sadece geçerli kabuk ortamında yürütülür. liste bir satırsonu veya noktalı virgülle sonlandırılmalıdır. Bu, grup komutu olarak bilinir. Dönüş durumu listenin çıkış durumudur. Meta karakterlerden (ve) farklı olarak {ve} ayrılmış kelimeler olduğunu ve ayrılmış bir kelimenin tanınmasına izin verildiği durumlarda gerçekleşmesi gerektiğini unutmayın. Sözcük kesintisine neden olmadıkları için, boşluk veya başka bir kabuk metakarakteriyle listeden ayrılmalıdır.

[Vurgu eklendi]

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.