Estás asignando files
como una variable escalar en lugar de una variable de matriz .
En
files=$HOME/print/*.pdf
Estás asignando una cadena similar /home/highsciguy/print/*.pdf
a la $files
variable escalar (también conocida como cadena).
Utilizar:
files=(~/print/*.pdf)
o
files=("$HOME"/print/*.pdf)
en lugar. El shell expandirá ese patrón global en una lista de rutas de archivo y asignará cada una de ellas a los elementos de la $files
matriz .
La expansión del globo se realiza en el momento de la asignación.
No tiene que usar funciones sh no estándar, y puede usar las de su sistema en sh
lugar de bash
aquí escribiéndolas:
#!/bin/sh -
[ "$#" -gt 0 ] || set -- ~/print/*.pdf
for file do
ls -d -- "$file"
done
set
es asignar la "$@"
matriz de parámetros posicionales.
Otro enfoque podría haber sido almacenar el patrón globbing en una variable escalar:
files=$HOME/print/*.pdf
Y haga que el shell expanda el glob en el momento en $files
que se expande la variable.
IFS= # disable word splitting
for file in $files; do ...
Aquí, debido a $files
que no se cita (lo que normalmente no se debe hacer), su expansión está sujeta a la división de palabras (que hemos desactivado aquí) y la generación de nombres de archivo / globbing.
Por lo tanto *.pdf
, se expandirá a la lista de archivos coincidentes. Sin embargo, si $HOME
contuviera caracteres comodín, también podrían expandirse, por lo que todavía es preferible usar una variable de matriz.
files=$*
siempre usual ? Eso está completamente mal .