0. Indeks
- Perkara yang berlaku pada kebanyakan orang
- Struktur skrip
- Cetak di skrin
- Baca INPUT pengguna
- Pengiraan dalam bash
- Terma
- Gelung
- fungsi
- Permulaan
1. Perkara yang berlaku pada kebanyakan orang
/ bin / bash atau / bin / sh
Salah satu perkara pertama yang dilakukan mesin semasa melaksanakan skrip kami adalah melihat cangkang mana yang harus dilakukan. Pada kebanyakan sistem linux semasa / Bin / sh adalah pautan ke / bin / bash, tetapi ini tidak selalu berlaku, misalnya dalam pengedaran yang menggunakan peti sibuk mereka membawa Sh dan biasanya mereka juga membawa Bash, tetapi jika anda menggunakan / Bin / sh, ia tidak akan berjalan dengan Bash. Itulah sebabnya saya mengesyorkan selalu menggunakan / bin / bash.
Unicode lwn ASCII
Pernahkah anda terfikir mengapa anda tidak dapat menggunakan "¿" atau "ñ" dalam skrip anda? Atau gunakan aksen? Ia boleh mengganggu skrip interaktif. Ini kerana pengekodan default Bash adalah ASCII, atau yang sama, set aksara bahasa Inggeris. Untuk mengubahnya, kita hanya perlu memberitahu skrip kita bahawa kita ingin menggunakan Unicode. Untuk itu anda harus menambahkan baris tepat selepas jurubahasa arahan:
# - * - PENGENALAN: UTF-8 - * -
Hati-hati, penting bahawa baris ini berada di awal skrip.
Jadikan skrip boleh dilaksanakan
Lucunya berapa orang yang menjalankan skrip dengan «$ bashscript.sh"bukannya"$ ./script.sh"Lagipun, inilah yang kami maksudkan sebagai shell.
Untuk menambahkan izin pelaksanaan, anda harus melaksanakan:
sudo + x script.sh
BIN = "folder di mana kita mempunyai skrip" PATH = "$ BIN $ PATH"
2. Struktur skrip
- Header
- Definisi pemboleh ubah global
- Bantuan
- fungsi
- Badan utama
Header adalah tempat kami menunjukkan shell mana yang ingin kami gunakan dan pengekodan. Kelebihan fungsi adalah menggunakan semula kod yang diulang dengan menulisnya sekali sahaja dan untuk lebih mudah memahami skrip, kerana kod yang melebihi 100 baris sangat berguna.
Untuk menggunakan fungsi, fungsi tersebut mesti ditentukan sebelum badan utama skrip kita. Dan jika kita ingin menggunakan pemboleh ubah di peringkat global dari semua skrip kita, baik dalam badan utama dan fungsi, kita mesti menentukannya di awal segalanya, tepat setelah tajuk.
Terakhir, adalah amalan yang baik untuk menulis fungsi pembantu ketika skrip kita berjalan dengan buruk atau dengan parameter yang buruk. Jelas sekali, dalam kes tersebut kita mahu segera keluar dari skrip, tanpa membaca fungsinya. Untuk itu kita boleh menggunakan:
bantuan fungsi () {echo "" "Teks bantuan berformat baik kami." "" Keluar jika [[-z $ 1 || $ 1 == "-h" || $ 1 == "--membantu"]]; kemudian menolong fi
Sekiranya kita menambahkan "exit" ke fungsi bantuan, kita akan keluar skrip setiap kali kita menjalankan pertolongan, misalnya setelah pesan kesalahan, dll. Kami menyimpan beberapa baris kod.
Keadaan menunjukkan bantuan paparan di layar dan keluar jika skrip dijalankan tanpa parameter atau jika -h / –help ditentukan. Sekiranya anda melihat bahawa itu adalah tingkah laku standard kebanyakan program linux.
3. Cetak di skrin
Terdapat 2 perintah utama untuk mencetak ke layar dalam bash: «echo»Dan«Printf«. Mereka berdua sama cepat dan kedua-duanya adalah bahagian dari bash. Perbezaan utama untuk pemula adalah bahawa gema menambah garis baru pada akhir, sedangkan «Printf"Tidak.
Echo sangat baik dan itulah yang digunakan oleh kebanyakan orang, namun ketika membaca INPUT pengguna, atau ketika anda ingin mencetak pemboleh ubah yang diambil dari fail dengan pemprosesan kata, perkara aneh dapat terjadi. Mereka biasanya dapat diselesaikan dengan mudah, semudah menukar tanda petik menjadi tunggal atau sebaliknya, atau mengeluarkan rujukan pemboleh ubah dari tanda petik. «Echo»Adakah perkara-perkara aneh juga bergantung pada bagaimana penyusunannya, jika kita selalu menggunakan Ubuntu atau selalu Fedora, itu tidak akan mempengaruhi kita, tetapi jika kita mengubah pengedarannya.
Itulah sebabnya saya menggunakan «Printf«, Yang tidak membuat saya sakit kepala dan juga berkelakuan seperti«Printf»Dari C atau«cetak»Dari Python, ini sangat penting jika anda ingin memindahkan skrip anda ke bahasa pengaturcaraan yang lain.
4. Baca INPUT pengguna
Semua yang kita tulis mengikut nama skrip kita dan sebelum menekan tombol ENTER secara automatik disimpan dalam pemboleh ubah khas. Pemboleh ubah ini adalah jenis $ X di mana X adalah nombor.
«$0»Menunjukkan nama skrip kami dan dari«$1»Ke tak terhingga semua yang kita tulis kemudiannya berubah-ubah. Sebagai contoh:
kucing << EOF >> test.sh #! / bin / bash # - * - ENCODING: UTF-8 - * - printf "\ $ 0 = $ 0 \ n" printf "\ $ 1 = $ 1 \ n" printf "\ $ 2 = $ 2 \ n "EOF chmod + x script.sh ./script.sh file.txt saya
Kami membuat skrip ujian, membuatnya dapat dijalankan, dan menjalankannya dengan 2 parameter. Kami memperoleh output skrin:
$ 0 = ./script.sh $ 1 = $ 2 saya = file.txt
Dengan menggunakan petikan, kita dapat meneruskan "file.txt saya" ke "$ 1".
Kita juga dapat membaca INPUT pengguna dengan perintah "baca", secara langsung menunjukkan pemboleh ubah di mana kita ingin menyimpan parameter. Sebagai contoh:
printf "Siapa nama anda? \ n" baca NAMA printf "Helo, $ NAME. \ n"
5. Pengiraan dalam Bash
Untuk itu kita boleh menggunakan «exprSelagi kita tidak perlu melakukan pengiraan yang rumit. Dua perkara harus diperhatikan, yang pertama ialah «expr»Hanya mengakui nombor bulat, yang kedua ialah bahagian mengembalikan keseluruhan keputusan, untuk melihat selebihnya kita dapat menggunakan%".
Biasanya kita mahu memberikan hasil expr kepada pemboleh ubah. Kita boleh melakukannya dengan dua cara:
VAR2 = `expr $ VAR1 / 10` VAR2 = $ (expr $ VAR1 / 100)
Anda juga boleh melangkau «expr»Menggunakan tanda kurung berganda:
VAR2 = $ (($ VAR1 / 100))
6. Syarat-syarat
Telah ditulis dengan cara yang sangat luas mengenai «if«,«lagi«,«elif»Dan syarat. Anda boleh membacanya dalam:
- Pengaturcaraan dalam Bash: bahagian 1
- Bash: jika, maka, syarat lain
- Periksa sama ada fail atau folder ada atau tidak dan lebih dengan loop if
- Pengaturcaraan dalam Bash: bahagian 2
Saya hanya ingin menonjolkan perbezaan antara penggunaan tanda kurung persegi sederhana, «[]«, Dan kurungan berganda,«[[]]«, Untuk syarat. Dengan kurungan berganda kita boleh menggunakan syarat tambahan:
- «&&»Untuk dan
- «||»Untuk atau
Untuk menggunakan "&&»Dan«||»Dengan tanda kurung persegi sederhana, setiap bahagian harus dipisahkan dalam kurungan persegi yang terpisah. Contoh yang digunakan untuk bahagian skrip yang ingin melihat apakah pertolongan perlu dilaksanakan adalah:
jika [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "--help"]]; kemudian menolong fi
Ini juga menyelamatkan kita dari menulis nama pemboleh ubah dalam tanda kutip untuk mengelakkan kesilapan. Sebagai contoh:
jika [$ 1 = 1]; kemudian printf "Parameternya sama dengan 1."; fi jika ["$ 1" = 1]; kemudian printf "Parameternya sama dengan 1."; fi jika [[$ 1 = 1]]; kemudian printf "Parameternya sama dengan 1."; fi
Sekiranya script.sh dijalankan tanpa parameter, kes pertama akan memberikan ralat:
bash: [: =: pengendali unary dijangka
Yang belum dibincangkan adalah «kes«, Digunakan untuk mempermudah«if«. Mari kita mulakan pada awal, apabila kita tidak mempunyai «if»Semua kod akan dilaksanakan. Sekiranya kita menambah syarat «if»Kami akan mempunyai dua kes, satu di mana blok kod di dalam«if»Dan kes lain di mana blok ini tidak dijalankan.
Sekiranya kita menambah «lagi"Kami juga akan mempunyai dua kes, tetapi kedua kes ini berbeza dengan yang sebelumnya. Kerana sekarang akan ada dua blok kod bersyarat, A dan B, dan blok C, yang merupakan sisa program. A atau B akan dilaksanakan, dan C. Dalam kes sebelumnya itu A dan C atau hanya C.
Untuk mengelakkan keadaan menulis «jika tidak"dalam"lagi»Dan mempermudah pembacaan kod, ia dibuat«elif«. Apabila kita mempunyai banyak syarat yang bergantung pada yang sebelumnya, misalnya julat nombor atau jenisnya:
VAR1 = $ 1 jika [[$ VAR1 = 1]]; kemudian printf "1 \ n" elif [[$ VAR1 = 2]]; kemudian printf "2 \ n" elif [[$ VAR1 = 3]]; kemudian printf "3 \ n" lain printf "none \ n" fi
Dalam kes yang terakhir «elif»Banyak syarat akan dibaca. Sekiranya proses ini diperkemas:
VAR1 = $ 1 kes $ VAR dalam 1) printf "1 \ n" ;; 2) printf "2 \ n" ;; 3 | 4) printf "3 atau 4, itu bergantung \ n" ;; *) printf "tidak ada \ n" ;; bahawa C
Pemboleh ubah akan dibaca, dalam hal ini VAR1, dan ia akan diperiksa apakah ia setara dengan mana-mana kes, jika tidak, kes lalai "*" akan dijalankan. Titik koma berganda bersamaan dengan «memecahkan«, Mereka memberitahu«kes»Itu mesti berakhir.
7. Gelung
Sangat sedikit gelung yang dikenali dalam mana-mana bahasa pengaturcaraan. Dalam Bash mereka «manakala«,«sehingga»Dan«Untuk«. Telah ditulis dalam blog mengenai perkara-perkara berikut:
Terdapat dua jenis gelung «Untuk«, Mereka yang jenisnya«$ untuk VAR di LOQUESEA»Dan apakah jenis C«$ untuk ((I = 0; I <= 10; I ++))«. Gelung jenis kedua «Untuk»Sangat berguna, ia mempunyai 3 bahagian pada awal gelung:
- Perisytiharan dan permulaan pemboleh ubah (Dalam kes ini pemboleh ubah tambahan "I = 0").
- Keadaan pelaksanaan (sehingga saya kurang dari atau sama dengan 10).
- Peningkatan pemboleh ubah tambahan
Pada pendapat saya, ia adalah gelung yang paling kuat. Contoh, yang mencetak semua nombor dari 0 hingga 10, termasuk:
#! / bin / bash untuk ((I = 0; I <= 10; I ++)); adakah printf "$ I \ n" selesai
8. Fungsi
Ada beberapa perkara yang tidak diizinkan oleh Bash untuk kita lakukan, bukan? Pada pandangan pertama, fungsi bash mencegah anda melakukan 3 perkara: menyatakan pemboleh ubah tempatan dalam fungsi, meneruskan parameter ke fungsi, dan mengembalikan parameter. Semuanya ada jalan penyelesaian.
Jangan buat seperti:
#! / bin / bash VAR = 1 printc "$ VAR \ n" function hello () {VAR = 2 printf "$ VAR \ n"} halo printf "$ VAR \ n"
Ini dicetak ke skrin 1, 2 dan 2.
Untuk menyatakan pemboleh ubah tempatan, tambahkan «tempatan»Semasa menyatakan:
#! / bin / bash VAR = 1 printf "$ VAR1 \ n" function foo () {local VAR1 = 2 printf "$ VAR1 \ n"} printf "$ VAR1 \ n" foo printf "$ VAR1 \ n"
Ini mencetak 1, 1, 2, 1 di skrin.
Bagaimana anda menyampaikan parameter ke fungsi?
#! / bin / bash # - * - ENCODING: UTF-8 - * - function hello () {printf "Hello $ 1 \ n"}
printf "Siapa nama anda? \ n"
baca VAR1
hello $ VAR1
Bagaimana parameter dikembalikan?
#! / bin / bash # - * - ENCODING: UTF-8 - * - function hello () {printf "Hello holita"} printf "Siapa nama anda? \ n" baca VAR1 VAR1 = $ (hello) # DI SINI ADALAH printf "$ VAR1 $ VAR2 \ n"
Seperti yang anda lihat, ini mempunyai dua kelemahan, anda hanya dapat mengembalikan satu parameter, yang boleh menjadi vektor 😀, dan jika anda ingin mengembalikan parameter, anda tidak lagi dapat mencetak di layar dari fungsi tersebut.
9. Dapatkan
Salah satu perkara terakhir yang perlu anda ketahui mengenai Bash untuk membuat skrip yang kompleks adalah «barang kemas«. Ini digunakan untuk menyampaikan pilihan ke skrip tanpa mengira urutannya. Satu-satunya kelemahan adalah bahawa ia hanya mempengaruhi pilihan pendek:
#! / bin / bash # - * - ENCODING: UTF-8 - * - VARC = 0 help function () {printf "Mesej bantuan \ n" keluar} jika [[-z $ 1]]; kemudian bantu fi semasa mendapatkan: ha: b: c OPT; adakah kes $ OPT dalam h) tolong ;; :) tolong ;; a) VARA = $ OPTARG ;; b) VARB = $ OPTARG ;; c) VARC = 1 ;; \?) pertolongan ;; esac selesai # Blok utama skrip yang # melakukan perkara dengan VARA, VARB dan VARC
«Barang kemas»Membaca pilihan satu persatu, jadi gelung diperlukan.
Terdapat 2 jenis pilihan yang boleh dilalui menggunakan «getopts":
- Parameter disebut bendera, dalam kes ini -c atau -h. Mereka dinyatakan dengan huruf yang ingin kita gunakan. Mereka seperti pemboleh ubah Boolean, «benar»(Adakah) atau«palsu"(Mereka tidak ada di sini).
- Parameter dengan argumen yang berkaitan, -sebarang, -b apa sahaja. Mereka dinyatakan dengan huruf yang kita mahukan dengan titik dua di bawah. Argumen disimpan dalam OPTARG (nama ini tidak dapat ditukar).
Apa yang dilakukan oleh skrip ini?
Menampilkan pesan pertolongan ketika tidak ada pilihan yang dilewatkan, ketika parameter "-h" diteruskan, ketika parameter yang tidak valid dilalui (misalnya "-x", ini dilakukan oleh "\?") Atau apabila parameter yang sah tanpa argumen (":"). Dalam kes-kes yang selebihnya, ia menjimatkan kehadiran "-c" sebagai 1 di VARC, dan nilai diteruskan dengan "-a" dan "-b" di VARA dan VARB.
MASTERI. Saya tidak mengatakan lebih banyak U_U
Helo, artikel yang sangat baik.
Hai anda memberi izin sudo + x dan bukannya chmod + x
$ sudo chmod + x script.sh
(Untuk lebih tepat, hehe)
Ah, tahniah dan terima kasih!
Pos yang sangat baik, sebenarnya saya mengucapkan tahniah kepada anda, teruskan, Salam
Dan jika anda mahu skrip itu dapat dilihat ketika ia dijalankan, langkah demi langkah, melihat contohnya bagaimana pemboleh ubah, keadaan dan segala sesuatu berperilaku, anda boleh menggunakan:
skrip sh -x
salam
PIECE pengasuhan. Cemerlang dan dijelaskan dengan baik.
Terima kasih.
Catatan yang sangat baik mengenai subjek 😉
Sangat menarik dan penting, terima kasih atas maklumatnya….
PENYAYANG !!!
Terima kasih semua atas ucapan tahniah, kerana untuk perintah Miguel, dia tidak membenarkan saya mengubah entri setelah diterbitkan. Itu mesti dilakukan elav yang saya bayangkan.
Sangat bagus!
Mula-mula saya ingin mengucapkan tahniah kepada anda melalui siaran tersebut, saya merasa mudah difahami dan sangat membantu untuk mengikuti panduan untuk memprogram dengan baik dalam kumpulan, terutama bagi orang yang mula memprogram.
Walau bagaimanapun, saya telah menemui beberapa butiran yang saya fikir harus diperbetulkan.
Pertama: di bahagian «2. STRUKTUR TULISAN »fungsi tidak ditutup, yang akan menyebabkan masalah ketika melaksanakannya dalam skrip.
Penyelesaiannya adalah dengan menambahkan tanda kurung penutup setelah perintah "keluar".
Kedua: di bahagian «4. BACA INPUT PENGGUNA "anda mengesahkan bahawa parameter yang boleh dimasukkan oleh pengguna mulai dari $ 0 hingga tak terhingga, namun," bash "hanya akan menafsirkan dari $ 0 hingga $ 9, kerana $ 10 akan sama dengan $ 1 + 0.
Untuk menyelesaikan masalah ini, anda boleh menggunakan perintah "shift" untuk mengambil pemboleh ubah berikut. Atau, tentukan pemboleh ubah dalam pendakap "$ {10}", supaya bash menyatukan nilainya, bukan sebagai $ 1 + 0.
Tanpa basa-basi lagi, salam!
Terima kasih atas komen anda. Ini sama sekali gagal menjelaskan penggunaan jalan keluar yang betul, baik dalam skrip dan fungsi. Untuk $ {10} saya tidak pernah mewariskan begitu banyak, jadi saya tidak menghadapi masalah itu, ada baiknya mengetahui bahawa ada jalan keluar untuk itu (saya telah mengetahui perkara baru yang dipelajari hari ini 😀).
Terima kasih banyak untuk artikel itu! Beberapa perkara yang anda sebutkan masih kurang dijelaskan. Contohnya, getops.
Di bahagian output skrin, anda harus menyebut kucing yang kemudian anda sebutkan ...
kucing <
***************************************
* BORANG INI SANGAT EKSPRESIF *
***************************************
EOF
Dalam contoh anda:
kucing << EOF >> test.sh
Dua perkara harus disebutkan ... >> itu adalah 'lampiran' iaitu, jika anda mengulangi perintah yang sama, anda akan mempunyai keseluruhan skrip dalam rangkap ... Anda hanya perlu menggunakan satu ...
kucing << EOF> script.sh
Ya, ia juga harus disebut script.sh
Kemudian masuk
jika [-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–bantuan"]]; kemudian
membantu
fi
Saya fikir ia harus ditulis ...
jika [[-z "$ 1"] || ["$ 1" == "-h"] || ["$ 1" == "–membantu"]]; kemudian
...
Masih banyak lagi yang dapat dijumpai dari BASH.
Bolehkah anda menamakannya "ASAS"? 🙂
Sebagai contoh, parameter 'penguji' seperti -z untuk melihat apakah ia kosong, atau -f untuk melihat apakah ia wujud sebagai fail.
Terima kasih sekali lagi atas usaha anda.
alberto
Tutorial skrip bash yang sangat baik!
-- PENGENALAN: UTF-8 --
Ini pertama kalinya saya melihat garis untuk menetapkan pengekodan watak dalam skrip bash. Nampaknya lebih khas Python daripada Bash. Adakah ia benar-benar perlu? Saya telah mencari rujukan di Google tetapi saya tidak dapat menemui apa-apa, adakah anda mempunyai pautan yang membincangkan perkara ini? Terutama pada kesesuaian garis itu.
Pada pendapat saya, untuk menulis skrip dalam Bash menggunakan UTF-8, anda hanya perlu menyimpan fail teks seperti itu (tanpa BOM) dan mempunyai pemboleh ubah persekitaran tertentu, (LANG dan LC_ *), diset dengan betul.
Maka, tentu saja, perintah yang dilaksanakan perlu disediakan untuk pengekodan selain ASCII. Sebagai contoh, jika kita mahu pergi ke huruf besar, ini nampaknya tidak berfungsi:
«Echo áéíóú | tr az AZ »
o:
«Echo áéíóú | tr [: bawah:] [: atas:] »
dan lebih baik menggunakan:
«Echo áéíóú | awk '{print toupper ($ 0)}' ».
Mengenai "pengekodan»Telah disebutkan dalam blog ini sebelum ini:
Bash: bagaimana membuat skrip boleh dilaksanakan
Skrip utiliti pemasangan pasca
Seseorang membetulkan saya, tetapi garis pengekodan (# -- PENGENALAN: UTF-8 --) Tidak ada hubungannya dengan bash atau shell: ini adalah baris komen (bermula dengan #) dan berfungsi untuk memberitahu EDITOR yang kami gunakan untuk menulis skrip (vim, emacs ...) pengekodan fail.
Sebenarnya, bash tidak melihat garis seperti itu, kerana itu adalah baris komen.
Tutorial yang sangat baik, kerana Sysadmin mengetahui Skrip dalam Bash sangat penting, ia berguna untuk semuanya.
Sangat sangat baik!
Salam!
Sekiranya ia berguna untuk sesiapa sahaja, berikut adalah beberapa kegunaan dan contoh untuk membuat Skrip anda sendiri: https://github.com/reduardo7/hsabx
Sangat bagus. Perkara baru untuk ditambahkan pada skrip saya. Perkara encodig dan printf tidak memilikinya.
Terima kasih!!!
Sooo artikel yang bagus! Saya menyimpan ini untuk kegemaran, ada baiknya membetulkan apa yang salah dan bahkan mengembangkannya dengan lebih banyak kandungan. Tepuk tangan untuk semua maklumat ini !!!!