Обоснованием моей рекомендации по решению является история друга, который на второй неделе своей первой работы вытер половину сервера сборки. Итак, основная задача - выяснить, существует ли файл, и если да, давайте его удалим. Но на этой реке есть несколько коварных порогов:
Все это файл.
Скрипты имеют реальную силу, только если они решают общие задачи
В общем, мы используем переменные
Мы часто используем -f force в скриптах, чтобы избежать ручного вмешательства
А также люблю -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
Оно делает. Магия.
Однако, что произойдет, если переменная файла будет случайно оценена как nuffin '
<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)