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
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
Kami juga memiliki variabel path untuk membuat semuanya benar-benar fleksibel
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
Jadi mari kita lihat apakah -emelakukan apa yang seharusnya. Apakah file-file itu ada?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Itu benar. Sihir.
Namun, apa yang akan terjadi, jika variabel file tidak sengaja dievaluasi menjadi nuffin '
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
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'
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
Jadi file itu ada ...
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
Jadi ini bukan file dan mungkin, kami tidak ingin menghapus seluruh direktori itu
man test memiliki yang berikut untuk dikatakan:
-b FILE
FILE exists and is block special
-c FILE
FILE exists and is character special
-d FILE
FILE exists and is a directory
-e FILE
FILE exists
-f FILE
FILE exists and is a regular file
...
-h FILE
FILE exists and is a symbolic link (same as -L)