Вы назначаете files
в качестве скалярной переменной вместо переменной массива .
В
files=$HOME/print/*.pdf
Вы назначая некоторую строку , как /home/highsciguy/print/*.pdf
на $files
скаляр (ака строка) переменной.
Использование:
files=(~/print/*.pdf)
или
files=("$HOME"/print/*.pdf)
вместо. Оболочка раскроет этот шаблон глобинга в список путей к файлам и назначит каждый из них элементам $files
массива .
Расширение шара выполняется во время назначения.
Вам не нужно использовать нестандартные функции sh, и вы могли бы использовать свою систему sh
вместо этого bash
, написав это:
#!/bin/sh -
[ "$#" -gt 0 ] || set -- ~/print/*.pdf
for file do
ls -d -- "$file"
done
set
назначить "$@"
массив позиционных параметров.
Другой подход мог бы заключаться в том, чтобы хранить шаблон смещения в скалярной переменной:
files=$HOME/print/*.pdf
И пусть оболочка расширяет глобус во время раскрытия $files
переменной.
IFS= # disable word splitting
for file in $files; do ...
Здесь, поскольку $files
он не заключен в кавычки (что обычно не следует делать), его расширение подвержено разбиению по словам (которое мы здесь отключили) и генерации глобализации / имени файла.
Таким образом, *.pdf
будет расширен список подходящих файлов. Однако, если они $HOME
содержат подстановочные знаки, их тоже можно развернуть, поэтому все же предпочтительнее использовать переменную массива.
files=$*
когда - либо обычно ? Это совершенно неправильно .