Strim, saluran program dan ubah hala. Skrip sandaran mudah

Hari ini kita akan mula melihat keupayaan bash. Oleh kerana soalan ini agak besar, ia perlu dibahagikan kepada beberapa bahagian. Jadi mari kita pergi dari mudah kepada kompleks. By the way, terdapat kebarangkalian yang sangat tinggi bahawa maklumat yang dipelajari semasa belajar bash, akan berguna apabila bekerja dengan penterjemah arahan lain.
Strim input dan output standard.
Konsep yang agak penting ini hanya bermaksud dari mana program membaca data secara lalai (stdin) dan tempat ia mengeluarkan hasil kerjanya (stdout). Terdapat juga aliran keluaran ralat standard (stderr). Biasanya ini ialah skrin (lebih tepat, terminal pengguna) + papan kekunci. Mengapa anda perlu tahu ini? Tetapi hakikatnya ialah semua aliran ini boleh diubah hala. Selalunya, fail digunakan untuk I/O.
Sebagai contoh, dengan cara ini anda boleh mencipta fail yang mengandungi senarai fail dalam direktori yang ditentukan.
$ ls -l > ~/file_with_files
Ngomong-ngomong, perlu diingat bahawa pada kali seterusnya anda melaksanakannya, fail itu akan ditulis semula sepenuhnya, dan semua yang ada sebelum ini akan hilang. Jika anda perlu menambah pada penghujung fail, maka anda perlu menggunakan “>>” dan bukannya “>”
$ ls -l >> ~/file_with_files
Selain itu, apabila melaksanakan arahan, anda boleh memisahkan benang.
stdin ialah nombor 0
stdout adalah nombor 1
stderr ialah nombor 2
Iaitu, anda boleh mengeluarkan ralat ke fail berasingan, dan mesej biasa akan dipaparkan seperti biasa. Untuk melakukan ini, anda perlu meletakkan nombor 2 di hadapan ">" (nombor benang, sama seperti stdin, stdout). Contohnya seperti ini
$ find / -name .bashrc 2> ~/finderrors.txt
Di samping itu, terdapat peranti yang dipanggil /dev/null, yang mana anda juga boleh mengubah hala output. Dalam kes ini, tiada apa yang dihantar akan dipaparkan di mana-mana sahaja.
$ find / -name asdf 2 > /dev/null
Output juga boleh dihantar ke arahan lain. Sebagai contoh, arahan berikut akan mencetak bilangan perkataan dalam fail
$ cat ~/finderrors.txt > wc -w
Jika anda perlu menulis skrip di mana beberapa program memerlukan input, maka anda boleh menghantar kandungan fail kepadanya
$ wc -w< ~/finderrors.txt
Catatan. ">" tanpa menyatakan nombor benang ditafsirkan sebagai "1 >". Iaitu, hanya stdin akan dikeluarkan.
Penghantar.
Pasti anda telah melihat pasukan jenis berikut:
$ cat /etc/bash.bashrc | lebih
Hasil daripada operasinya, output akan dijeda apabila skrin terisi. Jadi, "|" dan terdapat penghantar ini. Dari segi pintar, ini ialah saluran yang mana satu proses hanya boleh menulis, dan satu lagi hanya boleh membaca. Persampelan dan penempatan ke dalam penghantar sedemikian mengikut prinsip FIFO (Masuk Pertama - Keluar Dahulu). Prinsip ini juga dipanggil baris gilir, yang sangat ringkas dan tepat mencirikan operasinya. Saluran paip digunakan untuk menggabungkan kerja beberapa program kecil.
Mari lihat kerja arahan seterusnya.
$ kucing myfile | grep Linux | kami -1
Cat myfile pertama mencetak kandungan fail myfile, kemudian grep Linux membaca output dan hanya memilih baris yang mengandungi perkataan Linux. Kemudian wc -l mengira bilangan baris. Hasilnya, kita akan mendapat bilangan baris yang mengandungi perkataan Linux.
Ia sangat mudah untuk menggunakan utiliti xargs bersama-sama dengan "|". xargs membaca elemen output stdin yang dipisahkan oleh ruang dan melaksanakan program dengan menghantarnya satu atau lebih kali.
Sebagai contoh
$ find /tmp -name core -type f -print | xargs /bin/rm -f
Perintah ini mencari fail bernama teras dalam direktori /tmp dan memadamkannya.
Simbol khas.
Tidak seperti Windows, nama fail dalam Linux boleh mengandungi hampir semua aksara (contohnya, nama fail example*of:file adalah agak mungkin). Tetapi bash menggunakan beberapa aksara sebagai aksara perkhidmatan. Dan untuk operasi yang betul Watak-watak ini perlu dilepaskan. Ini boleh dilakukan dalam beberapa cara.
Anda boleh meletakkan ungkapan dalam petikan. Sebagai contoh
$ cp "contoh*:fail" ~
Anda juga boleh menggunakan petikan tunggal
$ cp "contoh*:fail" ~
Perbezaannya ialah dalam petikan tunggal semua aksara khas kehilangan maknanya, dalam petikan berganda - semua kecuali $ dan \
Tetapi yang paling universal ialah kaedah seperti C untuk membatalkan aksara khas. Untuk melakukan ini, letakkan "\" (tanpa petikan) sebelum simbol. Sebagai contoh, arahan kami akan kelihatan seperti ini.
$ cp contoh\*of\:fail ~
Melaksanakan arahan.
Terdapat beberapa simbol untuk mengatur pelaksanaan arahan.
Jika anda perlu melaksanakan beberapa arahan secara berurutan, ia harus dipisahkan dengan simbol ";". Sebagai contoh, urutan seterusnya akan menyusun fail (dan kompilasi adalah proses yang panjang, anda boleh tidur pada masa ini!), kemudian matikan komputer.
$ buat ; sudo shutdown -h sekarang
Jika anda perlu menjalankan program dalam latar belakang(iaitu, kembalikan kawalan kepada pengguna sejurus selepas pelancaran, ini boleh menjadi mudah apabila melancarkan aplikasi grafik), maka anda perlu meletakkan simbol "&" selepas arahan. Sebagai contoh
$sudo sinaptik &
Akibatnya, sinaptik akan bermula dan kita boleh menggunakan emulator terminal semasa tanpa meninggalkannya.
Tetapi bagaimana jika kita perlu melaksanakan arahan hanya jika operasi berjaya diselesaikan. Sebagai contoh, terdapat tugas berikut:
Anda perlu menyusun fail. Untuk melakukan ini, anda perlu menjalankan configure, make, sudo make install. Selain itu, ia perlu dilaksanakan hanya jika arahan sebelumnya berjaya berakhir.
Dalam kes sedemikian, urutan "&&" digunakan. Operator selepas "&&" dilaksanakan hanya jika yang sebelumnya berjaya diselesaikan. Iaitu, bagi kami ia akan kelihatan seperti ini:
$ ./configure && make && sudo make install
Jika anda perlu melaksanakan hanya jika program berakhir dengan ralat, maka anda perlu menggunakan "||". Sebagai contoh, mari kita rumitkan masalah. Jika terdapat ralat, anda perlu menulisnya ke fail, dan kemudian, tanpa mengira penghujungnya, matikan komputer.
$ ./configure && buat && buat pemasangan || echo fail > ~/errorfile ; sudo shutdown -h sekarang
Corak nama fail
Cara paling mudah ialah menyenaraikannya di atas pinggan. Perlu diingat bahawa templat boleh digabungkan dalam satu arahan.
Maksud Corak
* Sebarang urutan aksara, termasuk yang kosong
? Mana-mana watak tunggal
(a,b,c,d) Mana-mana aksara yang disenaraikan dalam kurungan
Sebarang aksara daripada selang waktu yang ditentukan
[^0-6] Sebarang aksara yang tidak disertakan dalam selang waktu yang ditentukan
Cara paling mudah untuk memahaminya ialah dengan contoh.
Katakan kita mempunyai folder yang mengandungi fail berikut.
Glava01, Glava02, Glava03, Glava04, Glava05, Glava15, Glava17.
Mari gunakan templat Glava0* dan dapatkan senarai Glava01, Glava02, Glava03, Glava04, Glava05.
Mari gunakan templat Glava?5 dan dapatkan senarai Glava05, Glava15.
Mari gunakan templat Glava?(4,5) dan dapatkan senarai Glava04, Glava05, Glava15.
Mari gunakan templat Glava0 dan dapatkan senarai Glava01, Glava02, Glava03.
Perlaksanaan ungkapan aritmetik.
Ya, bash juga boleh melakukannya. Terdapat dua bentuk untuk ini
$[ungkapan] pertama
kedua $((ungkapan))
Sebagai contoh
$echo$
Hasil pelaksanaan akan menjadi nombor 6. Jika ungkapan tidak betul, bash akan memaparkan mesej ralat.
Penggantian arahan.
Penggantian arahan sangat alat yang berkuasa bash. Intinya ialah arahan bertulis berubah kepada hasil pelaksanaannya. Terdapat dua borang rakaman
$(command) dan `command` (dalam kes ini, bukan petikan tunggal digunakan, tetapi aksara yang diperolehi oleh gabungan SHIFT+~). Sebagai contoh, di sini contoh yang bersinar, yang digunakan dalam Debian apabila memasang pakej pengepala untuk kernel semasa.
# apt-get install linux-headers-`uname -r`
Perintah uname -r, apabila dilaksanakan, memaparkan versi kernel yang digunakan. Iaitu, apabila saya melaksanakannya, ia berubah kepada
# apt-get install linux-headers-2.6.25-2-686
Selain itu, ia mungkin mengambil rupa yang berbeza untuk anda. Anda juga boleh menukar kernel dan memasang pakej dengan arahan yang sama.
Penapis
Ini adalah arahan yang boleh mengubah aliran data input dan mengeluarkan hasilnya kepada output standard.
Penerangan ringkas pasukan
cat Kepada output standard (iaitu.
pada skrin) kandungan fail yang ditentukan (atau beberapa fail) dipaparkan.
menangkap jika nama mereka ditentukan secara berurutan sebagai argumen arahan).
grep, fgrep, egrep Cari dalam fail input atau data daripada input standard baris yang mengandungi corak yang ditentukan dan mencetaknya ke output standard
tr Menggantikan semua aksara yang berlaku dalam aliran input yang disenaraikan dalam senarai yang diberikan dengan aksara yang sepadan daripada senarai kedua yang ditentukan
comm Membandingkan dua fail baris demi baris dan mengeluarkan 3 lajur kepada output standard: yang pertama - baris yang berlaku hanya dalam fail pertama, baris kedua - yang berlaku hanya dalam fail ke-2 dan baris ketiga - yang muncul dalam kedua-dua fail
pr Format untuk percetakan fail teks atau kandungan input standard
sed Editor rentetan yang digunakan untuk melakukan beberapa transformasi pada aliran data input (diambil daripada fail atau input standard)
lebih dan kurang Paparkan kandungan fail pada skrin dalam halaman berasingan dengan tepat saiz keseluruhan skrin.
wc Mengira bilangan perkataan, baris atau bait dalam strim.
Sebagai contoh,
$ grep CONFIG_XEN . -Rl | xargs -i sed -i -e "s/CONFIG_XEN/CONFIG_LUPO/g" ()
Mencari fail dalam folder semasa, mengandungi baris "CONFIG_XEN" dan menukarnya kepada "CONFIG_LUPO" dalam semua fail yang ditemui.
Di sinilah kita akan berehat untuk memahami keseluruhan isipadu bahan. Bash ialah jurubahasa yang sangat berkuasa dan memerlukan latihan untuk menguasainya. Artikel seterusnya akan melihat cara membuat skrip untuknya. Mari mulakan pengaturcaraan. Sehingga lain kali!
Tag: Linux, artikel

