Solución:
Falta un espacio requerido entre el soporte y -e
:
#!/bin/bash
if [ -e x.txt ]
then
echo "ok"
else
echo "nok"
fi
Aquí hay un método alternativo que usa ls
:
(ls x.txt && echo yes) || echo no
Si desea ocultar cualquier salida de ls
para que solo veas sí o no, redirigir stdout
y stderr
para /dev/null
:
(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no
El trasfondo de mi recomendación de solución es la historia de un amigo que, hasta bien entrada la segunda semana de su primer trabajo, limpió la mitad de un servidor de compilación. Entonces, la tarea básica es averiguar si existe un archivo, y si es así, eliminémoslo. Pero hay algunos rápidos traicioneros en este río:
-
Todo es un archivo.
-
Los scripts tienen poder real solo si resuelven tareas generales
-
Para ser generales, usamos variables
-
A menudo usamos -f force en los scripts para evitar la intervención manual
-
Y también love -r recursive para asegurarnos de que creamos, copiamos y destruimos de manera oportuna.
Considere el siguiente escenario:
Tenemos el archivo que queremos eliminar: filesexists.json
Este nombre de archivo se almacena en una variable
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
También tenemos una variable de ruta para hacer las cosas realmente flexibles.
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
Así que veamos si -e
hace lo que se supone que debe hacer. ¿Existen los archivos?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Lo hace. Magia.
Sin embargo, ¿qué pasaría si la variable de archivo se evaluara accidentalmente para nuffin ‘
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
¿Qué? Se supone que regresa con un error … Y este es el comienzo de la historia de cómo esa carpeta completa se eliminó por accidente.
Una alternativa podría ser probar específicamente lo que entendemos que es un ‘archivo’
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
Entonces el archivo existe …
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
Entonces, esto no es un archivo y tal vez, no queremos eliminar ese directorio completo
man test
tiene lo siguiente que decir:
-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)