Saya datang dengan yang dasar untuk membantu mengotomatiskan proses menghapus sejumlah folder karena tidak diperlukan.
#!/bin/bash
rm -rf ~/myfolder1/$1/anotherfolder
rm -rf ~/myfolder2/$1/yetanotherfolder
rm -rf ~/myfolder3/$1/thisisafolder
Ini dibangkitkan seperti ini:
./myscript.sh <{id-number}>
Masalahnya adalah jika Anda lupa mengetik id-number
(seperti yang saya lakukan tadi) , maka itu berpotensi menghapus banyak hal yang sebenarnya tidak ingin Anda hapus.
Adakah cara untuk menambahkan bentuk validasi apa pun ke parameter baris perintah? Dalam kasus saya, alangkah baiknya untuk memeriksa bahwa a) ada satu parameter, b) numerik, dan c) folder itu ada; sebelum melanjutkan dengan skrip.
sumber
The
sh
solusi denganBrian Campbell
, sementara yang mulia dan baik dieksekusi, memiliki beberapa masalah, jadi saya pikir saya akan memberikan saya sendiribash
solusi.Masalah dengan yang
sh
satu:~/foo
tidak meluas ke direktori beranda Anda di dalam heredocs. Dan tidak juga ketika dibacakan olehread
pernyataan atau dikutip dalamrm
pernyataan itu. Artinya Anda akan mendapatkanNo such file or directory
error.grep
dan semacamnya untuk operasi dasar adalah daft. Terutama bila Anda menggunakan cangkang jelek untuk menghindari beban bash yang "berat".echo
.sh
dapat mengatasinya - itulah sebabnya saya hampir selalu lebih sukabash
, ini jauh lebih antipeluru & lebih sulit untuk dieksploitasi bila digunakan dengan baik).Sementara, ya, menggunakan
/bin/sh
untuk hashbang Anda berarti Anda harus menghindaribash
isme dengan cara apa pun, Anda dapat menggunakan semuabash
isme yang Anda suka, bahkan di Ubuntu atau yang lainnya ketika Anda jujur dan meletakkannya#!/bin/bash
di atas.Jadi, inilah
bash
solusi yang lebih kecil, lebih bersih, lebih transparan, mungkin "lebih cepat", dan lebih tahan peluru.$1
di sekitarrm
pernyataan itu!-d
cek juga akan gagal jika$1
kosong, jadi itu dua cek dalam satu.=~
dalam bash, Anda harus meletakkan ekspresi reguler dalam variabel. Bagaimanapun, gumpalan seperti milik saya selalu lebih disukai dan didukung di lebih banyak versi bash.sumber
$1 != *[^0-9]*
pesta potongan globbing itu spesifik?Saya akan menggunakan bash
[[
:Saya menemukan faq ini sebagai sumber informasi yang baik.
sumber
Tidak antipeluru seperti jawaban di atas, namun tetap efektif:
sumber
Gunakan
set -u
yang akan menyebabkan referensi argumen yang tidak disetel segera gagal dalam skrip.Silakan, lihat artikel: Menulis Skrip Shell Bash yang Kuat - David Pashley.com .
sumber
Halaman manual untuk test (
man test
) menyediakan semua operator yang tersedia yang dapat Anda gunakan sebagai operator boolean di bash. Gunakan tanda tersebut di awal skrip (atau fungsi) Anda untuk validasi input seperti yang Anda lakukan dalam bahasa pemrograman lainnya. Sebagai contoh:sumber
Gunakan '-z' untuk menguji string kosong dan '-d untuk memeriksa direktori.
sumber
Anda dapat memvalidasi poin a dan b secara kompak dengan melakukan sesuatu seperti berikut:
Yang memberi kita ...
Metode ini akan bekerja dengan baik di sh.
sumber
validasi argumen Bash satu liner, dengan dan tanpa validasi direktori
Berikut beberapa metode yang berhasil untuk saya. Anda dapat menggunakannya di namespace skrip global (jika di namespace global, Anda tidak dapat mereferensikan variabel builtin fungsi)
cepat dan kotor satu liner
keluaran:
Fancier - nama fungsi suplai dan penggunaan
keluaran:
Tambahkan logika validasi kompleks tanpa mengacaukan fungsi Anda saat ini
Tambahkan baris berikut di dalam fungsi atau skrip yang menerima argumen.
Anda kemudian dapat membuat fungsi validasi yang melakukan sesuatu seperti
dan fungsi die yang membatalkan skrip jika gagal
Untuk argumen tambahan, cukup tambahkan baris tambahan, yang mereplikasi format.
sumber
Posting lama tapi saya pikir saya bisa berkontribusi.
Sebuah skrip bisa dibilang tidak diperlukan dan dengan beberapa toleransi terhadap kartu liar dapat dilakukan dari baris perintah.
liar di mana saja yang cocok. Mari kita hapus kemunculan sub "folder"
Shell melakukan iterasi. Mari hapus folder pra dan posting tertentu dengan satu baris
Shell iterated + var (BASH diuji).
sumber