Contoh Bash Kompleks Linux

Contoh Bash Kompleks Linux

Bash One-Liners dapat mengurangkan beban kerja, mengautomasikan sesuatu dengan cepat dan meletakkan kuasa kawalan sistem muktamad di tangan anda. Dari masa ke masa, anda mungkin akan belajar menulis satu-liners yang lebih kompleks dan beberapa perkara yang anda tulis sebagai profesional berpengalaman akan hampir tidak dapat dipisahkan oleh pemula. Yang mengatakan, perintah bash dan bahasa pembangunan sangat berstruktur - dan agak mudah difahami - setelah anda mengetahui tentang in dan out. Ia benar -benar seperti menjadi mahir dalam bahasa asing.

Dalam tutorial ini anda akan belajar:

  • Cara Menulis Perintah dan Skrip Bash Bash Lebih Lanjutan
  • Fahami cara menggabungkan pelbagai arahan menjadi skrip satu liner
  • Fahami bagaimana kod keluar dari satu arahan dapat mempengaruhi arahan lain semasa menggunakan && dan ||
  • Fahami bagaimana input dari arahan dapat diubahsuai dan kemudian digunakan oleh perintah seterusnya
  • Penggunaan dan kehidupan sebenar seperti contoh satu-liners bash yang lebih maju
Contoh Bash Kompleks Linux

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengedaran linux-bebas
Perisian Baris perintah bash, sistem berasaskan linux
Yang lain Sebarang utiliti yang tidak termasuk dalam shell bash secara lalai boleh dipasang menggunakan sudo apt-get memasang nama utiliti (atau pemasangan yum untuk sistem berasaskan redhat)
Konvensyen # - memerlukan komando linux untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$-Memerlukan komando linux untuk dilaksanakan sebagai pengguna yang tidak istimewa

Contoh 1: Kawalan Proses

Marilah kita mulakan dengan contoh bagaimana untuk menamatkan proses tertentu dalam bash dengan cara yang mudah diikuti:

$ tidur 3600 & [1] 1792341 $ ps -ef | Grep 'Sleep' Roel 1792441 1701839 0 12:59 PTS/13 00:00:00 Tidur 3600 ROEL 1792452 1701839 0 12:59 PTS/13 00:00:00 GREP -Color = Tidur Auto 


Mula -mula kami menyediakan arahan tidur, selama 3600 saat (satu jam), dan kemudian kami mendapati proses itu dalam senarai proses. Hebat, tetapi kita mempunyai sebenarnya grep perintah sebagai garis tambahan dalam output penyenaraian proses. Mari menapis itu dan juga mengeluarkan ID proses seterusnya dan bukannya output maklumat proses penuh:

$ ps -ef | GREP 'Tidur' | grep -v grep roel 1792441 1701839 0 12:59 pts/13 00:00:00 tidur 3600 $ ps -ef | GREP 'Tidur' | grep -v grep | awk 'cetak $ 2' 1792441 

Dalam perintah pertama, kami menapis grep aktif. Dalam perintah kedua kami mengambil langkah ini dengan mencetak lajur kedua $ 2 (dalam awk) dengan menggunakan awk perintah. Kita sekarang boleh menggunakan langkah lebih jauh dan sebenarnya bunuh proses itu. Katakan kita melakukannya dengan isyarat 9 yang sangat merosakkan proses linux (Sigkill):

$ ps -ef | GREP 'Tidur' | grep -v grep | awk 'print $ 2' | Xargs Kill -9 [1]+ Tidur Tidur 3600 

Dan kita dapat melihat proses kita dibunuh dengan betul. Manakala ini adalah contoh yang lebih mudah, ia melibatkan 6 arahan yang berbeza: ps, grep, grep sekali lagi, awk, Xargs dan bunuh. Anda dapat melihat bagaimana bash one-liners dapat dengan cepat membina kerumitan dalam pelbagai cara dan di pelbagai tahap kerumitan dan kemampuan pemprosesan data.

Dan, untuk mengetahui lebih lanjut mengenai Xargs, sila lihat artikel kami Xargs untuk pemula dengan contoh dan berbilang berulir Xargs dengan contoh.

Contoh 2: Seronok dengan kejayaan dan kegagalan!