Tag: Mengapa anda memerlukan saluran paip arahan dalam bash?

Apabila anda bekerja dalam satu pasukan, anda memberi makan antara satu sama lain dengan emosi, kerja anda, kejayaan dan pencapaian....

Arahan /pasukan papan markah tambah nama /senarai pasukan papan markah /pasukan papan markah menyertai nama /pasukan papan markah meninggalkan ...

google.com/bin/echo foo | grep bar" .... getpid() = 13726<– PID ..... 1 · Почему в Ubuntu 16.04 медленный apt-get dist-upgrade? ... Спасибо, очень интересная статься… но как всегда нужна мера, чтобы не полочалось такого:

25 Feb 2009 - lakukan arahan selesai. Mari lihat contoh kecil: #!/bin/bash .... Saluran paip ialah alat yang sangat berkuasa untuk bekerja dengan konsol Bash. .... untuk melakukan beberapa perkara dan cuba memahami mengapa program untuk melakukan direktori tidak ditemui... ... Mungkin ini memerlukan beberapa tetapan, tetapi pada masa yang sama saya ada...

Tolong saya selesaikan beberapa masalah. #!/bin/bash | Pengarang topik: Ilya

30. Buat saluran paip untuk menyenaraikan hanya nama dan kebenaran fail yang sedang berada dalam direktori kerja anda. 31. Tukar saluran paip yang dibina supaya senarai disimpan dalam fail spisok direktori HOME anda, dan hanya bilangan fail dalam senarai dipaparkan. 32. Paparkan kandungan fail /etc/passwd, disusun mengikut medan nama pengguna. 33. Buat alias yang dipanggil log masuk yang akan memaparkan senarai nama pengguna yang dilog masuk ke sistem mengikut susunan abjad. 34. Berikan pembolehubah IAM nama log masuk anda. Lancarkan satu lagi cangkerang. Adakah anda melihat pembolehubah ini? Apakah yang perlu anda lakukan untuk melihatnya dalam shell yang dijana? Tukar nilai pembolehubah IAM dalam cangkerang yang dihasilkan. Keluar dari cangkerang yang bertelur. Cari nilai pembolehubah ini dalam shell sumber. Terangkan hasilnya. 40. Tulis hello program shell yang memberikan respons berikut kepada argumen baris arahan: - argumen "-d" - program akan melaksanakan arahan tarikh; - hujah "-l" - program akan memaparkan kandungan direktori semasa; Jika tiada hujah atau hujah tidak sah pada baris arahan, atur cara akan mencetak bantuan tentang pilihannya. 41. Tulis program perkataan yang akan menggesa pengguna memasukkan satu perkataan pada satu masa sehingga dia memasukkan perkataan "tamat". Ingat semua perkataan yang anda masukkan. Selepas memasukkan perkataan "end", paparkan semua perkataan yang dimasukkan. Terima kasih jika anda boleh mencadangkan sekurang-kurangnya satu daripada ini

Vitaly  32. cat /etc/passwd | menyusun

Panduan Skrip Bash Lanjutan - Linux dalam bahasa Rusia

Mengapakah pengetahuan tentang bahasa Shell diperlukan? 2. ..... Memindahkan output daripada arahan gema kepada arahan baca, di sepanjang saluran paip; 33-1. skrip pembalut; 33-2. Lagi...

Pengalihan I/O - OpenNet

Panduan Skrip Bash Lanjutan: Seni Pengaturcaraan Bahasa... Arahan ubah hala satu baris # (hanya mempengaruhi baris... Hanya stderr disalurkan. exec 3>&1 # Simpan arus...

Operator untuk masuk bertujuan untuk akses berurutan kepada nilai yang disenaraikan dalam senarai. Setiap nilai seterusnya dalam senarai diberikan kepada pembolehubah. Sintaksnya adalah seperti berikut:

untuk pembolehubah dalam value_list lakukan arahan yang dilakukan

Mari kita lihat contoh kecil:

#!/bin/bash untuk i dalam 0 1 2 3 4 #kami akan memberikan nilai secara bergilir-gilir dari 0 hingga 4 termasuk kepada pembolehubah $i lakukan echo "Nombor konsol ialah $i">> /dev/pts/$i #Tulis baris "Nombor konsol ialah $i" pada fail /dev/pts/$i (fail terminal maya) selesai #gelung selesai keluar 0

Selepas melaksanakan contoh, baris dengan nombornya akan muncul dalam 5 konsol maya pertama (terminal). Pembolehubah $i digantikan secara bergilir-gilir dengan nilai daripada senarai dan dalam gelung kerja dalam proses dengan nilai pembolehubah ini.

Kitaran. gelung semasa

Gelung while adalah lebih kompleks daripada gelung for-in dan digunakan untuk mengulangi arahan selagi beberapa ungkapan adalah benar (kod pulangan = 0). Sintaks operator adalah seperti berikut:

manakala ungkapan atau arahan mengembalikan kod pulangan arahan do yang dilakukan

Mari kita lihat contoh berikut tentang cara gelung berfungsi:

