我有一个文件,其中指定了几个参数,如load_start_date,load_end_date等,如下所示。我在同一个文件中也有一个名为part_date的变量。
load_start_date=2016-10-03
load_end_date=2016-10-03
part_date=
现在我的目的是读取文件(特别是读取load_start_date参数),扣除1天(即本例为2016-10-02),然后将格式转换为YYYYMMDD(例如20161003)保存保存对于变量part_date的值,如下所示。
load_start_date=2016-10-03
load_end_date=2016-10-03
part_date=20161002
这有多容易实现?
答案 0 :(得分:0)
我建议您利用文件中的字符串非常适合分配这一事实:
#!/bin/bash -
{
source file.txt
if test "$load_start_date" != ""; then
part_date=$(date -d "$load_start_date - 1 day" "+%Y%m%d")
sed -i -e "s/^part_date=.*/part_date=$part_date/" file.txt
fi
}
source
命令评估当前上下文中的file.txt
,即创建变量$load_start_date
,$load_end_date
和$part_date
。如果我们没有使用 subshell 表达式(花括号)来为代码块创建特殊范围,这本来就有点不安全。
然后我们只需将$load_start_date
之前的日期指定给$part_date
变量,然后通过sed
替换源文件中的相应行。
答案 1 :(得分:0)
在脚本中使用date
命令:
part_date=$(date -d @$(($(date -d $load_start_date +%s) - 24*60*60)) +%Y%m%d)
这将以秒为单位转换开始日期,并从该值中减去1天,然后再次以YYYYMMDD格式打印。
答案 2 :(得分:0)
如果我理解了您的问题,并且您有一个文件说file.txt
包含:
load_start_date=2016-10-03
load_end_date=2016-10-03
,您的目标是阅读(或获取)该文件,并将变量part_date
设置为比load_start_date
中显示的更少一天(移除-
),然后除了date
方法之外,您可以简单地使用POSIX参数替换和算术。例如:
#!/bin/sh
[ -f "dat/lsd.txt" ] && . file.txt ## source file in script
test -n "$load_start_date" || exit 1 ## validate load_start_date
# part_date=$((${load_start_date//-/} - 1)) ## if your shell supports
## parameter substitution
part_date="${load_start_date%%-*}" ## otherwise, us POSIX
tmp="${load_start_date#*-}" ## parameter expansion
part_date="${part_date}${tmp%-*}"
part_date="${part_date}${load_start_date##*-}"
part_date=$((part_date - 1)) ## subtract 1
printf "part_date : %s\n" "$part_date"
(注意:如果你的shell支持参数替换,你可以减少用于隔离没有'-'
的日期的四行到上面评论的单行)
删除'-'
后,您会得到一个简单的整数(例如20161003
),只需算术就可以将值减少1。
示例使用/输出
part_date : 20161002
有很多方法可以解决这个问题。查看所有答案,看看哪一个最适合您的需求。