Tłem dla mojej rekomendacji rozwiązania jest historia znajomego, który w drugim tygodniu swojej pierwszej pracy wyczyścił pół serwera kompilacji. Więc podstawowym zadaniem jest dowiedzieć się, czy plik istnieje, a jeśli tak, usuńmy go. Ale na tej rzece jest kilka zdradliwych bystrzy:
Wszystko jest plikiem.
Skrypty mają prawdziwą moc tylko wtedy, gdy rozwiązują ogólne zadania
Mówiąc ogólnie, używamy zmiennych
Często używamy -f force w skryptach, aby uniknąć ręcznej interwencji
A także miłość -r rekurencyjna, aby mieć pewność, że tworzymy, kopiujemy i niszczymy w odpowiednim czasie.
Rozważ następujący scenariusz:
Mamy plik, który chcemy usunąć: filesexists.json
Ta nazwa pliku jest przechowywana w zmiennej
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
Mamy również zmienną ścieżki, aby uczynić rzeczy naprawdę elastycznymi
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
Zobaczmy więc, czy -e
robi to, co powinien. Czy pliki istnieją?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
To robi. Magia.
Jednak co by się stało, gdyby zmienna pliku została przypadkowo oceniona jako nuffin '
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Co? Ma powrócić z błędem ... I to jest początek historii, jak cały ten folder został przypadkowo usunięty
Alternatywą może być przetestowanie pod kątem tego, co rozumiemy jako „plik”
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
Więc plik istnieje ...
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
Więc to nie jest plik i być może nie chcemy usuwać całego katalogu
man test
ma do powiedzenia:
-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)