#!/bin/bash lagi =ya #tetapkan nilai "ya" kepada pembolehubah sekali lagi manakala [" $lagi"= "ya" ] #Kami akan gelung sehingga $again sama dengan "ya" lakukan echo "Sila masukkan nama:" baca nama gema "Nama yang anda masukkan ialah $name" echo "Adakah anda mahu meneruskan?" baca lagi selesai bergema "Bye-Bye"

Dan kini hasil skrip:

Ite@ite-desktop:~$ ./bash2_primer1.sh Sila masukkan nama: ite Nama yang anda masukkan ialah ite Adakah anda ingin meneruskan? ya Sila masukkan nama: mihail Nama yang anda masukkan ialah mihail Adakah anda ingin meneruskan? tiada Bye-Bye

Seperti yang anda lihat, gelung berjalan sehingga kita memasukkan sesuatu selain daripada "ya". Antara lakukan dan selesai anda boleh menerangkan sebarang struktur, operator, dan lain-lain, semuanya akan dilaksanakan dalam gelung Tetapi anda harus berhati-hati dengan gelung ini, jika anda menjalankan sebarang arahan di dalamnya tanpa mengubah pembolehubah ungkapan, anda boleh mendapatkan terperangkap dalam gelung yang tidak berkesudahan.

Sekarang tentang keadaan kebenaran. Selepas beberapa ketika, seperti dalam pernyataan bersyarat if-then-else, anda boleh memasukkan sebarang ungkapan atau arahan yang mengembalikan kod pulangan, dan gelung akan dilaksanakan sehingga kod pulangan = 0! Pengendali "[" ialah analog perintah ujian, yang menyemak kebenaran syarat yang dihantar kepadanya.

Mari lihat contoh lain, saya mengambilnya daripada buku skrip Advanced Bash. Saya sangat menyukainya Senyum, tetapi saya permudahkan sedikit. Dalam contoh ini, kami akan memperkenalkan satu lagi jenis gelung UNTIL-DO. Yang ini boleh dikatakan analog lengkap WHILE-DO kitaran, hanya dilaksanakan manakala sesetengah ungkapan adalah palsu.

Berikut ialah contoh:

#!/bin/bash gema "Masukkan pengangka:" baca gema dividen "Masukkan penyebut:" baca pembahagi dnd =$dividen #kami akan menukar pembolehubah dividen dan pembahagi, #mari kita simpan pengetahuan mereka dalam pembolehubah lain, kerana... mereka memberi kita#akan memerlukan dvs =$baki pembahagi =1 sehingga [ " $baki "-eq 0 ] biarlah "baki = dividen % pembahagi" dividen =$pembahagi pembahagi =$baki selesai bergema "GCD nombor $dnd dan $dvs = $dividen "

Hasil pelaksanaan skrip:

Ite@ite-desktop:~$ ./bash2_primer3.sh Masukkan pengangka: 100 Masukkan penyebut: 90 GCD daripada 100 dan 90 = 10

Operasi matematik

biarkan perintah.

Perintah let menghasilkan operasi aritmetik atas nombor dan pembolehubah.

Mari kita lihat contoh kecil di mana kita melakukan beberapa pengiraan pada nombor yang dimasukkan:

#!/bin/bash echo "Masukkan a: " baca echo "Masukkan b: " baca b biarkan "c = a + b" #addition echo "a+b= $c" biarkan "c = a / b" #division echo "a/b= $c" biarkan "c<<= 2" #menganjak c 2 bit ke kiri bergema "c selepas peralihan sebanyak 2 bit: $c " biarkan "c = a % b" # mencari baki a dibahagikan dengan b bergema" $a / $b . baki: $c "

Keputusan pelaksanaan:

Ite@ite-desktop:~$ ./bash2_primer2.sh Masukkan a: 123 Masukkan b: 12 a+b= 135 a/b= 10 c selepas peralihan sebanyak 2 digit: 40 123 / 12. baki: 3

Nah, seperti yang anda lihat, tidak ada yang rumit, senarai operasi matematik adalah standard:

Penambahan
- - penolakan
* - pendaraban
/ - pembahagian
** - eksponen
% - modulus (pembahagian modulo), baki pembahagian

let membolehkan anda menggunakan singkatan untuk perintah aritmetik, dengan itu mengurangkan bilangan pembolehubah yang digunakan.

Contohnya: a = a+b bersamaan dengan a +=b, dsb.

Bekerja dengan program luaran semasa menulis skrip shell

Pertama, beberapa teori yang berguna.

Ubah hala strim

Bash (seperti kebanyakan cangkerang lain) mempunyai deskriptor fail terbina dalam: 0 (stdin), 1 (stdout), 2 (stderr).

stdout - Keluaran standard. Semua yang keluaran program pergi ke sini
stdin - Input standard. Ini sahaja yang ditaip pengguna dalam konsol
stderr - Output ralat standard.

Untuk operasi dengan pemegang ini, terdapat aksara khas: > (halakan semula output),< (перенаправление ввода). Оперировать ими не сложно. Например:

kucing /dev/random > /dev/null

ubah hala output cat /dev/random ke /dev/null (operasi yang tidak berguna sama sekali) atau

ls -la > penyenaraian

tulis kandungan direktori semasa ke fail penyenaraian (lebih berguna)

Jika terdapat keperluan untuk menambah fail (apabila menggunakan ">" ia diganti), anda mesti menggunakan ">>" dan bukannya ">"

sudo< my_password

selepas meminta sudo untuk kata laluan, ia akan diambil dari fail my_password, seolah-olah anda telah memasukkannya dari papan kekunci.

Jika anda perlu menulis kepada fail hanya ralat yang boleh berlaku semasa menjalankan program, anda boleh menggunakan:

./ program_with_error 2 > error_file

nombor 2 sebelum ">" bermakna anda perlu mengubah hala semua yang berakhir dalam deskriptor 2 (stderr).

Jika anda perlu memaksa stderr untuk menulis ke stdout, maka ini boleh dilakukan seperti berikut. cara:

./ program_with_error 2 >& 1

simbol "&" bermaksud penunjuk kepada deskriptor 1(stdout)

(Secara lalai, stderr menulis ke konsol tempat pengguna bekerja (atau lebih tepat, menulis ke paparan)).

2. Penghantar

Saluran paip ialah alat yang sangat berkuasa untuk bekerja dengan konsol Bash. Sintaksnya mudah:

pasukan1 | arahan 2 - bermakna output arahan 1 akan dihantar sebagai input kepada arahan 2

Talian paip boleh dikumpulkan ke dalam rantai dan output menggunakan pengalihan ke fail, contohnya:

ls -la | grep "hash" | sort > sortilg_list

Output perintah ls -la dihantar ke perintah grep, yang memilih semua baris yang mengandungi perkataan hash dan menghantarnya ke perintah sort, yang menulis hasilnya ke fail sorting_list. Semuanya agak jelas dan mudah.

Selalunya, skrip Bash digunakan untuk mengautomasikan beberapa operasi rutin dalam konsol, oleh itu kadangkala terdapat keperluan untuk memproses stdout satu arahan dan memindahkannya ke stdin kepada arahan lain, manakala hasil daripada melaksanakan satu arahan mesti diproses dalam beberapa cara. Dalam bahagian ini saya akan cuba menerangkan prinsip asas bekerja dengan arahan luaran di dalam skrip. Saya fikir saya telah memberikan contoh yang mencukupi dan sekarang saya boleh menulis hanya perkara utama.

1. Menghantar output kepada pembolehubah

Untuk merekodkan output perintah ke dalam pembolehubah, hanya sertakan perintah dalam petikan ``, sebagai contoh

A = ` echo "qwerty" ` echo $a

Keputusan: qwerty

Walau bagaimanapun, jika anda ingin menyimpan senarai direktori dalam pembolehubah, anda mesti memproses hasilnya dengan betul untuk meletakkan data dalam pembolehubah. Mari kita lihat contoh kecil:

LIST =` find / svn/ -type d 2>/ dev/ null| awk "(FS="/") (cetak $4)" | menyusun | uniq | tr "\n" " " ` untuk ONE_OF_LIST dalam $LIST lakukan svnadmin hotcopy / svn/ $ONE_OF_LIST / svn/ temp4backup/ $ONE_OF_LIST done

