Можете ли вы вспомнить стандартную утилиту Unix, которая ведет себя так, как вы описываете? (Нет, не могу.) Это говорит о том, что вы немного не в своей цели.
Тестирование -f "$1"
и -d "$1"
не является традиционным, но если ваш скрипт работает только с каталогами, возможно, это имеет смысл.
В конечном счете, я думаю, что вам нужен такой интерфейс, как:
your_cmd [-f argumentlist] [file ...]
Явный, но необязательный -f argumentlist
позволяет указать файл для чтения в командной строке. В противном случае файлы, указанные в командной строке, обрабатываются, если только нет таких аргументов, и в этом случае имена файлов, которые должны быть обработаны, считываются из стандартного ввода. Это намного ближе к обычной организации. Мы можем обсудить обработку имен файлов с пробелами и переводами строк в именах в другой раз.
Ядро вашего кода будет написано для принятия / обработки по одному имени файла за раз. Это может быть записано как функция оболочки, которая позволяет максимально использовать повторно.
while getopts f: opt
do
case $opt in
(f) while read file; do shell_function $file; done < $OPTARG; exit 0;;
(*) : Error handling etc;;
esac
done
shift $(($OPTIND - 1))
case $# in
(0) while read file; do shell_function $file; done; exit 0;;
(*) for file in "$@"; do shell_function $file; done; exit 0;;
esac
Не очень сложно назвать варианты этого. Это также сносно компактно.