Проблемы, понимающие, как установленные работы

Кто-то может помочь мне понять следующий сегмент кода?

set -- ${BACKUPDIR}/backup-???.tgz
lastname=${!#}
backupnr=${lastname##*backup-}
backupnr=${backupnr%%.*}
backupnr=${backupnr//\?/0}
backupnr=$[10#${backupnr}]

Я нашел его в этом резервном сценарии https://wiki.ubuntuusers.de/Skripte/inkrementelles_Backup/, где это используется для получения количества имени файла последнего сохраненного резервного копирования. Имена файлов резервных копий являются "резервным-копированием-ccc.tgz", где ccc является трехзначным числом, которое увеличено каждый раз, когда новое резервное копирование создается.

Я действительно понимаю строки три, и четыре они отключают остальную часть имени файла поэтому просто, необходимые расстаются с числом, оставлен. То, что я не получаю, - то, как первые две строки работают. Я прочитал страницу справочника набора, но теперь я смущен больше затем, я был прежде. Что делает команду set -- filename ? Также что точно является $ опции {! #} для, который хранится в lastname. Я думаю, что $ {} должен разыменовать данный параметр, но какой параметр делает опцию! # указывают на?

Во-вторых, я не добираюсь, почему мне нужна команда в строке 5. Поскольку я понимаю, что это используется для замены всех вопросительных знаков 0, которые хранятся в переменной backupnr, но почему это сделано? Если не было ошибки в командах, прежде чем backupnr должен будет быть трехзначным числом, если была ошибка, и содержание переменной повреждено, Вы не можете знать то, что является фактическим значением backupnr. Таким образом, если я хочу просканировать для повреждения, почему я не должен сканировать для всего, что это не число, но только для вопросительного знака? Это, возможно, так или иначе связано с тем, что происходит в первых двух строках?

0
задан 16 June 2016 в 07:19

1 ответ

set часто используется для установки позиционных параметров ($1, $2, $3, и т.д., которые обычно обеспечиваются как аргументы сценарию). При помощи этих параметров мы можем получить простой способ считать вещи через $# переменная, которая хранит количество установленных позиционных параметров.

? подстановочный знак, соответствующий любому отдельному символу, таким образом, ??? соответствия любая комбинация трех символов.

Объединенный: set -- ${BACKUPDIR}/backup-???.tgz устанавливает каждый названный файл backup-xxx.tgz, где xxx любые три символа, как параметры.

${!#}, косвенность переменной использования:

Если первый символ параметра является восклицательным знаком (!), он представляет уровень переменной абстракции. Bash использует значение переменной, сформированной из остальной части параметра как название переменной; эта переменная затем расширена, и то значение используется в остальной части замены, а не значения самого параметра. Это известно как косвенное расширение.

С тех пор $#, который является тем, что Вы получаете, когда Вы удаляете !, количество параметров (и количество последнего параметра), ${!#} простой путь состоит в том, чтобы получить последний аргумент.


Что касается команды 5, что происходит, когда никакие файлы соответствия не присутствуют?

$ bash -c 'set -- backup-???.tgz; echo "$@"'
backup-???.tgz

Оболочка оставляет то слово в покое, поэтому теперь у нас есть просто литерал backup-???.tgz. Автор обрабатывает тот пограничный случай путем замены ? с 0, отметить первый файл резервной копии.

1
ответ дан 16 June 2016 в 07:19

Другие вопросы по тегам:

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