Di sini kita gunakan untuk gelung-do-done untuk mengarkibkan semua direktori dalam folder /svn/ menggunakan arahan hotcopy svnadmin (yang dalam kes kami tidak penting kepada sesiapa, hanya sebagai contoh). Barisan yang paling diminati ialah: LIST=`find /svn/ -type d 2>/dev/null| awk "(FS="/") (cetak $4)"| sort|uniq | tr "\n" " "` Di dalamnya, pembolehubah LIST diberikan pelaksanaan perintah find, diproses oleh perintah awk, sort, uniq, tr (kami tidak akan mempertimbangkan semua arahan ini, kerana ini adalah artikel berasingan) . Pembolehubah LIST akan mengandungi nama semua direktori dalam folder /svn/ diletakkan pada satu baris (untuk memasukkannya ke dalam kitaran.

Seperti yang anda lihat, semuanya tidak sukar, cuma fahami prinsipnya dan tulis beberapa skrip anda sendiri. Sebagai kesimpulan artikel, saya ingin mengucapkan selamat maju jaya dalam mempelajari BASH dan Linux secara umum. Kritikan, seperti biasa, dialu-alukan. Artikel seterusnya mungkin ditumpukan kepada penggunaan program seperti sed, awk.

Apa yang diperlukan?

Anda harus membiasakan diri dengan baris arahan serta konsep pengaturcaraan asas. Walaupun ini bukan tutorial pengaturcaraan, ia menerangkan (atau, sebagai sekurang-kurangnya, percubaan untuk menerangkan) banyak konsep asas.
Penggunaan dokumen ini

Dokumen ini mungkin diperlukan dalam situasi berikut:

Anda mempunyai idea yang berkaitan dengan pengaturcaraan, dan terdapat keperluan untuk menjalankan proses pengekodan beberapa skrip shell.

Idea pengaturcaraan anda tidak cukup khusus dan memerlukan panduan tambahan.

Adakah anda ingin melihat beberapa skrip dan ulasan shell sebagai contoh untuk mencipta sendiri?

Anda sedang berhijrah dari DOS/Windows (atau telah melakukannya) dan ingin mencipta fail "batch".

Anda seorang nerd yang lengkap dan membaca apa-apa cara yang boleh didapati.

Skrip paling mudah

BAGAIMANA-CARA ini cuba memberikan anda beberapa garis panduan untuk pengaturcaraan shell, hanya berdasarkan contoh.

Dalam bahagian ini anda akan menemui skrip kecil yang mungkin berguna kepada anda apabila menguasai beberapa teknik.

Skrip tradisional "hello world".

#!/bin/bash echo Hello World!

Skrip ini hanya mengandungi dua baris. Yang pertama memberitahu sistem program apa yang sedang digunakan untuk menjalankan fail.

Baris kedua ialah satu-satunya tindakan yang dilakukan oleh skrip ini, mencetak "Hello world" ke terminal.

Jika anda menerima sesuatu seperti ./hello.sh: Perintah tidak dijumpai. , maka mungkin baris pertama "#!/bin/bash" adalah salah; jalankan whereis bash atau lihat mencari bash untuk mengetahui baris ini sepatutnya.

Skrip sandaran mudah

#!/bin/bash
tar -cZf /var/my-backup.tgz /home/me/

Dalam skrip ini, bukannya mencetak mesej pada terminal, kami mencipta arkib tar bagi direktori rumah pengguna. Skrip TIDAK bertujuan untuk kegunaan praktikal. Skrip yang lebih cekap akan dibentangkan kemudian dalam dokumen ini. Salinan simpanan.

Semua Mengenai Teori Pengalihan dan Pandangan Pantas

Terdapat 3 deskriptor fail: stdin - input standard, stdout - output standard dan stderr - ralat standard.

Ciri utama anda:
ubah hala stdout ke fail
ubah hala stderr ke fail
ubah hala stdout ke stderr
ubah hala stderr ke stdout
ubah hala stderr dan stdout ke fail
ubah hala stderr dan stdout ke stdout
ubah hala stderr dan stdout ke stderr

1 bermaksud stdout dan 2 bermaksud stderr. Nota ringkas untuk pemahaman lanjut: dengan arahan yang kurang, anda boleh melihat kedua-dua stdout, yang kekal dalam penimbal, dan stderr, yang dicetak ke skrin. Walau bagaimanapun, ia dipadamkan apabila anda cuba "melayari" penimbal.

Contoh: stdout ke fail

Tindakan ini menulis output standard program ke fail.

ls -l > ls-l.txt

Ini mencipta fail yang dipanggil "ls-l.txt". Ia akan mengandungi semua yang anda akan lihat jika anda hanya menjalankan arahan "ls -l". 3.3 Contoh: stderr ke fail
Tindakan ini menulis aliran ralat standard program ke fail.
grep da * 2> grep-errors.txt

Ini mencipta fail yang dipanggil "grep-errors.txt". Ini akan mengandungi bahagian ralat standard output arahan "grep;da;*". 3.4 Contoh: stdout kepada stderr

Tindakan ini menulis output standard program ke fail yang sama dengan aliran ralat standard.
grep da * 1>&2

Di sini output standard arahan dihantar kepada ralat standard. Anda boleh melihat ini dengan cara yang berbeza. 3.5 Sampel: stderr 2 stdout

Tindakan ini menulis aliran ralat standard program ke tempat yang sama dengan output standard.
grep * 2>&1
Di sini aliran ralat standard arahan dihantar ke output standard; Jika anda menyalurkan hasil (|) kepada kurang, anda akan melihat bahawa baris yang biasanya akan hilang (seperti yang ditulis kepada ralat standard) disimpan dalam kes ini (kerana ia berada pada output standard). 3.6 Contoh: stderr dan stdout ke fail

Tindakan ini meletakkan semua output program ke dalam fail. Ini adalah pilihan yang baik untuk kerja cron: jika anda mahu arahan berjalan sepenuhnya dengan senyap.
rm -f $(cari / -nama teras) &> /dev/null

Ini (dengan andaian untuk cron) memadam mana-mana fail yang dipanggil "teras" dalam mana-mana direktori. Ingat bahawa anda harus benar-benar yakin tentang apa yang dilakukan oleh arahan jika anda ingin menimpa outputnya. 4. Penghantar

Bahagian ini menerangkan dengan cara yang agak mudah dan praktikal bagaimana penghantar harus digunakan dan mengapa anda mungkin memerlukannya.
Apakah itu dan mengapa anda perlu menggunakannya?

Saluran paip memberi anda keupayaan untuk menggunakan (penulis yakin bahawa ini agak mudah) output satu program sebagai input yang lain.

Contoh: saluran paip mudah dengan sed

Ini adalah cara yang sangat mudah untuk menggunakan penghantar.

ls -l | sed -e "s//u/g"

Apa yang berlaku di sini ialah arahan ls;-l pada mulanya dilaksanakan, dan outputnya, bukannya dipaparkan pada skrin, dihantar ke program sed, yang seterusnya mencetak apa yang sepatutnya pada skrin. 4.3 Contoh: alternatif untuk ls;-l;*.txt

Ini mungkin jauh lebih kompleks daripada ls;-l;*.txt, tetapi ia dibentangkan di sini hanya untuk menggambarkan kerja dengan saluran paip, bukan untuk memutuskan antara dua kaedah penyenaraian.

ls -l | grep "\.txt$"

Di sini, output ls -l dihantar ke grep, yang seterusnya mencetak baris yang sepadan dengan ungkapan biasa "\.txt$". 5. Pembolehubah

Anda boleh menggunakan pembolehubah dengan cara yang sama seperti dalam mana-mana bahasa pengaturcaraan. Tiada jenis data. Pembolehubah dalam bash boleh menjadi nombor, aksara, atau rentetan aksara.

Anda tidak sepatutnya mengisytiharkan pembolehubah. Malah, memberikan nilai kepada penudingnya sudah pun menciptanya.

Contoh: "Hello World!" menggunakan pembolehubah

#!/bin/bash
STR="Hello World!"
gema $STR

Baris kedua mencipta pembolehubah yang dipanggil STR dan memberikan nilai rentetan "Hello World!". VALUE pembolehubah ini kemudiannya diekstrak dengan menambahkan tanda "$" di hadapan. Sila ingat (cuba bersungguh-sungguh) bahawa jika anda tidak menggunakan tanda "$", output program mungkin berbeza. Mungkin bukan yang anda perlukan.
Contoh: skrip sandaran yang sangat mudah (lebih cekap)
#!/bin/bash
OF=/var/my-backup-$(date +%Y%m%d).tgz #OF - Fail Output - fail output
tar -cZf $OF /home/me/

Skrip ini memperkenalkan konsep lain. Pertama sekali, anda harus berurusan dengan baris kedua. Beri perhatian kepada ungkapan "$(date +%Y%m%d)". Jika anda menjalankan skrip ini, anda akan melihat bahawa ia melaksanakan perintah di dalam kurungan, memintas outputnya.

Ambil perhatian bahawa dalam skrip ini, nama fail output akan berubah setiap hari berdasarkan format kekunci arahan tarikh;(+%Y%m%d). Anda boleh menggantikan ini dengan tugasan format yang berbeza.
Contoh lain:
gema ls
echo $(ls)

Pembolehubah setempat

Pembolehubah tempatan boleh dibuat dengan menggunakan kata kunci tempatan.
#!/bin/bash
HELLO=Hello
fungsi hello(
tempatan HELLO=Dunia
echo $HELLO
}
echo $HELLO
hello
echo $HELLO
Contoh ini sepatutnya mencukupi untuk menunjukkan cara pembolehubah tempatan boleh digunakan.

Kenyataan bersyarat

Pernyataan bersyarat memberi anda keupayaan untuk memutuskan sama ada untuk melakukan tindakan atau tidak; keputusan dibuat semasa mengira nilai ungkapan.

Hanya teori

Terdapat banyak bentuk pernyataan bersyarat. Bentuk asas ialah pernyataan if then, di mana "penyataan" dilaksanakan hanya jika "ungkapan" dinilai kepada "benar". "2<1" - это выражение, имеющее значение "ложь", в то время как "2>1" - "benar".

Terdapat bentuk lain pernyataan bersyarat seperti: jika ungkapan maka pernyataan1 pernyataan lain2. Di sini "operator1" dilaksanakan jika "ungkapan" adalah benar; jika tidak, "pernyataan2" dilaksanakan.

Satu lagi bentuk pernyataan bersyarat ialah: jika ekspresi1 maka operator1 lain jika ekspresi2 maka operator2 lain operator3. Borang ini hanya menambah urutan "ELSE IF "expression2" THEN "statement2"", menyebabkan "statement2" dilaksanakan jika "expression2" dinilai kepada "true". Segala-galanya sepadan dengan idea anda tentang ini (lihat borang sebelumnya).

Beberapa perkataan tentang sintaks:
Pembinaan asas pernyataan "jika" dalam bash kelihatan seperti ini:
jika [ungkapan];
kemudian
kod jika "ungkapan" adalah benar.
fi

Contoh: contoh asas pernyataan bersyarat jika;..;maka
#!/bin/bash
jika ["foo" = "foo" ]; kemudian

fi

Jika ungkapan di dalam kurungan segi empat sama adalah benar, maka kod yang akan dilaksanakan adalah selepas perkataan "then" dan sebelum perkataan "fi", yang menunjukkan penghujung kod yang akan dilaksanakan apabila syarat dipenuhi.
Contoh: contoh asas pernyataan bersyarat jika;..;maka;...;lain
#!/bin/bash
jika ["foo" = "foo" ]; kemudian
ungkapan gema dinilai kepada benar
lain

fi

Contoh: Pernyataan Bersyarat dengan Pembolehubah
#!/bin/bash
T1="foo"
T2="bar"
jika [ "$T1" = "$T2" ]; kemudian
ungkapan gema dinilai kepada benar
lain
ungkapan gema dinilai kepada palsu
fi
untuk, semasa dan sehingga gelung
Dalam bahagian ini, anda akan menjadi biasa dengan untuk, sementara, dan sehingga gelung.
Gelung for sedikit berbeza daripada rakan sejawatnya dalam bahasa pengaturcaraan lain. Pertama sekali, ia memberi anda keupayaan untuk melakukan tindakan berurutan pada "perkataan" dalam rentetan.
Gelung while melaksanakan sekeping kod jika ungkapan yang diuji adalah benar; dan berhenti jika ia palsu (atau gangguan gelung yang dinyatakan secara eksplisit ditemui dalam kod pelaksana).
Gelung sehingga hampir sama dengan gelung while. Satu-satunya perbezaan ialah kod tersebut dilaksanakan jika ungkapan yang diuji adalah palsu.
Jika anda menganggap bahawa sementara dan sehingga sangat serupa, anda betul.

Contoh untuk gelung

#!/bin/bash
untuk i dalam $(ls); buat
item gema: $i
selesai

Dalam baris kedua kami mewakili i sebagai pembolehubah yang menerima pelbagai nilai yang terkandung dalam $(;ls;).

Jika perlu, baris ketiga mungkin lebih panjang; atau mungkin terdapat beberapa baris sebelum dilakukan (baris ke-4).

"selesai" (baris ke-4) menunjukkan bahawa kod yang menggunakan $i berakhir dan $i diberi nilai baharu.

Skrip ini tidak bertujuan untuk menjadi sangat penting. Penggunaan gelung for yang lebih berguna ialah menggunakannya untuk memilih fail tertentu sahaja dalam contoh sebelumnya.
C-like untuk

fishh mencadangkan menambah borang gelung ini. Ini adalah gelung for, paling serupa dengan gelung for dalam C, Perl, dsb.

#!/bin/bash
untuk i dalam `seq 1 10`;
buat
gema $i
selesai
Contoh gelung while:
#!/bin/bash
KAUNTER=0
manakala [ $KAUNTER -lt 10 ]; buat
echo Kaunter ialah $COUNTER
biarkan KAUNTER=KAUNTER+1
selesai

Skrip ini "meniru" struktur terkenal (dalam C, Pascal, perl, dll.) "untuk".

Contoh sehingga gelung:

#!/bin/bash
KAUNTER=20
sehingga [ $KAUNTER -lt 10 ]; buat
echo KAUNTER $KAUNTER
biarkan COUNTER-=1
selesai

Fungsi

Sama seperti bahasa pengaturcaraan lain, anda boleh menggunakan fungsi untuk mengumpulkan kepingan kod bersama-sama dengan cara yang lebih logik, dan untuk mempraktikkan seni ajaib rekursi.

Pengisytiharan fungsi hanyalah entri my_func ( my_code ) fungsi.

Memanggil fungsi dijalankan dengan cara yang sama seperti memanggil program lain. Anda hanya menulis namanya.

Contoh fungsi
#!/bin/bash
fungsi berhenti (
keluar
}
fungsi hello(
echo Hello!
}
hello
berhenti
echo foo
Baris 2-4 mengandungi fungsi "berhenti". Baris 5-7 mengandungi fungsi "hello". Jika anda tidak memahami proses yang dilakukan oleh skrip ini, cubalah!

Perlu diingatkan bahawa tidak perlu mengisytiharkan fungsi dalam mana-mana susunan tertentu.

Jika anda menjalankan skrip, perhatikan bahawa fungsi "hello" dipanggil dahulu, dan kemudian fungsi "berhenti". Bagi program, ia tidak pernah sampai ke baris ke-10.

Contoh fungsi dengan parameter
#!/bin/bash
fungsi berhenti (
keluar
}
fungsi e (
gema $1
}
Hello
e Dunia
berhenti
echo foo
Skrip ini hampir sama dengan yang sebelumnya. Perbezaan utama ialah fungsi "e". Ia mencetak hujah pertama yang diterimanya. Argumen dalam fungsi diproses dengan cara yang sama seperti argumen yang dihantar ke skrip.

Antara Muka Pengguna

Menggunakan pilih untuk mencipta menu ringkas
#!/bin/bash
OPTIONS="Hello Berhenti"
pilih ikut serta $OPTIONS; buat
jika [ "$opt" = "Berhenti" ]; kemudian
gema selesai
keluar
elif [ "$opt" = "Hello" ]; kemudian
echo Hello World
lain
jelas
echo pilihan buruk
fi
selesai
Jika anda menjalankan skrip ini, anda akan melihat bahawa ia adalah impian pengaturcara untuk menu berasaskan teks. Anda mungkin akan perasan bahawa ini sangat serupa dengan binaan "untuk", tetapi bukannya menggelungkan setiap "perkataan" dalam $OPTIONS, program itu mengundi pengguna.
Menggunakan Barisan Perintah
#!/bin/bash
jika [ -z "$1" ]; kemudian
penggunaan gema: $0 direktori
keluar
fi
SRCD=$1 #SRCD - Direktori Sumber - direktori sumber

tar -cZf $TGTD$DARI $SRCD
Ia harus jelas kepada anda apa yang skrip ini lakukan. Ungkapan dalam pernyataan bersyarat pertama menyemak sama ada program menerima hujah ($1). Jika tidak, ia menamatkan program, memberikan pengguna dengan mesej ralat kecil. Baki bahagian skrip buat masa ini jelas menjelaskan sendiri.

Macam-macam

Membaca input pengguna dengan membaca

Dalam sesetengah kes, mungkin perlu meminta pengguna memasukkan sesuatu. Terdapat pelbagai cara untuk melakukan ini. Satu cara adalah seperti berikut:

#!/bin/bash
echo Sila masukkan nama anda
baca NAMA
echo "Hello $NAME!"

Sebagai alternatif, anda boleh mendapatkan berbilang nilai sekaligus menggunakan baca. Contoh berikut menerangkan perkara ini:
#!/bin/bash
echo "Sila masukkan nama pertama dan nama keluarga anda"
baca FN LN #FN - Nama Pertama - nama; LN - Nama Keluarga - nama keluarga
echo "Hai! $LN, $FN !"

Pengiraan aritmetik

Pada baris arahan (atau shell), cuba taip yang berikut:
gema;1;+;1
Jika anda mengharapkan untuk melihat "2", anda akan kecewa. Apakah yang perlu anda lakukan jika anda memerlukan BASH untuk melakukan pengiraan pada nombor anda? Penyelesaiannya adalah ini:
gema;$((1+1))
Hasilnya, kesimpulannya akan lebih "logik". Tatatanda ini digunakan untuk menilai ungkapan aritmetik. Anda juga boleh melakukannya seperti ini:
gema;$
Jika anda perlu menggunakan pecahan atau matematik yang lebih kompleks, anda boleh menggunakan bc untuk menilai ungkapan aritmetik.
Apabila pengarang menjalankan "echo;$" dalam shell, ia mengembalikan nilai 0. Ini kerana jika bash bertindak balas, ia hanya menggunakan nilai integer. Jika anda menjalankan "echo;3/4|bc;-l", shell akan mengembalikan nilai yang betul 0.75.

carian bash

Daripada mesej daripada mike (lihat bahagian "Penghargaan"):

Anda sentiasa menggunakan #!/bin/bash .. Bolehkah anda berikan contoh cara untuk mengetahui lokasi bash.
Adalah lebih baik untuk menggunakan "locate bash", tetapi locate tidak tersedia pada semua mesin.
"find ./ -name bash" dari direktori root biasanya berfungsi.
Anda boleh menyemak lokasi berikut:
ls -l /bin/bash
ls -l /sbin/bash
ls -l /usr/local/bin/bash
ls -l /usr/bin/bash
ls -l /usr/sbin/bash
ls -l /usr/local/sbin/bash
(pengarang tidak dapat segera memikirkan mana-mana direktori lain... Dia menemui bash di kebanyakan tempat ini pada pelbagai sistem).

Anda juga boleh mencuba "bash yang mana".

Mendapatkan nilai pulangan program

Dalam bash, nilai pulangan program disimpan dalam pembolehubah khas yang dipanggil $?.

Contoh ini menggambarkan cara memintas nilai pulangan program; penulis menganggap bahawa direktori dada tidak wujud (ini juga dicadangkan oleh mike).
#!/bin/bash
cd /dada &> /dev/null
echo rv: $?
cd $(pwd) &> /dev/null
echo rv: $?


Memintas output arahan

Skrip kecil ini membentangkan semua jadual dari semua pangkalan data (dengan andaian anda telah memasang MySQL). Selain itu, anda harus memikirkan cara untuk menukar arahan "mysql" untuk menggunakan nama pengguna dan kata laluan yang sesuai.
#!/bin/bash
DBS=`mysql -uroot -e"tunjukkan pangkalan data"`
untuk b dalam $DBS ;
buat
mysql -uroot -e"tunjukkan jadual daripada $b"
selesai

Fail sumber berbilang

Anda boleh menjalankan berbilang fail menggunakan arahan sumber.

TO-DO__
11. Meja
11.1 Pengendali perbandingan rentetan
(1) s1 = s2
(2) s1 != s2
(3) s1< s2
(4) s1 > s2
(5) -n s1
(6) -z s1
(1) s1 bertepatan dengan s2
(2) s1 tidak bertepatan dengan s2
(3) s1 mengikut abjad mendahului s2 (mengikut tempat semasa)
(4) s1 datang mengikut abjad selepas s2 (mengikut tempat semasa)
(5) s1 mempunyai nilai bukan sifar (mengandungi satu aksara atau lebih)
(6) s1 mempunyai nilai sifar
11.2 Contoh perbandingan rentetan

Membandingkan dua rentetan.
#!/bin/bash
S1="rentetan"
S2="String"
jika [ $S1=$S2 ];
kemudian
echo "S1("$S1") tidak sama dengan S2("$S2")"
fi
jika [ $S1=$S1 ];
kemudian
echo "S1("$S1") sama dengan S1("$S1")"
fi
Pada ketika ini, penulis merasakan perlu untuk memetik teguran daripada e-mel yang diterima daripada Andreas Beck berkenaan penggunaan if [ $1 = $2 ].
Ini bukan idea yang baik, kerana jika sama ada $S1 atau $S2 adalah baris kosong Anda akan menerima ralat sintaks. Adalah lebih baik untuk menggunakan x$1;=;x$2 atau "$1";=;"$2" .
11.3 Operator aritmetik
+
-
*
% (baki)
11.4 Operator perbandingan aritmetik
-lt (<)
-gt (>)
-le (<=)
-ge (>=)
-eq (==)
-ne (!=)
Pengaturcara C hanya perlu memilih operator yang sepadan dengan operator yang dipilih dalam kurungan.

Perintah yang berguna

Bahagian ini telah ditulis semula oleh Kees (lihat bahagian Penghargaan).

Sebahagian daripada arahan ini boleh dikatakan mengandungi bahasa arahan yang lengkap. Hanya asas-asas arahan tersebut dijelaskan di sini. Untuk butiran lanjut, semak dengan teliti halaman manual setiap arahan.
sed (editor strim)
Sed ialah editor bukan interaktif. Daripada menukar fail dengan menggerakkan kursor pada skrin, anda harus menggunakan skrip arahan penyuntingan sed bersama-sama dengan nama fail yang anda edit. Anda juga boleh menganggap sed sebagai penapis. Lihat beberapa contoh:
$sed "s/to_be_replaced/replaced/g" /tmp/dummy
Sed menggantikan rentetan "to_be_replaced" dengan rentetan "replaced" dengan membaca fail /tmp/dummy. Hasilnya dihantar ke output standard (biasanya konsol), tetapi anda juga boleh menambah ">;capture" pada baris di atas agar sed menghantar output ke fail "capture".
$sed 12, 18h /tmp/dummy
Sed memaparkan semua baris kecuali baris 12 hingga 18. Fail asal tidak diubah oleh arahan ini.
awk (manipulasi fail data, perolehan semula teks dan pemprosesan)
Terdapat sebilangan besar pelaksanaan bahasa pengaturcaraan AWK (jurubahasa yang paling biasa adalah gawk daripada projek GNU dan mawk "awk baharu".) Prinsipnya agak mudah: AWK sedang mencari corak; Untuk setiap templat yang sepadan, beberapa tindakan dilakukan.
Pengarang telah mencipta semula fail dummy yang mengandungi baris berikut:
"ujian123
ujian
tteesstt"

$awk "/test/ (print)" /tmp/dummy
ujian123
ujian
Corak yang AWK cari ialah "ujian", dan tindakan yang AWK lakukan apabila ia menemui baris dalam /tmp/dummy dengan subrentetan "ujian" ialah "cetak".
$awk "/test/ (i=i+1) TAMAT (cetak i)" /tmp/dummy
Jika anda sedang mencari berbilang corak, gantikan teks antara petikan dengan "-f;file.awk". Dalam kes ini, anda boleh menulis semua templat dan tindakan dalam fail "file.awk".
grep (mencetak baris yang sepadan dengan corak carian)
Kami telah melihat beberapa arahan grep dalam bab sebelumnya yang memaparkan baris yang sepadan dengan corak. Walau bagaimanapun, grep boleh melakukan lebih banyak lagi.
$grep "cari ini" /var/log/messages -c
Rentetan "cari ini" ditemui 12 kali dalam /var/log/messages.
wc (mengira baris, perkataan dan bait)
Dalam contoh berikut, anda akan melihat bahawa output tidak seperti yang kami harapkan. Dalam kes ini, fail dummy mengandungi teks berikut:
"pengenalan bash
bagaimana untuk menguji fail"
$wc --words --lines --bait /tmp/dummy
2 5 34 /tmp/dummy
wc tidak mengambil berat tentang susunan parameter. Dia selalu membawa mereka keluar prosedur piawai: <число;строк><число;слов><число;байтов><имя;файла>.
sort (mengisih baris fail teks)

Dalam kes ini, fail dummy mengandungi teks berikut:
"b
c
a"
$sort /tmp/dummy
Outputnya kelihatan seperti ini:
a
b
c
Perintah tidak sepatutnya begitu mudah :-)
bc (bahasa pengaturcaraan pengiraan)
bc melakukan pengiraan daripada baris arahan (input daripada fail, tetapi bukan melalui pengalihan atau saluran paip) serta daripada antara muka pengguna. Contoh berikut menunjukkan beberapa arahan. Ambil perhatian bahawa pengarang menggunakan bc dengan pilihan -q untuk menyekat mesej gesaan.
$bc -q
1 == 5
0
0.05 == 0.05
1
5 != 5
0
2 ^ 8
256
persegi(9)
3
manakala (i != 9) (
i = i + 1;
cetak i
}
123456789
berhenti
tput (memulakan terminal atau menanyakan pangkalan data terminfo)
Ilustrasi kecil keupayaan tput:

