¿Cómo se comprueba si todos los argumentos pasados a un script de shell son archivos? Intenté usar el $@
parámetro y -f
con una if
declaración.
Respuesta1
Para probar sitodoLos argumentos son archivos, es más fácil probar si uno de los argumentos esnoun archivo:
for argument do
if [ ! -f "$argument" ]; then
printf 'Not a file: %s\n' "$argument" >&2
exit 1
fi
done
echo 'All arguments are files'
Esto itera sobre todos los parámetros posicionales y prueba cada uno de ellos por turno. Si no se encuentra un archivo, se imprime un error y el código finaliza.
Para investigar todos los argumentos:
for argument do
if [ -f "$argument" ]; then
printf 'Is a file: %s\n' "$argument"
else
printf 'Is not a file: %s\n' "$argument"
fi
done
Esto itera sobre todos los parámetros posicionales y prueba cada uno de ellos, imprimiendo el resultado de la prueba.
Tenga en cuenta que "es un archivo"de hechosignifica "es un archivo normal o un enlace simbólico a un archivo normal". Si desea asegurarse de que no sea un enlace simbólico a un archivo normal, utilice
if [ ! -f "$argument" ] || [ -L "$argument" ]; then
como la prueba en el primer bucle, o
if [ -f "$argument" ] && [ ! -L "$argument" ]; then
como prueba en el segundo bucle.
La primera línea del bucle también podría escribirse
for argument in "$@"; do
... pero la gente tiende a olvidarse de las comillas dobles $@
y, de todos modos, el bucle en la parte superior es más corto de escribir.