Шаблон подстановки оболочки *
не раскрывается в двойных кавычках. Это означает, что ваш цикл
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
при выводе переменных данных.
Связанные:
Вы можете сделать это с помощью awk:
echo '20601300929&Page=1&PageSize=96' |
awk -F "Page=" '
{
split($2,a,"&")
for (i=int(a[1]);i<=100;i++){
print $1 FS a[1]++ "&" a[2]
}
}'
Разделитель полей установлен на Page=
, поэтому поле $2
в нашем примере равно 1&PageSize=96
.
Бит split
разбивает это второе поле на основе &
и помещает в a[1]
число, а в a[2]
остальную часть строки(PageSize=96
).
Наконец, в операторе печати все склеено.
Может быть, баш
num=96
counter=1
limit=100
var='20601300929&Page=#&PageSize=#'
while ((counter<=limit)); do
if [[ $var =~ ([^\&]+)(\&[^\&]+)(.+) ]]; then
printf '%s\n' "${BASH_REMATCH[1]}${BASH_REMATCH[2]/\#/$((counter++))}${BASH_REMATCH[3]/\#/$num}"
fi
done