$tput cawan 10 4
Gesaan arahan akan muncul pada koordinat (y10,x4).
$tput set semula
Skrin dikosongkan dan gesaan muncul di (y1,x1). Ambil perhatian bahawa (y0,x0) ialah sudut kiri atas.
$tputcols
80 Memaparkan bilangan aksara yang mungkin dalam arah x.
Adalah sangat disyorkan untuk membiasakan diri dengan program ini (sekurang-kurangnya). Terdapat sejumlah besar program kecil yang memberi anda peluang untuk melakukan sihir sebenar pada baris arahan.
[Beberapa contoh diambil daripada halaman manual atau Soalan Lazim.]

Lebih banyak skrip

Gunakan arahan kepada semua fail dalam direktori.

Contoh: skrip sandaran yang sangat mudah (lebih cekap)

#!/bin/bash
SRCD="/home/" #SRCD - Direktori Sumber - direktori sumber
TGTD="/var/backups/" #TGTD - Direktori TarGeT - direktori akhir
OF=home-$(tarikh +%Y%m%d).tgz #OF - Fail Output - fail output
tar -cZf $TGTD$DARI $SRCD

Program penamaan semula fail

#!/bin/sh
# renna: menamakan semula beberapa fail menggunakan peraturan khas
# Pengarang - felix hudson Jan - 2000

