Ik wil graag een shellscript schrijven dat controleert of een bepaald bestand, archived_sensor_data.json
, bestaat, en zo ja, verwijdert. Volg http://www.cyberciti. biz/tips/find-out-if-file-exists-with-conditional-expressions.html, ik heb het volgende geprobeerd:
[-e archived_sensor_data.json] && rm archived_sensor_data.json
Dit geeft echter een foutmelding
[-e: command not found
wanneer ik het resulterende script test_controller
probeer uit te voeren met de opdracht ./test_controller
. Wat is er mis met de code?
Antwoord 1, autoriteit 100%
Je mist een vereiste spatie tussen de haakjes en -e
:
#!/bin/bash
if [ -e x.txt ]
then
echo "ok"
else
echo "nok"
fi
Antwoord 2, autoriteit 11%
Hier is een alternatieve methode die ls
gebruikt:
(ls x.txt && echo yes) || echo no
Als je uitvoer van ls
wilt verbergen zodat je alleen ja of nee ziet, stuur dan stdout
en stderr
om naar /dev/null
:
(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no
Antwoord 3, autoriteit 3%
De achtergrond van mijn oplossingsaanbeveling is het verhaal van een vriend die tot ver in de tweede week van
Zijn eerste baan, veegde een halve build-server schoon. Dus de basistaak is om erachter te komen als een bestand bestaat,
En als dat het geval is, laten we het verwijderen. Maar er zijn een paar verraderlijke stroomversnellingen op deze rivier:
-
Alles is een bestand.
-
Scripts hebben alleen echt vermogen als ze algemene taken
-
Om algemeen te zijn, gebruiken we variabelen
-
We gebruiken vaak -F Force in scripts om handmatige interventie
-
en ook love -r recursief om ervoor te zorgen dat we tijdig maken, kopiëren en vernietigen.
oplossen
te voorkomen
Overweeg het volgende scenario:
We hebben het bestand dat we willen verwijderen: filesexists.json
Deze bestandsnaam wordt opgeslagen in een variabele
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
We hebben ook een padvariabele om dingen echt flexibel te maken
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
Dus laten we eens kijken of -e
doet wat het is verondersteld. Bestaan de bestanden?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
het doet. Magie.
Wat echter zou gebeuren, als de variabele van het bestand per ongeluk wordt geëvalueerd naar Nuffin ‘
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Wat? Het wordt verondersteld terug te keren met een foutmelding … en dit is het begin van het verhaal hoe dat volledig
Map is per ongeluk verwijderd
Een alternatief kan zijn om specifiek te testen voor wat we begrijpen als een ‘bestand’
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
Dus het bestand bestaat …
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
Dus dit is geen bestand en misschien willen we die volledige directory
niet verwijderen
man test
Heeft het volgende om te zeggen:
-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)
Antwoord 4, Autoriteit 2%
Intern, moet de RM-opdracht toch testen voor bestandsbestand,
Dus waarom een andere test toevoegen? Gewoon uitgave
rm filename
en het zal daarna weg zijn, of het nu was of niet.
Gebruik RM -F Is u geen berichten over niet-bestaande bestanden.
Als u een actie moet ondernemen als het bestand niet bestaat, moet u voor uzelf testen. Op basis van uw voorbeeldcode is dit in dit geval niet het geval.
Antwoord 5
Als je een NFS gebruikt, is “test” een betere oplossing, omdat je er een time-out aan kunt toevoegen voor het geval je NFS niet werkt:
time timeout 3 test -f
/nfs/my_nfs_is_currently_down
real 0m3.004s <<== timeout is taken into account
user 0m0.001s
sys 0m0.004s
echo $?
124 <= 124 means the timeout has been reached
Een “[ -e my_file ]” constructie zal bevriezen totdat de NFS weer functioneel is:
if [ -e /nfs/my_nfs_is_currently_down ]; then echo "ok" else echo "ko" ; fi
<no answer from the system, my session is "frozen">
Antwoord 6
U kunt ook stat
:
. gebruiken
stat /
File: /
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd01h/64769d Inode: 2 Links: 26
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2009-01-01 02:00:00.000000000 +0200
Modify: 2009-01-01 02:00:00.000000000 +0200
Change: 2009-01-01 02:00:00.000000000 +0200
Birth: -
Op een pad dat niet bestaat, krijg je:
stat /aaa
stat: cannot stat '/aaa': No such file or directory