将变量传递给变量

时间:2015-07-29 09:42:18

标签: bash shell awk scripting

我正在编写一个脚本来存档文件并将它们上传到某个位置。

我遇到以下问题:

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变量。 例如,当我在创建YEAR,MONTH,DAY变量后回显$ PATTERN时,我希望它会打印出像 Filename_2015_07_29.gz

目前,它只是打印一个NULL。

首先,这甚至可能吗? 如果是这样,怎么样?

谢谢!

编辑:

变量startdate和enddate作为参数传递给脚本。

这是配置文件模式:

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

脚本读取此行,将文件名,模式,位置提取到变量中。 然后,它将给定日期分为年,月,日。 最后,当我打印Pattern时,我想在其中看到这些值。

例如: 当dailydate = 20150729 那么Pattern应该是:filepattern_2015_07_29.gz

想法是迭代输入的日期范围。 (从20150507到20150707说)。

2 个答案:

答案 0 :(得分:2)

eval echo $Pattern

eval将扩展模式中的变量。

答案 1 :(得分: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

或者如果您因某种原因需要拆分y / m / d,只需将上面的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

如果上述情况不符合您的要求,请编辑您的问题以澄清并提供可测试的样本输入和预期输出。