#Pertama sekali, lihat "mod" berbeza yang ada pada program ini.
#Jika hujah pertama ($1) sesuai, kami melaksanakan bahagian ini
#program dan pergi.

# Semak kemungkinan menambah awalan.
jika [ $1 = p ]; kemudian

#Sekarang mari kita beralih dari pembolehubah mod($1) dan awalan ($2)
awalan=$2 ; syif ; syif

# Mesti menyemak sama ada sekurang-kurangnya satu fail ditentukan.
# Jika tidak, adalah lebih baik untuk tidak melakukan apa-apa daripada menamakan semula yang tidak wujud
# fail!!

jika [$1 = ]; kemudian

keluar 0
fi

# Ini untuk gelung memproses semua fail yang telah kami tentukan
# program.
# Ia melakukan satu penamaan semula setiap fail.
untuk fail dalam $*
buat
mv $(fail) $awalan$fail
selesai

#Selepas ini program telah dikeluarkan.
keluar 0
fi

# Semak syarat penambahan akhiran.
# Jika tidak, bahagian ini hampir sama dengan bahagian sebelumnya;
# sila lihat komen yang terkandung di dalamnya.
jika [ $1 = s ]; kemudian
akhiran=$2 ; syif ; syif
jika [$1 = ]; kemudian
echo "tiada fail ditentukan"
keluar 0
fi
untuk fail dalam $*
buat
mv $(fail) $fail$akhiran
selesai
keluar 0
fi

