Kabuk komut dosyalarında bir satırın sonunda noktalı virgül gereksiz mi?


103

Aşağıdakileri içeren bir kabuk betiğim var:

case $1 in
    0 )
    echo $1 = 0;
    OUTPUT=3;;
    1 )
    echo $1 = 1;
    OUTPUT=4;;
    2 )
    echo $1 = 2;
    OUTPUT=4;;
esac

HID=$2;
BUNCH=16;
LR=.008;

Are noktalı virgül yukarıdaki kod parçasında tamamen gereksiz? Ve bazı insanların çift noktalı virgül kullanmasının herhangi bir nedeni var mı?

Görünüşe göre noktalı virgül yalnızca bir ayırıcı, yeni bir satır yerine kullanacağınız bir şey.

Yanıtlar:


150

Satırsonu aynı zamanda bir komut ayırıcısı olduğu için, bir satırın sonundaki tek noktalı virgül gereksizdir. caseözellikle her desen bloğundaki son komutun sonunda çift noktalı virgüllere ihtiyaç duyar; bkz help caseAyrıntılar için.


20
Harika! Yani, eğer sizi doğru anlarsam, herhangi bir satırın sonundaki herhangi bir noktalı virgülü güvenli bir şekilde kaldırabilirim, ancak asla çift olanları kaldırabilir miyim?
Nagel

29

Göre man bash:

  metacharacter
         A character that, when unquoted, separates words.  One of the following:
         |  & ; ( ) < > space tab
  control operator
         A token that performs a control function.  It is one of the following symbols:
         || & && ; ;; ( ) | |& <newline>

Dolayısıyla, ;meta karakter veya kontrol operatörü olabilirken, ;;her zaman bir kontrol operatörüdür (komut durumunda).

Özel kodunuzda, ;satırın sonundaki her şeye gerek yoktur. ;;Ancak ihtiyaç vardır.


4
Öyleyse ;ve arasındaki pratik fark nedir ;;? BASH'ın "meta karakter" dediği şeyle "kontrol operatörü" dediği şey arasındaki pratik farkı bilecek kadar BASH sözdizimi ayrıştırmasına yeterince aşina değilim.
jvriesem

1
jvriesem'in sorularına ve yorumlarına katılıyorum, dokümanlar pasajı biraz fazla dar görünüyor
grgry

6

Özel bulma durumunda, ;-exec tarafından çağrılan komutları sonlandırmak için kullanılır. Bu soruya @kenorb'un cevabına bakın .


0

@ Opensourcebook-Amit

yeni satırlar ;terminalde veya kabuk komut dosyasında tek noktalı virgülle eşdeğerdir .

Aşağıdaki örneklere bakın:

Terminalde:

[root@server test]# ls;pwd;

Kabuk betiğinde:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

echo -e "\nCurrent Date:";date;

[root@server test]#

Ancak &satırsonu veya tek noktalı virgülle eşdeğer olan yoruma katılmıyorum

& komutları arka planda çalıştırır, aynı zamanda bir komut ayırıcısıdır, ancak noktalı virgül veya yeni satır olarak çalışmaz.


-2

@Ignacio Vazquez-Abrams

Aslında bu tam olarak doğru değildir, bir satırın sonundaki tek noktalı virgül gereksiz değildir ve kesinlikle yeni satırlarla aynı şey değildir.

Gönderen Bash Referans Kılavuzuna

';' İle ayrılmış komutlar sırayla yürütülür; kabuk, her komutun sırayla sona ermesini bekler. Dönüş durumu, yürütülen son komutun çıkış durumudur.

"Yeni satır" ile ayrılan komutlar, noktalı virgülle ayrılmış komutlar her zaman sırayla çalıştırıldığında paralel olarak yürütülebilir.


5
Bu yanlış. Fark yok. Kılavuzun aynı bölümünü doğru okursanız, bunu sadece birkaç satır yukarıda görürsünüz: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.Yani noktalı virgül hakkında alıntı yaptığınız şey yeni satırlar için de aynı şekilde geçerlidir.
underscore_d

1
Bu cümlenin belirsiz olduğuna katılıyorum, yazarın kastettiği şu ";" ve "\ n" komutları ayırmak için birden fazla kez kullanılabilir, ancak aynı şeyi yaptıkları için kullanılamaz. Şu bağlantıyı buldum: unix.stackexchange.com/questions/53390/… Yazdığım ve ";" arasındaki fark hakkında not aldığım bir komut dosyasıyla gerçekten bir sorun yaşamadan önce bunu da bilmiyordum. ve bir meslektaşım tarafından "\ n". Ne yazık ki, bu çok uzun zaman önceydi ve buraya bir örnek göndermenin ne olduğunu hatırlayamıyorum.
IJ

2
Eğer @IJ bağlantılı yazı okurdum eğer paralellik geldiğini görürdünüz &değil \n. Bir yorumda noktalı virgülü atlayabildiği belirtiliyor çünkü görünüşe göre, &aynı ;ve gibi bir komut ayırıcısı da \n.
Matthias
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.