Как использовать подстановочный знак с getopts в скрипте bash? - PullRequest
1 голос
/ 26 января 2012

У меня есть сценарий bash, в котором я хочу принять некоторые необязательные входные аргументы, за которыми следует либо имя файла, либо спецификация файла с подстановочными знаками.

Если я бегу getopts_problem.sh -td *.txt скрипт успешно выводит список файлов .txt в текущем каталоге:

файл - readme.txt letter_to_editor.txt someotherfile.txt

Если я бегу getopts_problem.sh -td *.ABC скрипт выводит

файл * .ABC

В текущем каталоге нет файлов с расширением ".ABC". По какой-то причине сценарий интерпретирует «* .ABC» как имя файла. Как я могу заставить скрипт распознавать "* .ABC" как выражение имени файла, которое нужно развернуть, а не как фактическое имя файла? Код выглядит следующим образом:

# !/bin/sh
doDry=0
doTimestamp=0

while getopts ":dt" OPT;
do
   case $OPT in
      d ) doDry=1 ;;
      t ) doTimestamp=1 ;;
      ? ) echo 'Bad options used. '
          exit 1 ;;
    esac
done

shift $(($OPTIND - 1))
fileList=$@

for file in "$fileList"
do
  echo file is $file
done

exit 0

1 Ответ

2 голосов
/ 26 января 2012

Шаблоны подстановочных знаков расширяются на bash перед выполнением сценария.Не оболочка, которая интерпретирует скрипт, а та, из которой вы его запускаете.Сохраняет ли он шаблон, ничего не передает или терпит неудачу, зависит от nullglob, failglob и некоторых таких параметров (см. man bash).

Кроме того, в for file in "$fileList" кавычки явно указывают оболочке not чтобы раскрыть переменную.

...