Panduan Permulaan untuk Shell Scripting 2 For Loops
Jika anda ingin membina kredit geek anda, sertai kami untuk ansuran kedua dalam siri skrip shell kami. Kami mempunyai beberapa pembetulan, beberapa penambahbaikan pada skrip minggu lepas, dan panduan mengenai gelung untuk yang tidak diketahui.
Skrip datecp Revisited
Dalam ansuran pertama panduan skrip shell kami, kami membuat skrip yang menyalin fail ke direktori sandaran selepas menambahkan tarikh pada akhir nama fail.
Samuel Dionne-Riel menegaskan dalam komen-komen bahawa ada cara yang lebih baik untuk mengendalikan rujukan kita.
Argumen adalah ruang yang dipisahkan dalam shell bash, ia akan memberi tokenize apabila terdapat ruang dalam arahan yang diperluas. Dalam skrip anda,
cp $ 1 $ 2. $ date_formatted
akan berfungsi seperti yang diharapkan selagi pemboleh ubah yang diperluaskan tidak mempunyai ruang di dalamnya. Jika anda memanggil skrip anda dengan cara ini:datecp "nama lama saya" "nama baru saya"
pengembangan akan menyebabkan arahan ini:cp nama baru saya name.the_date lama saya
yang sebenarnya mempunyai 6 hujah.Untuk menangani isu ini dengan betul, baris terakhir skrip haruslah:
cp "$ 1" "$ 2. $ date_formatted"
Seperti yang anda lihat, mengubah baris skrip kami dari:
cp -iv $ 1 $ 2. $ date_formatted
kepada:
cp -iv "$ 1" "$ 2". $ date_formatted
akan menjaga masalah ini apabila menggunakan skrip pada fail yang mempunyai ruang pada nama itu. Samuel juga membuat titik bahawa apabila menyalin dan menampal kod dari laman web ini (atau internet pada umumnya) pastikan anda menggantikan garis dan tanda petikan yang betul untuk "typographically better" yang sering menggantikannya. Kami juga akan melakukan lebih banyak lagi untuk memastikan kod kami lebih banyak salinan / tampal mesra. ;-)
Pengulas lain, Myles Braithwaite, memutuskan untuk memperluaskan skrip kami supaya tarikh tersebut akan muncul sebelum pelanjutan fail. Jadi bukan
tastyfile.mp3.07_14_11-12.34.56
kami akan mendapatkan ini:
tastyfile.07_14_11-12.34.56.mp3
yang akhirnya menjadi lebih mudah untuk kebanyakan pengguna. Kodnya boleh didapati di halaman GitHubnya. Mari kita lihat apa yang dia gunakan untuk menarik nama fail.
date_formatted = $ (tarikh +% Y-% m-% d_% H.% M% S)
file_extension = $ (echo "$ 1" | awk -F. 'print $ NF')
file_name = $ (basename $ 1. $ file_extension)cp -iv $ 1 $ file_name- $ date_formatted. $ file_extension
Saya telah menukar pemformatan sedikit, tetapi anda dapat melihat bahawa Myles mengumumkan fungsi tarikhnya dalam Talian 1. Dalam Talian 2, bagaimanapun, dia menggunakan perintah "echo" dengan hujah pertama skrip untuk mengeluarkan nama fail. Dia menggunakan arahan paip untuk mengambil output itu dan menggunakannya sebagai input untuk bahagian seterusnya. Selepas paip, Myles menyeru arahan "awk", yang merupakan program pengimbasan corak yang kuat. Menggunakan bendera -F, dia memberitahu arahan bahawa watak seterusnya (selepas ruang) ialah apa yang akan menentukan "pemisah lapangan". Dalam kes ini, itulah tempoh.
Kini, awk melihat fail bernama "tastyfile.mp3" yang terdiri daripada dua bidang: "tastyfile" dan "mp3". Akhir sekali, dia menggunakannya
'print $ NF'
untuk memaparkan medan terakhir. Sekiranya fail anda mempunyai berbilang tempoh - oleh itu membuat awk melihat berbilang bidang - ia hanya akan memaparkan yang terakhir, iaitu sambungan fail.
Dalam Talian 3, dia membuat pemboleh ubah baru untuk nama fail dan menggunakan arahan "basename" untuk merujuk semuanya dalam $ 1 kecuali sambungan fail. Ini dilakukan dengan menggunakan nama dasar dan memberikannya $ 1 sebagai argumennya, kemudian menambahkan ruang dan ekstensi file. Pelanjutan fail ditambah secara automatik kerana pemboleh ubah yang merujuk Line 2. Apa yang akan dilakukan adalah mengambil
tastyfile.mp3
dan mengubahnya menjadi
tastyfile
Kemudian pada baris terakhir, Myles menyusun perintah yang akan mengeluarkan semua pesanan. Perhatikan bahawa tiada rujukan untuk $ 2, hujah kedua untuk skrip. Skrip khusus ini akan menyalin fail tersebut ke direktori semasa anda. Pekerjaan hebat Samuel dan Myles!
Running Script dan $ PATH
Kami juga menyebut dalam artikel Asas kami bahawa skrip tidak dibenarkan dirujuk sebagai arahan secara lalai. Iaitu, anda perlu menunjuk kepada laluan skrip untuk menjalankannya:
./ skrip
~ / bin / skrip
Tetapi, dengan meletakkan skrip anda dalam ~ / bin /, anda hanya dapat menaip nama mereka dari mana saja untuk membolehkannya berjalan.
Pengulas menghabiskan masa untuk membahaskan betapa betul ini, kerana tidak ada distro Linux moden yang mencipta direktori itu secara lalai. Selain itu, tiada siapa yang menambahkannya kepada pembolehubah $ PATH secara lalai sama ada, yang diperlukan untuk skrip yang dijalankan seperti arahan. Saya agak hairan kerana selepas memeriksa pembolehubah $ PATH saya, commenters betul, tetapi skrip panggilan masih bekerja untuk saya. Saya dapati mengapa: banyak distro Linux moden membuat fail khas dalam direktori rumah pengguna - .profile.
Fail ini dibaca oleh bash (kecuali .bash_profile hadir di direktori pengguna pengguna) dan di bahagian bawah, ada bahagian yang menambahkan ~ / bin / folder ke pembolehubah $ PATH jika ada. Jadi, misteri itu dibersihkan. Untuk seluruh siri ini, saya akan terus meletakkan skrip dalam ~ / bin / direktori kerana ia skrip pengguna dan harus dapat dijalankan oleh pengguna. Dan, nampaknya kita tidak benar-benar perlu mengacaukan dengan pembolehubah $ PATH dengan tangan untuk mendapatkan kerja.
Mengulang Perintah dengan Gelung
Mari kita dapatkan salah satu alat yang paling berguna dalam arsenal geek untuk menangani tugas berulang: gelung. Hari ini, kita akan membincangkan "untuk" gelung.
Garis dasar bagi gelung-gelung adalah seperti berikut:
untuk VARIABLE dalam SENARAI; buat
command1
command2
...
commandn
dilakukan
VARIABLE boleh berubah-ubah, walaupun paling kecil huruf "i" digunakan oleh konvensyen. SENARAI senarai item; anda boleh menentukan berbilang item (memisahkannya dengan ruang), arahkan ke fail teks luaran, atau gunakan asterisk (*) untuk menandakan sebarang fail dalam direktori semasa. Perintah yang disenaraikan diarahkan oleh konvensyen, jadi lebih mudah untuk melihat bersarang - meletakkan gelung di gelung (supaya anda dapat gelung semasa anda gelung).
Kerana senarai menggunakan ruang sebagai pembatas - iaitu, ruang menandakan pindah ke item seterusnya dalam senarai - fail yang mempunyai ruang dalam nama tidak begitu ramah. Buat masa ini, mari kita bekerja dengan fail tanpa ruang. Mula dengan skrip mudah untuk memaparkan nama-nama fail dalam direktori semasa. Buat skrip baru dalam folder ~ / bin / anda yang bertajuk "loopscript". Jika anda tidak ingat bagaimana untuk melakukan ini (termasuk menandakannya sebagai boleh laksana dan menambah hack hash bang) merujuk kepada artikel dasar skrip bash kami.
Di dalamnya, masukkan kod berikut:
untuk i dalam item1 item2 item3 item4 item5 item6; buat
echo "$ i"
dilakukan
Apabila anda menjalankan skrip, anda hanya perlu mendapatkan item senarai sebagai output.
Cukup mudah, kan? Mari kita lihat apa yang berlaku jika kita menukar perkara sedikit demi sedikit. Ubah skrip anda sehingga mengatakan ini:
untuk i *; buat
echo "$ i"
dilakukan
Apabila anda menjalankan skrip ini dalam folder, anda perlu mendapatkan senarai fail yang ia mengandungi sebagai output.
Sekarang, mari kita ubah arahan echo menjadi sesuatu yang lebih berguna - katakan, arahan zip. Iaitu, kami akan menambah fail ke dalam arkib. Dan, mari kita dapatkan beberapa argumen dalam campuran!
untuk saya dalam $ @; buat
arkib zip "$ i"
dilakukan
Ada sesuatu yang baru! "$ @" Ialah pintasan untuk "$ 1 $ 2 $ 3 ... $ n". Dalam erti kata lain, ia adalah senarai penuh semua argumen yang anda nyatakan. Sekarang, lihat apa yang berlaku apabila saya menjalankan skrip dengan beberapa fail input.
Anda boleh melihat fail mana yang ada dalam folder saya. Saya berlari arahan dengan enam hujah, dan setiap fail telah ditambah ke arkib berskala bernama "archive.zip". Mudah, betul?
Untuk gelung cukup indah. Kini anda boleh melaksanakan fungsi kumpulan pada senarai fail. Sebagai contoh, anda boleh menyalin semua hujah skrip anda ke dalam arkib yang dimuatkan, alihkan asal kepada folder lain, dan salin secara automatik mengecas fail zip ke komputer jauh. Jika anda menyediakan fail utama dengan SSH, anda tidak perlu memasukkan kata laluan anda, dan anda juga boleh memberitahu skrip untuk memadam fail zip selepas memuat naiknya!
Menggunakan for-loops memudahkan untuk melakukan banyak tindakan untuk semua fail dalam direktori. Anda boleh menyusun pelbagai arahan bersama dan menggunakan argumen dengan mudah untuk membuat dan senarai dalam penerbangan, dan ini hanya hujung gunung kecil.
Bash scripters, adakah anda mempunyai sebarang cadangan? Adakah anda membuat skrip berguna yang menggunakan gelung? Mahu berkongsi pendapat tentang siri ini? Tinggalkan beberapa komen dan membantu penyebaran skrip lain yang lain!