Saya ingin menulis skrip shell yang memeriksa apakah file tertentu archived_sensor_data.json
,, ada, dan jika demikian, menghapusnya. Mengikuti http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html , saya sudah mencoba yang berikut ini:
[-e archived_sensor_data.json] && rm archived_sensor_data.json
Namun, ini menimbulkan kesalahan
[-e: command not found
ketika saya mencoba menjalankan test_controller
skrip yang dihasilkan menggunakan ./test_controller
perintah. Apa yang salah dengan kode tersebut?
Jawaban:
Anda kehilangan ruang yang diperlukan antara braket dan
-e
:sumber
[ -e archived_sensor_data.json ] && rm archived_sensor_data.json
. Skripnya sepertinya berfungsi sekarang.if [ -e "$1" ]
(argumen input nama file).Berikut adalah metode alternatif menggunakan
ls
:Jika Anda ingin menyembunyikan output apa pun dari
ls
sehingga Anda hanya melihat ya atau tidak, arahkan ulangstdout
danstderr
ke/dev/null
:sumber
ls
berhasil, ada file seperti itu, jika tidak, tidak ada". Jikals
gagal, itu tidak berarti file itu hilang. Mungkin ada beberapa kesalahan lainnya. Misalnya, buat file dalam direktori yang dimiliki oleh root dan coba lakukan dils
bawah pengguna biasa. Ini akan gagal denganPermission denied
, yang tidak setara dengan file yang tidak ada.Latar belakang untuk rekomendasi solusi saya adalah kisah seorang teman yang, memasuki minggu kedua pekerjaan pertamanya, menghapus setengah build-server clean. Jadi tugas dasarnya adalah mencari tahu apakah ada file, dan jika demikian, mari kita hapus. Tetapi ada beberapa jeram berbahaya di sungai ini:
Semuanya adalah file.
Script memiliki kekuatan nyata hanya jika mereka menyelesaikan tugas-tugas umum
Untuk menjadi umum, kami menggunakan variabel
Kami sering menggunakan -f force dalam skrip untuk menghindari intervensi manual
Dan juga suka -r rekursif untuk memastikan kami membuat, menyalin, dan menghancurkan tepat waktu.
Pertimbangkan skenario berikut:
Kami memiliki file yang ingin kami hapus: filesexists.json
Nama file ini disimpan dalam variabel
Kami juga memiliki variabel path untuk membuat semuanya benar-benar fleksibel
Jadi mari kita lihat apakah
-e
melakukan apa yang seharusnya. Apakah file-file itu ada?Itu benar. Sihir.
Namun, apa yang akan terjadi, jika variabel file tidak sengaja dievaluasi menjadi nuffin '
Apa? Seharusnya kembali dengan kesalahan ... Dan ini adalah awal dari cerita bagaimana seluruh folder itu terhapus secara tidak sengaja
Alternatifnya bisa dengan menguji secara khusus untuk apa yang kita pahami sebagai 'file'
Jadi file itu ada ...
Jadi ini bukan file dan mungkin, kami tidak ingin menghapus seluruh direktori itu
man test
memiliki yang berikut untuk dikatakan:sumber
Secara internal, perintah rm harus menguji keberadaan file,
jadi mengapa menambahkan tes lain? Hanya masalah
dan itu akan hilang setelah itu, apakah itu ada atau tidak.
Gunakan rm -f adalah Anda tidak ingin ada pesan tentang file yang tidak ada.
Jika Anda perlu mengambil tindakan jika file TIDAK ada, maka Anda harus mengujinya sendiri. Berdasarkan kode contoh Anda, ini tidak terjadi dalam kasus ini.
sumber
Jika Anda menggunakan NFS, "tes" adalah solusi yang lebih baik, karena Anda dapat menambahkan batas waktu untuk itu, jika NFS Anda turun:
Konstruk "[-e my_file]" akan membeku sampai NFS berfungsi kembali:
sumber
test
dan[
identik. Anda dapat menggunakantimeout
dengan[
juga, dantest
juga membeku jika hang NFS.