$ echo '0'> a && echo '1'> b && echo '2'> c && ls didisexist || ls a && ls b && ls c && ls d && ls e ls: tidak dapat mengakses 'tidak notexist': tiada fail atau direktori sedemikian b c ls: tidak dapat mengakses 'd': tidak ada fail atau direktori sedemikian 


Betapa kompleksnya! Namun begitu anda tahu bagaimana membacanya, atau mungkin anda sudah melakukannya, ia menjadi sangat mudah dibaca. Marilah kita menunjukkan pernyataan ini sah dengan memecahkan perintah dalam ketulan bersaiz kecil yang lebih mudah difahami dan diikuti:

$ echo '0'> a && echo '1'> b && echo '2'> c 

Semua set arahan ini adalah sama seperti yang berikut dengan satu kaveat kecil:

$ echo '0'> a $ echo '1'> b $ echo '2'> c 

Jadi apa perbezaannya (dan kaveat kecil)?

Bahawa dalam siri arahan terakhir ini setiap arahan akan dilaksanakan, tidak kira apa hasil perintah sebelumnya. Urutan sebelumnya (menggunakan &&) hanya akan diteruskan ke tempat kedua echo jika Hasil perintah pertama adalah 0 (i.e. Kejayaan - dalam kejayaan bash dalam arahan ditunjukkan oleh 0 dan kegagalan dengan 1 atau lebih tinggi sebagai kod keluar).

Oleh itu, urutan arahan menggunakan && juga boleh ditulis seperti berikut;

$ echo '0'> a $ if [$ ? -eq 0]; kemudian echo '1'> b; fi $ if [$ ? -eq 0]; Kemudian echo '2'> c; fi 

The $ ? (atau $? dalam sintaks pendek) Pembolehubah selalu mengandungi hasil perintah terakhir, i.e. kod keluar (0, 1 atau lebih tinggi) yang dihasilkan oleh arahan terakhir.

Seperti yang dapat kita lihat, penciptaan satu baris echo '0'> a && echo '1'> b && echo '2'> c Pasti lebih mudah di mata dan pemahaman sekarang, dan ia pasti mengurangkan kerumitan kod yang sepadan dan sepadan yang dipaparkan di atas.

Mari kita ambil hanya satu arahan lagi:

$ echo '0'> a && echo '1'> b && echo '2'> c && ls didisexist ls: tidak dapat mengakses 'tidak notexist': tidak ada fail atau direktori sedemikian 

Ini sekarang lebih mudah dibaca, betul?

Kami hanya menambah arahan lain iaitu ls tidak mempunyai dengan syarat bahawa arahan sebelum itu (dan dalam hal ini seluruh baris sebagai semua arahan disertai oleh && dalam persediaan seperti rantai, di mana perintah yang rosak akan memecahkan rantai dan menghentikan pelaksanaan rantai sepenuhnya) telah berjaya. Oleh kerana semua arahan berjaya, ls dilaksanakan, dan ralat dihasilkan sebagai hasil yang sama kerana fail, baik, benar -benar tidak wujud 🙂

Jadi apa yang akan berlaku jika kita menyertai yang lain && pada akhir? Adakah rantaian perintah akan ditamatkan seperti yang kita katakan? Mari tweak arahan sedikit:

$ echo '0'> a && echo '1'> b && echo '2'> c && ls donnotexist && echo 'pasti tidak' ls: tidak dapat mengakses 'tidak disediakan': tidak ada fail atau direktori sedemikian 


Dan, pasti ia tidak melaksanakannya. Mari kita memperkenalkan perintah seterusnya kami dalam rantai kami dari contoh asal:

$ echo '0'> a && echo '1'> b && echo '2'> c && ls didisexist || ls a ls: tidak dapat mengakses 'tidak noteks': tidak ada fail atau direktori sedemikian a 

Bolehkah anda melihat apa yang berlaku? Di sini kita mempunyai simbol sintaks baru iaitu || yang berbeza dari && kerana ia hanya dijalankan sekiranya terdapat hasil yang tidak sifar dalam perintah sebelumnya. Perhatikan bahawa kedua -duanya || dan && Memohon hanya arahan terakhir, dan bukan rantai arahan, walaupun seseorang dapat memikirkannya sebagai rantaian secara keseluruhan.

