请耐心等待我和我的问题,但我昨天才开始有效地使用bash编程。
我有一个脚本,到目前为止做了很多东西。我来到了需要迭代变量的地步。我在使用while循环之前创建了这些变量。例如,$Time
变量如下所示:
2016-01-29 17:07:00Z
2016-01-29 17:26:20Z
2016-01-29 17:26:20Z
2016-01-29 00:07:00Z
Grabinterval变量如下:
hour
minute
minute
day
我的第一步是检查另一个变量是否为空。如果不是,我继续在$Grabinterval
变量中的每行检查行,day
,hour
或minute
。
这也是通过while循环完成的,并且运行良好。但没有问题在上升。现在我想计算在while循环之前创建的时间与$Time
变量的第一行中给出的时间之间的时间差。我使用以下代码尝试了这个:
while read -r line; do
if [[ ! -z "$Filelocation" ]]
then
if [[ $line = "day" || $line = "days" ]]
then
Interval="Days"
GrabTimeNew=$(date +'%Y-%m-%d 00:0'$UPOFFSET':00Z')
default=$(date --date "-1 day" +'%Y-%m-%d 00:0'$UPOFFSET':00Z')
start=$(date -d"$line$Time" +%s)
end=$(date -d"$GRABtime" +%s)
TimeDiff=$(( $start - $end ))
fi
fi
done <<< $Grabinterval
这仅仅是较大的while循环的一部分,另外两个寻找hour
和minute
的部分几乎相同。
我在这里使用$line$Time
尝试的方式给出了以下错误消息:
date: invalid date ‘day2016-01-29 17:07:00Z\n2016-01-29 17:26:20Z\n2016-01-29 17:26:20Z\n2016-01-29 00:07:00Z’
所以它遍及所有行,而不仅仅是我希望它经历的day
行。有没有办法在$Time
变量中使用$Grabinterval
变量的第一行?
我很想使用for循环,但是我不知道如何在命令块中使用它来在if语句的命令块中读取想要的行。
谢谢, BallerNacken
while read -r GI TI; do
if [[ ! -z "$Filelocation" ]]
then
if [[ $GI = "day" || $GI = "days" ]]
then
Interval="Days"
GrabTimeNew=$(date +'%Y-%m-%d 00:0'$UPOFFSET':00Z')
default=$(date --date "-1 day" +'%Y-%m-%d 00:0'$UPOFFSET':00Z')
start=$(date -d"$TI" +%s)
end=$(date -d"$GRABtime" +%s)
TimeDiff=$(( $start - $end ))
fi
if [[ $GI = "hours" || $GI = "hour" ]]
then
Interval="Hours"
GrabTimeNew=$(date +'%Y-%m-%d %H:0'$UPOFFSET':00Z')
default=$(date --date "-1 hour" +'%Y-%m-%d %H:0'$UPOFFSET':00Z')
start=$(date -d"$TI" +%s)
end=$(date -d"$GRABtime" +%s)
TimeDiff2=$(( $start - $end ))
fi
if [[ $GI = "min" || $GI = "minutes" || $GI = "minute" ]]
then
Interval="Minutes"
GrabTimeNew=$(date +'%Y-%m-%d %H:%M:20Z')
default=$(date --date "-1 minute" +'%Y-%m-%d %H:%M:00Z')
start=$(date -d"$TI" +%s)
end=$(date -d"$GRABtime" +%s)
TimeDiff3=$(( $start - $end ))
fi
fi
done < <(paste <(echo "$Grabinterval") <(echo "$Time"))
我没有收到任何错误消息,但在if语句/ while循环中没有创建变量。
答案 0 :(得分:0)
您需要引用该变量以将换行符保留在<<< $var
。
list=$'a\nb\nc'
while read a ; do echo $a ; done <<< $list
while read a ; do echo $a ; done <<< "$list"
答案 1 :(得分:0)
你可能想尝试这样的事情:
while read -r interval datetime; do
#...
done < <(paste <(echo "$Grabinterval") <(echo "$Time"))
这将从Grabinterval读取一行,并从Time
读取相应的行