Dapatkah seseorang tolong bantu saya memahami segmen kode berikut?
set -- ${BACKUPDIR}/backup-???.tgz
lastname=${!#}
backupnr=${lastname##*backup-}
backupnr=${backupnr%%.*}
backupnr=${backupnr//\?/0}
backupnr=$[10#${backupnr}]
Saya menemukannya di skrip cadangan ini https://wiki.ubuntuusers.de/Skripte/inkrementelles_Backup/ di mana ia digunakan untuk mendapatkan nomor nama file dari cadangan yang disimpan terakhir. Nama file cadangan adalah "backup-ccc.tgz" di mana ccc adalah angka tiga digit yang bertambah setiap kali cadangan baru dibuat.
Saya mengerti baris tiga dan empat mereka memotong sisa nama file sehingga hanya bagian yang diperlukan dengan nomor yang tersisa. Yang tidak saya dapatkan adalah bagaimana dua baris pertama bekerja. Saya membaca halaman manual set tetapi sekarang saya lebih bingung daripada sebelumnya. Apa yang dilakukan perintah set -- filename
? Juga untuk apa tepatnya opsi $ {! #}, Yang disimpan dalam nama belakang. Saya pikir $ {} adalah untuk menentukan parameter yang diberikan, tetapi parameter mana yang dipilih! # Tunjuk ke?
Kedua saya tidak mengerti mengapa saya membutuhkan perintah di baris 5. Seperti yang saya pahami, ini digunakan untuk mengganti semua tanda tanya dengan 0 yang disimpan dalam variabel backupnr, tetapi mengapa ini dilakukan? Jika belum ada kesalahan dalam perintah sebelum backupnr harus berupa angka tiga digit, jika ada kesalahan dan konten variabel rusak, Anda tidak bisa tahu apa nilai aktual backupnr. Jadi jika saya ingin memindai korupsi, mengapa saya tidak memindai semua yang bukan angka, tetapi hanya untuk tanda tanya? Apakah ini mungkin terkait dengan apa yang terjadi di dua baris pertama?
sumber
set
, saya akan membuat parameter posisi baru, yang akan selalu memiliki indeks dari parameter yang sudah ada terakhir yang bertambah satu? Tetapi mengapa penulis menggunakanset -- ${BACKUPDIR}/backup-???.tgz
dan bukan hanyaset ${BACKUPDIR}/backup-???.tgz
tanpa -?BACKUPDIR
mungkin mengandung.set
juga dapat digunakan untuk mengatur pilihan shell (set -e
,set -f
, dll). Agar aman, ia--
mengatakanset
untuk berhenti memperlakukan argumen yang tersisa sebagai opsi otset
.