如何在shell脚本中显示循环外部的日期值赋值变量

时间:2014-01-28 07:31:07

标签: shell

我关注代码,我正在从相反的顺序读取文件并比较日期,在if if条件下我试图在一个变量中分配日期值。在'if'条件值正确显示。 如果我试图在循环外显示变量,则不显示值。

previousDay=`date +"%Y-%m-%d" -d "-1 day"`
tac logfile.txt |
(
while read line
do
finish_time=`echo $line | sed -e 's/\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\).*/\1/'`
file_content_date=`date -d "$finish_time" +%Y%m%d`
comparison_prev_date=`date -d "$previousDay" +%Y%m%d`
if [ $comparison_prev_date -ge $file_content_date ]; then
comparison_end_date=`date -d "$file_content_date" +%Y%m%d`
break
fi
done
)
echo $comparison_end_date

1 个答案:

答案 0 :(得分:1)

您的while循环位于子shell中。这意味着在那里创建的环境变量都不可用于主shell。尝试:

#!/bin/bash
previousDay=`date +"%Y-%m-%d" -d "-1 day"`
while read line
do
    finish_time=`echo $line | sed -e 's/\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\).*/\1/'`
    file_content_date=`date -d "$finish_time" +%Y%m%d`
    comparison_prev_date=`date -d "$previousDay" +%Y%m%d`
    if [ $comparison_prev_date -ge $file_content_date ]; then
        comparison_end_date=`date -d "$file_content_date" +%Y%m%d`
        break
    fi
done < <(tac logfile.txt)

echo $comparison_end_date

此代码仍将tac logfile.txt作为stdin提供给while循环,但它在不创建子shell的情况下执行此操作。

以上要求bash和支持FIFO的操作系统(如linux)。

更多信息:缺少这两项要求,可以使用临时文件:

#!/bin/sh
previousDay=`date +"%Y-%m-%d" -d "-1 day"`
tmpfile=$HOME/.deleteme$$
trap 'rm "$tmpfile"' EXIT
tac logfile.txt >"$tmpfile"
while read line
do
    finish_time=`echo $line | sed -e 's/\([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\).*/\1/'`
    file_content_date=`date -d "$finish_time" +%Y%m%d`
    comparison_prev_date=`date -d "$previousDay" +%Y%m%d`
    if [ $comparison_prev_date -ge $file_content_date ]; then
        comparison_end_date=`date -d "$file_content_date" +%Y%m%d`
        break
    fi
done <"$tmpfile"

echo $comparison_end_date