Naskah datecp Revisited
Dalam angsuran pertama dari panduan scripting shell kami, kami membuat skrip yang menyalin file ke direktori backup setelah menambahkan tanggal ke akhir namafile.
Samuel Dionne-Riel menunjukkan di komentar bahwa ada cara yang jauh lebih baik untuk menangani referensi variabel kami.
Arguments are space-separated in the bash shell, it will tokenize when there is a space in the resulted expanded command. In your script,
cp $1 $2.$date_formatted
akan berfungsi sebagaimana yang dimaksudkan selama variabel yang diperluas tidak memiliki spasi di dalamnya. Jika Anda memanggil skrip Anda dengan cara ini:
datecp 'my old name' 'my new name'
perluasan akan menghasilkan perintah ini:
cp my new name my old name.the_date
yang sebenarnya memiliki 6 argumen.
Untuk benar mengatasi masalah ini, baris terakhir dari skrip harus:
cp '$1' '$2.$date_formatted'
Seperti yang Anda lihat, mengubah baris skrip kami dari:
cp -iv $1 $2.$date_formatted
untuk:
cp -iv “$1” “$2”.$date_formatted
akan mengurus masalah ini saat menggunakan skrip pada file yang memiliki spasi di nama. Samuel juga menyatakan bahwa ketika menyalin dan menempelkan kode dari situs ini (atau internet pada umumnya) pastikan untuk mengganti tanda garis dan tanda kutip yang tepat untuk "tipografi yang lebih baik" yang sering menggantikannya. Kami juga akan melakukan lebih banyak untuk memastikan kode kami lebih ramah / menempel.;-)
Komentator lain, Myles Braithwaite, memutuskan untuk memperluas skrip kami sehingga tanggalnya akan muncul sebelum ekstensi file. Jadi, bukannya
tastyfile.mp3.07_14_11-12.34.56
kami akan mendapatkan ini:
tastyfile.07_14_11-12.34.56.mp3
yang akhirnya menjadi sedikit lebih nyaman bagi sebagian besar pengguna. Kodenya tersedia di halaman GitHub-nya. Mari kita lihat apa yang dia gunakan untuk memisahkan nama file.
date_formatted=$(date +%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 sedikit mengubah format, tetapi Anda dapat melihat bahwa Myles menyatakan fungsi tanggalnya di Baris 1. Di Baris 2, ia menggunakan perintah “echo” dengan argumen pertama dari skrip untuk menampilkan nama file. Dia menggunakan perintah pipa untuk mengambil output itu dan menggunakannya sebagai masukan untuk bagian selanjutnya. Setelah pipa, Myles memanggil perintah "awk", yang merupakan program pemindaian pola yang kuat. Dengan menggunakan bendera -F, dia memberi tahu perintah bahwa karakter berikutnya (setelah spasi) adalah apa yang akan mendefinisikan "pemisah lapangan". Dalam hal ini, itu adalah periode.
Sekarang, awk melihat file bernama "tastyfile.mp3" sebagai yang terdiri dari dua bidang: "tastyfile" dan "mp3". Terakhir, dia menggunakan
‘{print $NF}’
untuk menampilkan bidang terakhir. Jika file Anda memiliki beberapa periode - sehingga membuat awk melihat beberapa bidang - itu hanya akan menampilkan yang terakhir, yang merupakan ekstensi file.
Di Baris 3, dia membuat variabel baru untuk nama file dan menggunakan perintah “basename” untuk mereferensikan semuanya dalam $ 1 kecuali ekstensi file. Ini dilakukan dengan menggunakan basename dan memberikannya $ 1 sebagai argumennya, lalu menambahkan spasi dan ekstensi file. Ekstensi file ditambahkan secara otomatis karena variabel yang mereferensikan Baris 2. Apa yang akan dilakukan adalah mengambil
tastyfile.mp3
dan mengubahnya menjadi
tastyfile
Kemudian di baris terakhir, Myles menyusun perintah yang akan menghasilkan semuanya secara berurutan. Perhatikan bahwa tidak ada referensi ke $ 2, argumen kedua untuk skrip. Skrip khusus ini akan menyalin file tersebut ke dalam direktori Anda saat ini. Pekerjaan hebat Samuel dan Myles!
Menjalankan Skrip dan $ PATH
Kami juga menyebutkan dalam artikel Dasar kami bahwa skrip tidak diizinkan untuk direferensikan sebagai perintah secara default. Artinya, Anda harus menunjuk ke jalan skrip untuk menjalankannya:
./script
~/bin/script
Namun, dengan menempatkan skrip Anda di ~ / bin /, Anda cukup mengetikkan nama mereka dari mana saja agar mereka dapat menjalankannya.
Para komentator menghabiskan beberapa waktu untuk memperdebatkan betapa tepatnya hal ini, karena tidak ada distro Linux modern yang menciptakan direktori itu secara default. Selain itu, tidak ada yang menambahkannya ke variabel $ PATH secara default, yaitu apa yang diperlukan agar skrip dapat dijalankan seperti perintah. Saya sedikit bingung karena setelah memeriksa variabel $ PATH saya, komentatornya benar, tetapi memanggil skrip masih berfungsi untuk saya. Saya menemukan alasannya: banyak distro Linux modern membuat file khusus di direktori beranda pengguna -.profile.
Mengulangi Perintah Dengan Loops
Mari menuju ke salah satu alat paling berguna di gudang senjata geek untuk menangani tugas yang berulang: loop. Hari ini, kita akan membahas "untuk" loop.
Garis dasar dari for-loop adalah sebagai berikut:
for VARIABLE in LIST; do command1 command2 … commandn done
VARIABEL dapat berupa variabel apa pun, meskipun paling sering huruf kecil "i" digunakan oleh konvensi. DAFTAR adalah daftar barang; Anda dapat menentukan beberapa item (memisahkan mereka dengan spasi), arahkan ke file teks eksternal, atau gunakan tanda bintang (*) untuk menunjukkan file apa pun di direktori saat ini. Perintah yang tercantum diindeks oleh konvensi, jadi lebih mudah untuk melihat penumpukan - menempatkan loop dalam loop (sehingga Anda dapat mengulang saat Anda mengulang).
Karena daftar menggunakan spasi sebagai pembatas - artinya, spasi menandakan perpindahan ke item berikutnya dalam daftar - file yang memiliki spasi dalam nama tidak sangat ramah. Untuk saat ini, mari kita tetap bekerja dengan file tanpa spasi. Mari kita mulai dengan skrip sederhana untuk menampilkan nama-nama file di direktori saat ini. Buat skrip baru di folder ~ / bin / Anda yang berjudul "loopscript". Jika Anda tidak ingat cara melakukan ini (termasuk menandainya sebagai dapat dijalankan dan menambahkan hash bang hack) lihat artikel dasar-dasar skrip bash kami.
Di dalamnya, masukkan kode berikut:
for i in item1 item2 item3 item4 item5 item6; do echo “$i” done
for i in *; do echo “$i” done
for i in $@; do zip archive “$i” done
Untuk loop sangat indah. Sekarang Anda dapat menjalankan fungsi batch pada daftar file. Misalnya, Anda dapat menyalin semua argumen skrip Anda ke dalam arsip zip, memindahkan dokumen asli ke folder yang berbeda, dan secara otomatis mengamankan salinan file zip tersebut ke komputer jarak jauh. Jika Anda mengatur file kunci dengan SSH, Anda bahkan tidak perlu memasukkan kata sandi Anda, dan Anda bahkan dapat memberi tahu skrip untuk menghapus file zip setelah mengunggahnya!
Menggunakan for-loops memudahkan untuk melakukan banyak tindakan untuk semua file dalam direktori. Anda dapat menumpuk berbagai macam perintah bersama-sama dan menggunakan argumen sangat mudah dibuat dan daftar on-the-fly, dan ini hanya puncak gunung es.
Bash scripters, apakah Anda punya saran? Sudahkah Anda membuat skrip yang berguna yang menggunakan loop? Ingin berbagi pemikiran Anda tentang seri ini? Tinggalkan beberapa komentar dan bantulah scripting newbies!