Titik koma berlebihan di akhir baris dalam skrip shell?

103

Saya memiliki skrip shell yang berisi berikut ini:

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;

Adalah titik koma benar-benar berlebihan dalam cuplikan di atas? Dan adakah alasan bagi sebagian orang untuk menggunakan titik koma ganda?

Tampaknya titik koma hanyalah pemisah, sesuatu yang akan Anda gunakan sebagai ganti baris baru.

Nagel
sumber

Jawaban:

150

Titik koma tunggal di akhir baris tidak berguna, karena baris baru juga merupakan pemisah perintah. casesecara khusus membutuhkan titik koma ganda di akhir perintah terakhir di setiap blok pola; lihat help caseuntuk detailnya.

Ignacio Vazquez-Abrams
sumber
20
Bagus! Jadi, jika saya memahami Anda dengan benar, saya dapat dengan aman menghapus satu titik koma di akhir baris mana pun, tetapi tidak pernah dua kali lipat?
Nagel
29

Menurut 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>

Jadi, ;bisa metacharacter atau operator kontrol, sedangkan yang ;;selalu menjadi operator kontrol (dalam perintah kasus).

Dalam kode khusus Anda, semua ;di akhir baris tidak diperlukan. The ;;diperlukan namun.

Michał Šrajer
sumber
4
Apa perbedaan praktis antara ;dan ;;, lalu? Saya tidak cukup paham dengan penguraian sintaks BASH untuk mengetahui perbedaan praktis antara apa yang disebut BASH sebagai "metacharacter" dan apa yang disebut "operator kontrol".
jvriesem
1
setuju dengan pertanyaan & komentar jvriesem, potongan dokumen tampaknya agak terlalu sempit
grgry
6

Dalam kasus khusus dari find, ;digunakan untuk menghentikan perintah yang dipanggil oleh -exec. Lihat jawaban @kenorb untuk pertanyaan ini .

DanielGKiel
sumber
0

@ Opensourcebook-Amit

baris baru setara dengan titik koma tunggal ;pada terminal atau dalam skrip shell.

Lihat contoh di bawah ini:

Di terminal:

[root@server test]# ls;pwd;

Pada skrip shell:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

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

[root@server test]#

Tapi saya tidak setuju dengan komentar yang &setara dengan baris baru atau titik koma tunggal

& adalah menjalankan perintah di latar belakang juga merupakan pemisah perintah tetapi tidak berfungsi sebagai titik koma atau baris baru.

Amit Ganvir
sumber
-2

@Ignacio V-Abrams

Sebenarnya ini tidak sepenuhnya akurat, titik koma tunggal di akhir baris tidak berlebihan dan jelas tidak sama dengan baris baru.

Dari Bash Reference Manual

Perintah dipisahkan dengan ';' dijalankan secara berurutan; shell menunggu setiap perintah untuk diakhiri secara bergantian. Status kembali adalah status keluar dari perintah terakhir yang dijalankan.

Perintah yang dipisahkan oleh "baris baru" mungkin dijalankan secara paralel ketika perintah yang dipisahkan oleh titik koma selalu dijalankan secara berurutan

AKU J
sumber
5
Ini salah. Tidak ada perbedaan. Jika Anda membaca bagian yang sama dari manual dengan benar, Anda akan melihat ini, hanya beberapa baris di atas: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.Jadi apa yang Anda kutip tentang titik koma berlaku sama untuk baris baru.
underscore_d
1
Saya setuju bahwa kalimat ini ambigu, saya pikir yang dimaksud penulis adalah ";" dan "\ n" keduanya dapat digunakan lebih dari sekali untuk memisahkan perintah tetapi bukan berarti keduanya melakukan hal yang sama. Saya menemukan tautan ini: unix.stackexchange.com/questions/53390/… Saya juga tidak mengetahui ini sebelum saya benar-benar memiliki masalah dengan beberapa skrip yang saya tulis dan dicatat tentang perbedaan antara ";" dan "\ n" oleh salah satu kolega saya. Sayangnya, ini sudah lama sekali dan saya tidak dapat mengingat untuk memposting contoh di sini.
IJ
2
jika Anda membaca posting yang Anda tautkan ke @IJ, Anda akan melihat bahwa paralelisme berasal dari &bukan \n. Dalam sebuah komentar disebutkan dia dapat melewati titik koma karena ternyata, &juga merupakan pemisah perintah seperti ;dan \n.
Matthias