Bash 如何在Shell中解析日期?

Bash 如何在Shell中解析日期?,bash,shell,parsing,date,time,Bash,Shell,Parsing,Date,Time,现在,我正试图解析get time和date中的值,并按每个数字进行分解 日期/时间的格式 #!/bin/bash prevDateTime=$(date +'%Y-%m-%d-%H:%M:%S') echo "${prevDateTime}" 我想这样把它列出来 echo "${prevYear}" echo "${prevMonth}" echo "${prevDay}" echo "${prevHour}" echo "${prevMinute}" echo "${prevSecond

现在,我正试图解析get time和date中的值,并按每个数字进行分解

日期/时间的格式

#!/bin/bash 
prevDateTime=$(date +'%Y-%m-%d-%H:%M:%S')
echo "${prevDateTime}"
我想这样把它列出来

echo "${prevYear}"
echo "${prevMonth}"
echo "${prevDay}"
echo "${prevHour}"
echo "${prevMinute}"
echo "${prevSecond}"
然后像

echo "${prevDate}"
echo "${precTime}"

但是我不知道如何解析出这些信息,任何帮助都会很好,鉴于prevDateTime的格式,正则表达式可能是最简单的解决方案

从技术上讲,使用declare有一个单行程序来实现这一点:


它使用date来输出一块声明实例化的参数赋值。请注意,命令替换没有被引用,因此每个赋值都被视为要声明的单独参数。如果要分配的值中有空格,则必须切换到使用eval,输出与date略有不同。

鉴于prevDateTime的格式,正则表达式可能是最简单的解决方案

从技术上讲,使用declare有一个单行程序来实现这一点:


它使用date来输出一块声明实例化的参数赋值。请注意,命令替换没有被引用,因此每个赋值都被视为要声明的单独参数。如果要分配的值中有空格,则必须切换到使用eval,输出与date略有不同。

使用cut的快速解决方案:

#!/bin/bash 
prevDateTime=$(date +'%Y-%m-%d-%H:%M:%S')
echo "${prevDateTime}"

prevYear=`echo $prevDateTime | cut -d- -f1`
prevMonth=`echo $prevDateTime | cut -d- -f2`
prevDay=`echo $prevDateTime | cut -d- -f3`
prevHour=`echo $prevDateTime | cut -d- -f4 | cut -d: -f1`
prevMinute=`echo $prevDateTime | cut -d- -f4 | cut -d: -f2`
prevSecond=`echo $prevDateTime | cut -d- -f4 | cut -d: -f3`

echo "Year: $prevYear; Month: $prevMonth; Day: $prevDay"                                                                                                                                                                                                                       
echo "Hour: $prevHour; Minute: $prevMinute; Second: $prevSecond"

使用cut的快速解决方案:

#!/bin/bash 
prevDateTime=$(date +'%Y-%m-%d-%H:%M:%S')
echo "${prevDateTime}"

prevYear=`echo $prevDateTime | cut -d- -f1`
prevMonth=`echo $prevDateTime | cut -d- -f2`
prevDay=`echo $prevDateTime | cut -d- -f3`
prevHour=`echo $prevDateTime | cut -d- -f4 | cut -d: -f1`
prevMinute=`echo $prevDateTime | cut -d- -f4 | cut -d: -f2`
prevSecond=`echo $prevDateTime | cut -d- -f4 | cut -d: -f3`

echo "Year: $prevYear; Month: $prevMonth; Day: $prevDay"                                                                                                                                                                                                                       
echo "Hour: $prevHour; Minute: $prevMinute; Second: $prevSecond"
您可以在IFS中使用read命令来分解日期组件:

prevDateTime=$(date +'%Y-%m-%d-%H:%M:%S')
IFS='-:' read -ra arr <<< "$prevDateTime"

# print array values
declare -p arr
# This outputs
#   declare -a arr='([0]="2015" [1]="05" [2]="21" [3]="10" [4]="24" [5]="28")'

#assign to other variables
prevYear=${arr[0]}
prevMonth=${arr[1]}
prevDay=${arr[2]}
prevHour=${arr[3]}
prevMinute=${arr[4]}
prevSecond=${arr[5]}
您可以在IFS中使用read命令来分解日期组件:

prevDateTime=$(date +'%Y-%m-%d-%H:%M:%S')
IFS='-:' read -ra arr <<< "$prevDateTime"

# print array values
declare -p arr
# This outputs
#   declare -a arr='([0]="2015" [1]="05" [2]="21" [3]="10" [4]="24" [5]="28")'

#assign to other variables
prevYear=${arr[0]}
prevMonth=${arr[1]}
prevDay=${arr[2]}
prevHour=${arr[3]}
prevMinute=${arr[4]}
prevSecond=${arr[5]}

比如prevYear=$date+'%Y'等等?比如prevYear=$date+'%Y'等等?工作起来就像做梦一样,只是想知道是否有办法将其拆分,并将日期作为单个变量,而不是3个单独的变量??同样的事情,使用:fullData=echo$prevDateTime | cut-d--f1,2,3 echo date:$fullData使用这样的剪切效率非常低。@chepner,当然,这是一个快速的解决方案,你的解决方案甚至更好。就像做梦一样,只是想知道是否有办法将其拆分,并将日期作为单个变量,而不是3个单独的变量??同样的,使用:fullData=echo$prevDateTime | cut-d--f1,2,3 echo-date:$fullData像这样使用cut是非常低效的。@chepner,确定这是一个快速的解决方案,你的更好在IFS的价值中,[]是不必要的。它们只是额外的未使用的字段分隔符。有点像。整个值被隐式地视为一个字符类,因此对于拆分IFS=-:和IFS=:-将是等效的。例外情况是使用IFS将单词连接到单个字符串中,其中仅使用第一个字符,因此顺序很重要。IFS值中不需要[]。它们只是额外的未使用的字段分隔符。有点像。整个值被隐式地视为一个字符类,因此对于拆分IFS=-:和IFS=:-将是等效的。例外情况是使用IFS将单词连接到单个字符串中,其中仅使用第一个字符,因此顺序很重要。