Кто-то может помочь мне понять следующий сегмент кода?
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. Таким образом, если я хочу просканировать для повреждения, почему я не должен сканировать для всего, что это не число, но только для вопросительного знака? Это, возможно, так или иначе связано с тем, что происходит в первых двух строках?
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
, отметить первый файл резервной копии.