Anda boleh memikirkannya && Seperti bahasa Inggeris setara dan dan, setakat yang sama dan hadir dalam bahasa pengaturcaraan, tetapi dengan sentuhan yang di sini kita memeriksa syarat sebelum && dan melaksanakan apa yang ada di belakangnya dengan syarat keadaan keluar adalah 0.

Sentuhan lain adalah bahawa kebanyakan bahasa pengaturcaraan akan diperiksa True-ness sebagai binari 1 bila && Sintaks digunakan. Sebagai contoh, pertimbangkan kod pseudo; jika test1_flag && test2_flag maka .. yang biasanya akan menilai ke Benar secara keseluruhan (dan dengan itu melaksanakannya kemudian arahan) Sekiranya bendera binari test1_flag dan test2_flag adalah 1 atau benar, sedangkan dalam bash True-ness ditunjukkan oleh a 0 (dan tidak 1) keluar status dari arahan terakhir!

Anda boleh memikirkan || Seperti bahasa Inggeris setara atau (atau seperti dalam Atau jika ini gagal, lakukan .. ). Dalam keadaan ini terdapat hubungan yang lebih kuat dengan bahasa pengaturcaraan yang sama: apabila pemeriksaan bahasa program biasa, sebagai contoh jika test1_flag || test2_flag kemudian .. , Kemudian positif binari test1_flag (i.e. nilai 1) atau test2_flag akan menghasilkan keadaan keseluruhan menjadi benar (dan dengan itu kemudian fasal akan dilaksanakan). Kami melihat perkara yang sama di bash; Sekiranya kod keluar perintah tidak sifar (i.e. 1 atau nilai yang lebih tinggi dalam beberapa kes), maka perintah di belakang || Fasal akan dilaksanakan.

Marilah kita kembali ke perintah asal dan menghirupnya sepenuhnya:

$ echo '0'> a && echo '1'> b && echo '2'> c && ls didisexist || ls a && ls b && ls c && ls d && ls e ls: tidak dapat mengakses 'tidak notexist': tiada fail atau direktori sedemikian b c ls: tidak dapat mengakses 'd': tidak ada fail atau direktori sedemikian 

Bolehkah anda melihat apa yang berlaku? Kerana ia ls tidak mempunyai Perintah gagal secara dalaman dan menghasilkan output bukan sifar (gunakan ls tidak mempunyai; echo $? dalam bash untuk mengesahkan; output adalah 2), The atau (||) klausa dicetuskan dan seterusnya kami melaksanakan ls. Gambarnya seperti rantai yang mengalir ke arah yang berbeza, tetapi masih ada rantai.

Sebagai ls a Perintah berjaya, dan diikuti oleh dan (&&) klausa, arahan seterusnya dilaksanakan dan sebagainya. Perhatikan bahawa pelaksanaan dapat ls d, dan output yang sama (LS: Tidak dapat mengakses 'D': Tiada fail atau direktori sedemikian) ditunjukkan, tetapi ls e Perintah tidak dilaksanakan! Ini diharapkan, seperti && digunakan dan ls d Perintah gagal. Oleh itu, ls e tidak pernah dilaksanakan.

Kesimpulan

Semakin mahir anda menjadi bertulis Bash One-Liners, semakin cepat, lebih baik, kurang rawan kesilapan dan lebih lancar skrip Bash One-Liner anda akan menjadi, dan semakin sedikit masa yang anda habiskan untuk menulisnya. Pemaju bahasa bash telah meletakkan semua kawalan di tangan anda. Apa yang akan anda lakukan dengan kawalan itu hari ini?

Tinggalkan kami mesej di bawah dengan ciptaan satu-liner anda!

Tutorial Linux Berkaitan:

  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux
  • Menguasai Gelung Skrip Bash
  • Mendapatkan halaman web menggunakan Wget, Curl dan Lynx
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Ubuntu 20.04 Panduan
  • Gelung bersarang dalam skrip bash
  • Manipulasi data besar untuk keseronokan dan keuntungan bahagian 1
  • Perkara yang perlu dilakukan setelah memasang Ubuntu 22.04 Jur -ubur Jammy ..