我关注代码,我正在从相反的顺序读取文件并比较日期,在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
答案 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