คำแนะนำในการแก้ไขปัญหาเบื้องหลังของฉันคือเรื่องราวของเพื่อนที่เข้าสู่สัปดาห์ที่สองของงานแรกของเขาเช็ดครึ่งงานสร้างเซิร์ฟเวอร์ที่สะอาด ดังนั้นงานพื้นฐานคือการพิจารณาว่ามีไฟล์อยู่หรือไม่ถ้าอย่างนั้นเราจะลบมันทิ้ง แต่มีกระแสน้ำเชี่ยวที่เป็นอันตรายอยู่เล็กน้อยในแม่น้ำนี้:
ทุกอย่างเป็นไฟล์
สคริปต์มีพลังที่แท้จริงก็ต่อเมื่อพวกเขาแก้ไขงานทั่วไป
โดยทั่วไปเราใช้ตัวแปร
เรามักจะใช้ -f บังคับในสคริปต์เพื่อหลีกเลี่ยงการแทรกแซงด้วยตนเอง
และยังรัก -r ซ้ำเพื่อให้แน่ใจว่าเราสร้างคัดลอกและทำลายในเวลาที่เหมาะสม
พิจารณาสถานการณ์สมมติต่อไปนี้:
เรามีไฟล์ที่เราต้องการลบ: filesexists.json
ชื่อไฟล์นี้ถูกเก็บไว้ในตัวแปร
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
เรายังมีตัวแปรพา ธ เพื่อทำให้สิ่งต่างๆมีความยืดหยุ่น
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
งั้นลองดูว่า-e
ทำตามที่ควรจะเป็นหรือไม่ มีไฟล์อยู่หรือไม่
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
มันทำ มายากล.
อย่างไรก็ตามจะเกิดอะไรขึ้นถ้าตัวแปรไฟล์ได้รับการประเมินโดยไม่ตั้งใจให้เป็นนัฟฟิน
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
อะไร? มันควรจะกลับมาพร้อมกับข้อผิดพลาด ... และนี่คือจุดเริ่มต้นของเรื่องราวที่ว่าโฟลเดอร์ทั้งหมดถูกลบโดยไม่ตั้งใจ
ทางเลือกอื่นอาจเป็นการทดสอบเฉพาะสิ่งที่เราเข้าใจว่าเป็น 'ไฟล์'
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
ดังนั้นไฟล์ที่มีอยู่ ...
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
ดังนั้นนี่ไม่ใช่ไฟล์และบางทีเราไม่ต้องการลบไดเรกทอรีทั้งหมด
man test
มีดังต่อไปนี้จะพูดว่า:
-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)