Çözüm önerimin arka planı, ilk işinin ikinci haftasına kadar bir yapı sunucusu temizliğini silen bir arkadaşının hikayesidir. Yani temel görev bir dosyanın var olup olmadığını anlamak ve eğer varsa onu silelim. Ama bu nehirde birkaç hain akıntı var:
Her şey bir dosya.
Komut dosyalarının yalnızca genel görevleri çözmeleri durumunda gerçek gücü vardır
Genel olarak değişkenler kullanıyoruz
Manuel müdahaleyi önlemek için genellikle komut dosyalarında -f kuvvetini kullanırız
Ve aşk -r özyinelemeli, yarattığımız, kopyaladığımız ve imha ettiğimizden emin olmak için.
Aşağıdaki senaryoyu düşünün:
Silmek istediğimiz dosyaya sahibiz: filesexists.json
Bu dosya adı bir değişkende saklanır
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
Ayrıca, işleri gerçekten esnek hale getirmek için bir yol değişkenine sahibiz
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
Bakalım -ene gerekiyorsa yapsın. Dosyalar mevcut mu?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Öyle. Sihirli.
Ancak, eğer dosya değişkeni yanlışlıkla nuffin 'olarak değerlendirilirse ne olur?
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Ne? Bir hatayla geri dönmesi gerekiyor ... Ve bu, tüm klasörün yanlışlıkla nasıl silindiği hikayenin başlangıcı.
Bir alternatif, özellikle bir 'dosya' olarak anladığımız şeyleri test etmek olabilir
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
Dosya var ...
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
Bu bir dosya değil ve belki de tüm dizini silmek istemiyoruz
man test şunları söylemek gerekir:
-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)