在一个while循环中使用不同的变量或更好地用于循环?

时间:2016-02-09 17:48:17

标签: bash variables if-statement for-loop iteration

请耐心等待我和我的问题,但我昨天才开始有效地使用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变量中的每行检查行,dayhourminute。 这也是通过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循环的一部分,另外两个寻找hourminute的部分几乎相同。 我在这里使用$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循环中没有创建变量。

2 个答案:

答案 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

读取相应的行