Contoh Bash Kompleks Linux
- 863
- 156
- Mr. Ramon Runolfsson
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
Keperluan perisian dan konvensyen yang digunakan
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 ..