¿Cómo comprobar si todos los argumentos son archivos?

¿Cómo comprobar si todos los argumentos son archivos?

¿Cómo se comprueba si todos los argumentos pasados ​​a un script de shell son archivos? Intenté usar el $@parámetro y -fcon una ifdeclaració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.

información relacionada