2015-07-29 5 views
0

Я пишу скрипт для архивирования файлов и загрузки их в определенное место.Передача переменной переменной

У меня возникли проблемы со следующей областью:

while IFS= read -r THELINE; do 
    Filename=$(awk -F:: '{print $1}' <<< "$THELINE") 
    Pattern=$(awk -F:: '{print $2}' <<< "$THELINE") 
    Location=$(awk -F:: '{print $3}' <<< "$THELINE") 

    dailydate=$startdate 

    while [[ $dailydate -le $enddate ]] 
    do 
     YEAR=${dailydate:0:4} 
     MONTH=${dailydate:4:2} 
     DAY=${dailydate:6:2}` 
     echo $Pattern 
     dailydate=`/bin/date --date="$dailydate 1 day" +%Y%m%d` 
    done 
done < $FileDetails 

Файла $FileDetails конфигурационного файл, структура и расположение разделенных ::. Я извлекаю их, как показано. Проблема с картины ..

я их в этом формате:

Filename_$YEAR_$MONTH_$DAY.gz, в конфигурационном файле.

Я также создаю переменные с именем YEAR, MONTH и DAY внутри цикла из переменной даты.

Я надеялся, что переменная «Pattern» будет читать переменные YEAR, MONTH, DAY. Например, когда я эхо $ PATTERN после создания переменных год, месяц, день, я надеялся, что это будет печатать что-то вроде Filename_2015_07_29.gz

В настоящее время он просто печатает NULL.

Прежде всего, это даже возможно? Если да, то как?

Спасибо!

EDIT:

Переменные STARTDATE и EndDate в настоящее время передаются как параметры сценария.

Вот конфигурационный файл шаблона:

Filename::filepattern_${YEAR}_${MONTH}_${DAY}.gz::File/location/some/where

Скрипт читает эту строку, извлекает имя файла, шаблон, расположение в переменные. Затем он разделяет данную дату на год, месяц, день. Наконец, когда я печатаю шаблон, мне бы хотелось увидеть эти значения.

Например: когда dailydate = 20150729 Тогда шаблон должен быть: filepattern_2015_07_29.gz

Идея заключается в том, чтобы перебрать введенный диапазон дат. (Скажем, от 20150507 до 20150707).

+0

@EdMorton конфигурационный файл, как: Имя файла :: FilePattern _ $ {YEAR} _ $ {МЕСЯЦ} _ $ {DAY} .gz :: Файл/местоположение/ Если дата 20150405, вывод для шаблона должен быть: filepattern_2015_04_05.gz – FenderBender

ответ

2
eval echo $Pattern 

eval будет расширять переменные в шаблоне.

+1

Это будет работать, если шаблон был 'Filename _ $ {YEAR} _ $ {MONTH} _ $ {DAY} .gz' - в его нынешнем виде вам придется объявить 'YEAR_' и' MONTH_' переменные –

+0

@chepner, как вы затем расширяете переменную. –

+0

@jackman, спасибо за указание. Я упустил это, увидев на мобильном телефоне –

1

Это то, что вы хотите?

$ cat tst.awk 
BEGIN { 
    FS="::" 
    startSecs = mktime(gensub(/(....)(..)(..)/,"\\1 \\2 \\3 0 0 0","",startDate)) 
    endSecs = mktime(gensub(/(....)(..)(..)/,"\\1 \\2 \\3 0 0 0","",endDate)) 
} 
{ 
    for (curSecs=startSecs; curSecs<=endSecs; curSecs+=(24*60*60)) { 
     pattern = $2 
     sub(/\${YEAR}_\${MONTH}_\${DAY}/, strftime("%Y_%m_%d",curSecs), pattern) 
     print pattern 
    } 
} 

$ awk -v startDate=20150507 -v endDate=20150510 -f tst.awk file 
filepattern_2015_05_07.gz 
filepattern_2015_05_08.gz 
filepattern_2015_05_09.gz 
filepattern_2015_05_10.gz 

или, если вам нужно разделить вне г/м/д по какой-либо причине, то просто изменить выше sub() линии на 3 отдельных sub() с:

 curDate = strftime("%Y%m%d",curSecs) 
     sub(/\${YEAR}/, substr(curDate,1,4), pattern) 
     sub(/\${MONTH}/, substr(curDate,5,2), pattern) 
     sub(/\${DAY}/, substr(curDate,7,2), pattern) 

выше использует GNU AWK для времени функции, с другими awks, которые вы бы назвали shell date и вывести результат на awk getline.

Если выше не то, что вы хотите, пожалуйста, отредактируйте свой вопрос, чтобы уточнить и предоставить тестовый ввод проб и ожидаемый результат.

Смежные вопросы