Вопросы по поводу понимания шаблона с использованием гетентов Bash

Я попытался использовать подстановку параметров, которая показалась мне самым простым путем

Это самый простой способ (просто имейте в виду, что, как следует из названия - и как указано в комментарии, оболочка расширяет параметр / переменную );
используйте $ {var% - *} для (неохотно) удаления суффикса (в данном случае начиная с последнего - ):

for f in ./*-uniq.tar.gz
do
printf %s\\n "${f%-*}"   
done

или $ {var: offset: length} чтобы удалить последние N символов (где длина - отрицательное целое число):

for f in ./*-uniq.tar.gz
do
printf %s\\n "${f:0:-12}"
done
0
22.11.2018, 14:32
2 ответа

Для этого скрипта требуется как минимум один аргумент, в противном случае он отображает информацию об использовании. Должно быть echo $USAGE >&2, так как это ошибка. Другие скрипты могут работать с нулевыми аргументами, поэтому вам придется модифицировать. Так же, как некоторые не принимают аргумент i.

"?" против*

Да, они разные:

  • "?"говорит кейсу искать ?. Это то, что возвращает getopts, когда находит опцию, которую не ожидает (недопустимая опция ).
  • *говорит случай, сделайте это, если вы не найдете другого соответствия. Этого не должно быть, но может. Вероятно, это указывает на ошибку в getopts или, что более вероятно, на вашу программу (, см. защитное программирование ).
2
28.01.2020, 02:18

Они должны быть одинаковыми.

Однако этот код имеет свою долю проблем:

  • отсутствие кавычек арифметических расширений; должно бытьshift "$(($OPTIND - 1))"
  • использование непереносимого ==оператора
  • сообщения об ошибках записываются в стандартный вывод
  • выход с 0 (успех )статус в случае ошибки
  • отсутствие кавычек переменных; должно быть "$#"иecho "$USAGE"
  • неправильное размещение проверки if -отсутствие -аргументов; это должно быть после цикла getopts, чтобы не быть обманутымscript --
  • бесполезное цитирование v, h, iи:i:vh
2
28.01.2020, 02:18

Теги

Похожие вопросы