После нескольких минут борьбы с xmllint
я обычно сдаюсь и в конечном итоге использую вместо него xmlstarlet
, который обычно более склонен к делать то, что вы ожидаете от него. Здесь:
xmlstarlet sel -t -v '//issue/subject' <<< "$xml"
(или
Шаблон подстановки оболочки *
не раскрывается в двойных кавычках. Это означает, что ваш цикл
for d in "${dir_array[@]}";do
зацикливается на паттернах . В вашем вызове dir_delete
вы используете шаблоны без кавычек, поэтому они будут развернуты там (, но никогда не попадут туда ). Однако функция будет использовать только первое слово того, что соответствует шаблону в вызове find
.
Настоящая остановка шоу -заключается в том, что шаблоны также будут расширены в тесте [ -d $d ]
, что неудобно, так как тест -d
всегда принимает только одиночное имя пути. Вот, в конце концов, почему сценарий терпит неудачу.
Вместо этого убедитесь, что паттерны правильно расширены при назначении на dir_array
:
dir_array=(
/srv/*/folderA
/srv/level1D/*/folderA
)
Если folderA
или какая-либо другая часть пути содержит пробелы и т. д., эта часть пути должна быть заключена в кавычки, но *
не должна заключаться в кавычки.
Также не забудьте заключить в двойные кавычки расширения всех переменных, если только вы не знаете, в каких контекстах их не нужно заключать в кавычки.
Возможны проблемы с цитированием следующих строк:
if [ -d $d ];then
find $1 -type f -mindepth 1 -maxdepth 1 -mtime +$FILEAGE -delete -print
dir_delete $d
Также рассмотрите возможность использования printf
вместо echo
при выводе переменных данных.
Связанные:
Вы можете сделать это с помощью расширенной опции glob, которая позволит вам расширять подстановочные знаки внутри переменной с помощью*()
shopt -s extglob
dir_array=(
"/srv/*(*)/folderA"
"/srv/level1D/*(*)/folderA"
)
Расширение произойдет в для d in... , что, я думаю, является правильным моментом.