Массив Bash с путями к папкам и подстановочными знаками

После нескольких минут борьбы с xmllint я обычно сдаюсь и в конечном итоге использую вместо него xmlstarlet , который обычно более склонен к делать то, что вы ожидаете от него. Здесь:

xmlstarlet sel -t -v '//issue/subject' <<< "$xml"

(или полностью отказаться от XML и использовать более разумный формат ).

1
12.04.2019, 23:49
2 ответа

Шаблон подстановки оболочки *не раскрывается в двойных кавычках. Это означает, что ваш цикл

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при выводе переменных данных.

Связанные:

1
27.01.2020, 23:30

Вы можете сделать это с помощью расширенной опции glob, которая позволит вам расширять подстановочные знаки внутри переменной с помощью*()

shopt -s extglob
dir_array=(
    "/srv/*(*)/folderA"
    "/srv/level1D/*(*)/folderA"
)

Расширение произойдет в для d in... , что, я думаю, является правильным моментом.

1
27.01.2020, 23:30

Теги

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