Estoy tratando de escribir un script extremadamente simple en Ubuntu que me permita pasarlo ya sea un nombre de archivo o un directorio, y poder hacer algo específico cuando es un archivo, y algo más cuando es un directorio. El problema que tengo es cuando el nombre del directorio, o probablemente también los archivos, tiene espacios u otros caracteres escapables están en el nombre.
Aquí está mi código básico a continuación, y un par de pruebas.
#!/bin/bash
PASSED=$1
if [ -d "${PASSED}" ] ; then
echo "$PASSED is a directory";
else
if [ -f "${PASSED}" ]; then
echo "${PASSED} is a file";
else
echo "${PASSED} is not valid";
exit 1
fi
fi
Y aquí está el resultado:
andy@server~ $ ./scripts/testmove.sh /home/andy/
/home/andy/ is a directory
andy@server~ $ ./scripts/testmove.sh /home/andy/blah.txt
/home/andy/blah.txt is a file
andy@server~ $ ./scripts/testmove.sh /home/andy/blah\ with\ a\ space.txt
/home/andy/blah with a space.txt is not valid
andy@server~ $ ./scripts/testmove.sh /home/andy\ with\ a\ space/
/home/andy with a space/ is not valid
Todos esos caminos son válidos y existen.
if
- Laselse
construcciones en Bash también son compatibleselif
. Solo para tu información.Respuestas:
Eso debería funcionar. No estoy seguro de por qué está fallando. Estás citando tus variables correctamente. ¿Qué sucede si usa este script con doble
[[
]]
?Los corchetes dobles son una extensión de bash para
[ ]
. No requiere que se citen variables, ni siquiera si contienen espacios.También vale la pena intentarlo:
-e
para probar si existe una ruta sin probar qué tipo de archivo es.fuente
Al menos escribe el código sin el árbol tupido:
Cuando pongo eso en un archivo "xx.sh" y creo un archivo "xx sh", y lo ejecuto, obtengo:
Dado que tiene problemas, debe depurar el script agregando:
Esto le mostrará lo que
ls
piensa sobre los nombres que le pasa al script.fuente
Usar el comando "archivo" puede ser útil para esto:
Ejemplos de salida:
FYI: las respuestas anteriores funcionan pero puedes usar -s para ayudar en situaciones extrañas al buscar primero un archivo válido:
fuente
-s
busca un archivo no vacío, uno con un tamaño distinto de cero)? ¿Y no imprimirá ningún diagnóstico para un bloque especial, carácter especial, FIFO, etc.? Los enlaces simbólicos probablemente resuelven lo que está en el otro extremo del enlace; los enlaces simbólicos rotos son más problemáticos.--brief
bandera defile
. Simplemente saledirectory
cuando es.Uso
-f
y-d
encendido/bin/test
:fuente
test
normalmente es un shell incorporado, aunque generalmente también hay un ejecutable como/bin/test
, y también/bin/[
.)Una solución más elegante
fuente
if [ -f "$x" ]
.fuente
Esto debería funcionar:
fuente
fuente
Un trazador de líneas
el resultado es verdadero (0) (dir) o verdadero (0) (archivo) o falso (1) (ninguno)
fuente
touch bob
conmkdir bob
, obtengo el resultado:dir
yfile
en dos líneas.