# Semak keadaan penamaan semula dengan penggantian.
jika [ $1 = r ]; kemudian
syif
# Atas sebab keselamatan, penulis menyertakan bahagian ini supaya tidak merosakkan mana-mana fail jika pengguna
# tidak menentukan perkara yang perlu dilakukan:
jika [ $# -lt 3 ] ; kemudian
echo "Ralat; input yang betul: renna r [ungkapan] [penggantian] fail..."
keluar 0
fi

# Mari lihat maklumat lain
LAMA=$1 ; BARU=$2 ; syif ; syif

# Ini untuk gelung secara berurutan melalui semua fail yang kami
# diberikan kepada program.
# Ia melakukan satu nama semula bagi setiap fail menggunakan program "sed".
# Ini program mudah daripada baris arahan, yang menghuraikan standard
# input dan menggantikan ungkapan biasa dengan rentetan yang diberikan.
# Di sini kami memberikan sed nama fail (sebagai input standard) dan menggantikannya
# teks yang diperlukan.
untuk fail dalam $*
buat
new=`echo $(fail) | sed s/$(LAMA)/$(BARU)/g`
mv $(fail) $baru
selesai
keluar 0
fi
# Jika sampai ke garisan ini bermakna program telah diberikan
# parameter tidak sah. Dalam hal ini, ia harus dijelaskan kepada pengguna bagaimana untuk
# guna
echo "gunakan:"
echo "fail renna p [awalan].."
echo "fail [akhiran] renna.."
echo "fail renna r [ungkapan] [penggantian].."
keluar 0
#selesai!

Program penamaan semula fail (mudah)
#!/bin/bash
#rename.sh
# program penamaan semula mudah

kriteria=$1
re_match=$2
gantikan=$3

Untuk i dalam $(ls *$kriteria*);
buat
src=$i
tgt=$(gema $i | sed -e "s/$re_match/$replace/")
mv $src $tgt
selesai

Jika apa yang berlaku berbeza daripada apa yang anda jangkakan (menyahpepijat)

Bagaimanakah saya boleh menghubungi BASH?

Adalah baik untuk menambah dalam baris pertama

#!/bin/bash -x
Ini akan menghasilkan beberapa maklumat output yang menarik.

Mengenai dokumen

Anda tidak boleh teragak-agak untuk membuat pembetulan, penambahan atau apa-apa lagi yang anda rasa perlu disertakan dalam dokumen ini. Penulis akan cuba mengemas kininya apabila boleh.

Lembaran cheat ini meliputi topik berikut: pengenalan kepada shell, navigasi, arahan asas, pembolehubah persekitaran, penyambung, saluran paip, ubah hala I/O, kebenaran dan kombinasi kekunci.

Bash Shell: Pengenalan

Shell, atau shell, ialah program, dalam kes kami dipanggil "bash," yang merupakan singkatan untuk Bourne Again Shell. Shell menerima arahan anda dan menyampaikannya sistem operasi. Untuk berinteraksi dengan sistem, terminal digunakan, seperti gnome-terminal, eterm, nxterm, dll.

Navigasi

DALAM Fail Linux dan direktori mempunyai organisasi hierarki, iaitu, terdapat direktori awal tertentu yang dipanggil root. Ia mengandungi fail dan subdirektori, yang seterusnya mengandungi fail dan subdirektori mereka sendiri.

pwd

Perintah pwd, singkatan dari cetak direktori kerja, paparan lokasi sekarang dalam struktur direktori.

CD

Perintah cd membolehkan anda menukar ke direktori baharu.

mkdir

Perintah mkdir mencipta direktori baharu dalam direktori semasa.

Perintah Asas

lelaki

Arahan lelaki memaparkan manual arahan. Sebagai contoh, arahan berikut akan memaparkan semua maklumat tentang perintah kucing:

$ lelaki kucing

kucing

Perintah kucing membaca fail yang diluluskan sebagai hujah dan mencetak kandungannya saluran standard pengeluaran. Meluluskan berbilang fail sebagai hujah akan mencetak kandungan bercantum semua fail.

bergema

Perintah gema mencetak argumennya kepada output standard.

$ echo Hello World Hello World

Jika anda memanggil gema tanpa hujah, rentetan kosong akan dicetak.

kepala

Perintah kepala membaca 10 baris pertama bagi mana-mana teks yang diluluskan dan mengeluarkannya ke paip standard. Bilangan baris yang dipaparkan boleh diubah:

$head -50 test.txt

ekor

Perintah ekor berfungsi sama dengan arahan kepala, tetapi membaca baris dari hujung:

$ ekor -50 test.txt

Anda juga boleh melihat baris yang ditambahkan pada fail dalam masa nyata menggunakan bendera -f:

$ tail -f test.txt

kurang

Perintah yang kurang membolehkan anda menavigasi fail atau sekeping teks yang dipindahkan, dalam kedua-dua arah.

$ less test.txt $ ps aux | kurang

Ketahui lebih lanjut tentang tujuan simbol | akan diliputi di bawah dalam bahagian sejarah arahan.

Pintasan papan kekunci biasaPenerangan
GBergerak ke hujung fail
gBergerak ke permulaan fail
:50 Bergerak ke baris 50 fail
qKeluar kurang
/ istilah carianCari rentetan yang sepadan dengan 'istilah carian' di bawah talian semasa
/
?istilah carianMencari baris yang sepadan dengan 'istilah carian' di atas baris semasa
? Beralih ke hasil carian sepadan seterusnya
naikBergerak ke atas satu baris
turunMenggerakkan satu baris ke bawah
pageupBergerak ke atas satu halaman
halaman bawahMengalihkan satu halaman ke bawah

benar

Perintah benar sentiasa mengembalikan sifar sebagai status output untuk menunjukkan kejayaan.

salah

Perintah palsu sentiasa mengembalikan bukan sifar sebagai status output untuk menunjukkan kegagalan.

$?

$? ialah pembolehubah yang mengandungi status keluaran yang terakhir menjalankan arahan. Status biasanya merujuk kepada kod pemulangan program. 0 bermakna pelaksanaan program yang berjaya, sebarang nilai yang lebih besar daripada 0 mencerminkan fakta bahawa beberapa ralat berlaku semasa pelaksanaan. Dengan cara ini, inilah sebabnya dalam bash 0 dianggap benar, dan semua yang bukan 0 adalah palsu:

$true$echo$? 0 $ palsu $ gema $? 1

grep

Perintah grep mencari rentetan yang diluluskan masuk fail yang ditentukan:

$ cat users.txt pengguna:kata laluan pelajar:123 pengguna:kata laluan guru:321 $ grep "fail pelajar`1.txt pengguna:kata laluan pelajar:123

grep juga boleh menerima berbilang fail dan ungkapan biasa untuk menjelaskan format teks.

sejarah

Perintah sejarah memaparkan sejarah baris arahan. Ia biasanya digunakan bersama dengan arahan grep untuk mencari arahan tertentu. Sebagai contoh, kod berikut akan mencari semua arahan yang mengandungi rentetan g++ :

$sejarah | grep g++ 155 g++ fail1.txt 159 g++ fail2.txt

Simbol |. juga digunakan di sini. - ini adalah penghantar (paip) yang dipanggil. Terima kasih kepadanya, anda boleh mengalihkan output satu arahan ke input yang lain - oleh itu, dalam contoh di atas, keseluruhan cerita, yang dalam mod biasa output oleh arahan sejarah terus ke output terminal akan diubah hala ke grep sebagai input. Kami tidak akan melihat output arahan sejarah, tetapi kami akan melihat output arahan grep.

Ini boleh menjadi agak sukar untuk difahami tanpa latihan, jadi uji sendiri dengan arahan ls , history , ps (diterangkan di bawah) yang mengubah hala outputnya ke grep , sed atau kurang sebagai contoh.

eksport

Perintah eksport menetapkan pembolehubah persekitaran untuk dihantar kepada proses anak. Sebagai contoh, ini adalah cara anda boleh menghantar pembolehubah nama dengan pelajar nilai:

$ nama eksport=pelajar

ps

Perintah ps memaparkan maklumat tentang menjalankan proses.

$ ps PID TTY TIME CMD 35346 pts/2 00:00:00 bash

Empat elemen adalah output:

  • ID Proses (PID),
  • jenis terminal (TTY),
  • masa operasi proses (TIME),
  • nama arahan yang memulakan proses (CMD).

awk

Perintah awk mencari dan menggantikan teks dalam fail menggunakan corak yang diberikan: awk "corak (tindakan)" test.txt

wget

Perintah wget memuat turun fail dari Internet dan meletakkannya di dalamnya direktori semasa.

$ wget https://github.com/mikeizbicki/ucr-cs100

nc

ping

Perintah ping menguji sambungan rangkaian.

$ ping google.com PING google.com (74.125.224.34) 56(84) bait data. 64 bait daripada lax17s01-in-f2.1e100.net (74.125.224.34): icmp_req=1 ttl=57 time=7.82 ms --- statistik ping google.com --- 1 paket dihantar, 1 diterima, kehilangan paket 0% , masa 8ms rtt min/avg/maks/mdev = 7.794/8.422/10.792/0.699 ms

Statistik pada penghujung menunjukkan bilangan sambungan yang dibuat sebelum arahan selesai dan masa yang diambil untuk menyelesaikannya.

git

Pembolehubah Persekitaran

Pembolehubah persekitaran dinamakan pembolehubah yang mengandungi nilai yang digunakan oleh satu atau lebih aplikasi.

Pembolehubah PATH mengandungi senarai direktori di mana sistem mencari fail boleh laku.

Pembolehubah HOME mengandungi laluan ke direktori rumah pengguna semasa.

Penyambung

Penyambung membolehkan anda menjalankan berbilang arahan secara serentak.

$ true && echo Hello Hello $ false || echo Hello Hello $ echo Hello ; ls Hello test.txt file1.txt file2.txt

Penghantar

Penghantar, atau paip, membolehkan anda menyambungkan saluran input dan output pasukan yang berbeza. Dalam contoh berikut, output arahan ls akan dihantar ke kepala dan hanya 10 elemen pertama akan dicetak sebagai hasilnya.

$ ls -l | kepala

Ubah hala I/O

Ubah hala keluaran

Untuk ubah hala standard Simbol output > dan >> digunakan.

Sebagai contoh, kod ini akan menyalurkan output ls ke fail dan bukannya ke skrin:

$ ls > files.txt $ cat files.txt file1.cpp sample.txt

Jika fail tidak wujud, ia dicipta, dan jika wujud, ia akan ditimpa. Untuk mengelakkan penulisan ganti, anda harus menggunakan perintah >> - ia menambahkan data ke penghujung fail.

Ubah hala input

Untuk ubah hala keluaran standard, simbol digunakan< . В следующем примере sort берет входные данные из файла, а не с клавиатуры:

$ cat files.txt c b $ sort< files.txt b c

Perintah isihan mencetak kandungan fail ke skrin kerana kami belum mengubah hala output. Ini boleh dilakukan seperti ini:

$sort< files.txt >files_sorted.txt

Ubah hala lanjutan

Menambah & kepada > menghasilkan ubah hala seperti aliran standard keluaran dan aliran ralat. Sebagai contoh, fail test.cpp akan mengeluarkan baris stdout kepada cout dan baris stderr kepada cerr .

$ g++ test.cpp $ ./a.out >& test.txt $ cat test.txt stdout stderr

Jika anda ingin mengeluarkan yang khusus deskriptor fail, anda boleh menetapkan nombornya kepada > .

NamaDeskriptorPenerangan
stdin0 Input standard
stdout1 Keluaran Standard
stderr2 Output Ralat Standard

Sebagai contoh, untuk mengubah hala stderr ke test.txt anda akan melakukan perkara berikut:

$ g++ test.cpp $ ./a.out 2> test.txt stdout $ cat test.txt stderr

Hak akses

Perintah ls -l memaparkan banyak maklumat tentang kebenaran setiap fail:

chmod

Perintah chmod menukar kebenaran fail. Berikut ialah gabungan tipikal bendera untuk menukar hak pengguna tertentu:

Anda boleh memanggil chmod dengan penerangan tentang perkara yang perlu dilakukan pada fail tertentu. Simbol - bermaksud mengeluarkan hak, simbol + bermaksud menambah. Contoh berikut akan menjadikan fail boleh dibaca dan boleh ditulis oleh pemilik dan kumpulan:

$ chmod ug+rw test.txt $ ls -l test.txt -rw-rw---- 1 kumpulan pengguna 1097374 26 Januari 2:48 test.txt

Selain itu, chmod boleh digunakan dengan nombor perlapanan, dengan 1 ialah kehadiran hak, dan 0 ialah ketiadaan:

Rwx = 111 = 7 rw- = 110 = 6 r-x = 101 = 5 r-- = 100 = 4

Perintah seterusnya akan berfungsi sama seperti yang sebelumnya.