Фон моєї рекомендації щодо рішення - це історія про друга, який уже на другому тижні своєї першої роботи очистив половину сервера складання. Отже, основне завдання - з’ясувати, чи існує файл, і якщо так, видалимо його. Але на цій річці є кілька підступних порогів:
Все - файл.
Сценарії мають реальну силу лише в тому випадку, якщо вони вирішують загальні завдання
Щоб бути загальним, ми використовуємо змінні
Ми часто використовуємо -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)