Saya pernah membaca bahwa titik koma digunakan untuk memisahkan program:
$ echo 3; ls -la
Apakah ini berarti if
, then
dan else
apakah ada program terpisah di sini?
$ if [ $VARIABLE == abcdef ] ; then echo yes ; else echo no ; fi
Pertanyaan ini bukan tentang titik koma.
bash
shell-script
shell
Maxim Koretskyi
sumber
sumber
[ $variable == abcdef ] && echo yes || echo no
Jawaban:
The
;
memisahkan pernyataan (longgar berbicara). Itu (hampir) selalu mungkin untuk mengganti;
dengan baris baru.Untuk mengatakan bahwa
;
memisahkan dua program, oleh karena ituif
danthen
harus "program" agak terlalu sederhana karena pernyataan dapat dibuat dari kata-kata yang dicadangkan, fungsi shell, utilitas bawaan dan utilitas eksternal, dan kombinasi dari ini menggunakan pipa dan operator boolean dll dll.Keduanya
if
danthen
dilindungi kata-kata dalam tata bahasa shell , bukan "program". Di sini mereka digunakan untuk membangun apa yang secara teknis disebut perintah gabungan .echo
kemungkinan merupakan utilitas bawaan di shell (tetapi tidak harus), danls
mungkin merupakan utilitas eksternal (atau "program" seperti yang Anda katakan).sumber
Sementara itu adalah perkiraan pertama yang adil ketika seseorang mulai mempelajari dasar-dasar penggunaan shell, pada level "di sini adalah bagaimana seseorang menjalankan program" dan "di sini adalah bagaimana seseorang menjalankan banyak program satu demi satu pada satu baris" , itu sebenarnya tidak benar.
Semakin sulit dipahami oleh pemula tetapi penjelasan yang lebih tepat adalah bahwa bahasa shell adalah bahasa komputer . Ini memiliki sintaks . Sintaks itu terdiri dari berbagai elemen leksikal termasuk (antara lain) baris baru, operator, kata-kata, dan kata-kata yang dicadangkan.
if
,then
,else
, Danfi
semua kata-kata reserved . Mereka memiliki makna khusus ketika mengurai input yang diberikan seseorang ke shell, sesuai dengan tata bahasanya . Begitu pula;
dengan operator pemisah .Input dalam bahasa shell dengan demikian, diambil secara keseluruhan, program komputer yang ditafsirkan oleh program lain, seorang juru bahasa , shell. Bagian gramatikal individualnya bukan program. Bahasa shell adalah cara untuk menentukan program (lainnya) untuk dijalankan oleh shell.
[
bukan elemen leksikal khusus dalam tata bahasa shell seperti operator. Ini adalah kata yang biasa , yang menamai satu nama program tersebut[
. Banyak shell memiliki versi built-in dari program ini, digabungkan ke dalam kode program shell itu sendiri, tetapi Anda juga dapat menemukan program eksternal dengan nama ini di suatu tempat seperti/bin/[
atau/usr/bin/[
, yang mana program selain shell dapat meminta. Sama,]
bukan elemen leksikal shell khusus baik. Itu kata biasa, yang menjadi argumen untuk[
program ini. The[
Program mensyaratkan bahwa argumen akhir, ketika dijalankan, menjadi]
, yang hasil untuk kemudian mengabaikan.Program serupa lainnya yang disebutkan dalam pertanyaan Anda adalah
echo
. Sekali lagi, sebagian besar shell memiliki versi bawaan dari program ini. Tetapi sekali lagi ada juga versi eksternal dari program, di suatu tempat seperti/bin/echo
atau/usr/bin/echo
, untuk program selain memohon kerang.Program ketiga yang disebutkan dalam pertanyaan Anda adalah
ls
. Shell umumnya tidak memiliki versi built-in dari program ini, dan ini adalah program eksternal, dapat ditemukan di suatu tempat seperti/bin/ls
atau/usr/bin/ls
.Untuk shell Bourne Again, Anda dapat membaca lebih lanjut tentang ini di Fitur Shell Dasar dari GNU Bourne Again dokumentasi info shell. Kerang lain memiliki tata bahasa yang berbeda, secara alami. The Spesifikasi Single Unix menggambarkan sintaks bahwa semua kerang POSIX-konforman (dalam mode POSIX-konforman mereka) seharusnya mematuhi untuk.
Bacaan lebih lanjut
test
. Utilitas . Spesifikasi Spesifikasi Dasar 7. Grup Terbuka. IEEE 1003.1-2008. ISBN 1937218812.sumber
Ini sebenarnya tidak dibuat-buat untuk dipikirkan
if
,then
danelse
sebagai program eksternal. Bahkan, shell Thompson di Unix edisi 1 asli diimplementasikanif
dangoto
sebagai program eksternal. Hal ini dimungkinkan karena subproses membagikan deskriptor file dengan proses shell, jadi goto (forward) hanya harus membaca input sampai menemukan label target dan kemudian keluar. Lihat cangkang Thompson .sumber
if
danifelse
, yang merupakan bagian dariexecline
. Ini bukanif
pertanyaannya.Itu
then
danelse
bukan program. Bagian lainnya adalah. Perhatikan tidak ada;
'langsung setelah mereka, tetapi setelah perintah mereka mendahului.Ini
[ ... ]
adalah perintah, dan perlu;
jika diikuti dengan awal dari perintah lain.AFAIK, semua struktur kontrol di Bash, dan mungkin kebanyakan shell * nix, adalah sama. Mereka adalah instruksi untuk penerjemah. Tes atau kondisi, di sisi lain, menggunakan program / proses yang "dieksekusi" dan merupakan perintah. Karena
then
merupakan bagian dari baris yang mengarah keecho
perintah itu harus dipisahkan oleh baris baru dari perintah sebelumnya[ ... ]
. Tidak perlu dipisahkan dari perintah yang dikontrolnya, theecho yes
.Secara hukum, meski jelek dan sulit dibaca, Anda juga bisa melakukan ini.
Perhatikan bahwa tidak perlu untuk
;
antara kontrol sama sekali di sini, meskipun mereka tidak di jalur mereka sendiri.Cukup menarik, seluruh struktur kontrol (
if ... fi
) adalah perintah shell, dan keseluruhannya harus diakhiri dengan baris baru atau a;
. Baris terakhir tidak bisafi echo done
tetapi harusfi; echo done
. Sama seperti tugasVARIABLE='abcdef'
adalah perintah.Meskipun seluruh struktur kontrol adalah perintah, mereka masih bukan program.
sumber
if
,elif
,then
, Danfi
semua kata kunci dicadangkan digunakan untuk mengimplementasikan salah satu konstruksi disebut sebagai perintah senyawa di shell, yang berarti tidak mungkin ada perintah (atau lebih tepatnya, perintah lain) oleh salah satu dari mereka nama-nama di shell. Tujuan dari;
umumnya bukan untuk memisahkan perintah, tetapi untuk mengakhiri daftar perintah . Misalnya, berikut ini adalahif
pernyataan yang valid :Kondisi
if
pernyataan adalah daftar perintahecho foo; echo bar; echo baz
. Parser tahu bahwa kondisinya sudah berakhir karenathen
, yang segera mengikuti tanda titik koma, tidak dapat menjadi perintah karena itu adalah kata kunci yang dipesan. Dengan demikian, ia tahu bahwa yang mengikutithen
adalah awal dari tubuh. Demikian juga,fi
adalah kata kunci yang dipesan dan dengan demikian tidak bisa menjadi perintah ketiga di tubuhif
pernyataan, tetapi menandai akhir dari perintah majemuk.sumber
if program1 foo; program2 bar; program3 baz;
, status program mana yang seharusnya0
, sehingga shell dilanjutkanthen
? Yang terakhir?program3 baz
. Status keluar dari daftar perintah adalah status keluar dari perintah terakhir dalam daftar itu. Dua lainnya bisa gagal tanpa mempengaruhi kondisinya.