【发布时间】:2020-11-08 14:39:19
【问题描述】:
我有一个用户输入数据库名称的 bash 脚本,然后我的脚本需要遍历这个数据库配置文件。我的 JSON 看起来像这样:
{
"_id":1,
"db_name":"postgres",
"username":"postgres_user",
"password":"postgres_pass",
"daily" : {
"days_to_backup" : [1,2],
"delete_after" : 14,
"compressed" : true,
"path" : "localhost"
},
"monthly" : {
"days_to_backup" : [2,5,30],
"delete_after" : 7,
"compressed" : false,
"path" :" localhost"
},
"yearly" : {
"days_to_backup" : [100],
"delete_after" : 14,
"compressed" : true,
"path" : "localhost"
}
}
{
"_id":2,
"db_name":"test",
"username":"test_user",
"password":"test_pass",
"daily" : {
"days_to_backup" : [1,7],
"delete_after" : 14,
"compressed" : true,
"path" : "localhost"
},
"monthly" : {
"days_to_backup" : [2,5,25],
"delete_after" : 7,
"compressed" : false,
"path" : "localhost"
},
"yearly" : {
"days_to_backup" : [50],
"delete_after" : 14,
"compressed" : true,
"path" : "localhost"
}
}
现在,一旦用户使用特定的数据库名称运行脚本,我想遍历“days_to_backup”数字,并且每天看起来它与今天的日期相同。问题是我不知道如何获取每日/每月/yealy.days_to_backup 然后循环遍历这些天。 我试过 jq :
#! /bin/sh
#monday is first day of the week
export Today=$(date +%d)
while getopts d: flag
do
case "${flag}" in
d) database=${OPTARG};;
esac
done
if jq .db_name file.json | grep $database
then
jq 'select(.db_name=="'$database'")' file.json
##this one returns the whole document of the specified database
##loop here for daily/monthly_yearly.days_to_backup???
else
echo "database not found"
fi
编辑:我的输入是数据库的名称(“postgres”),然后我将遍历每日/每月/每年的数组,如果数字类似于当前日期(今天是每月 8 号),那么输出将是 - 回显“今天备份”。
Edit2:对不起,我的错。对于每天,这意味着一周中的那一天,因此(1,7)是星期日和星期六,如果当前日期是星期日或星期六,我想要并回显“今天备份”。对于每月,它表示当月的某一天,所以如果我有每月 (01,08),它将回显“今天的备份”,因为今天是该月的 8 号。每年我都想从一年的第一天开始。
好的,所以我成功地遍历了数组,但现在的问题是它遍历了 2 个大对象 (id 1 + 2) 的数组
for i in $(jq -r ".daily.days_to_backup | .[]" file.json)
do
echo $i "im number"
done
如何选择它只在 _id:1 / db_name: postgres 上运行?
【问题讨论】:
-
请添加到您的问题示例输入和您想要的输出(无描述)。
-
这是否意味着每个月的 29 日应该进行每日备份和每年的备份,而 30 日则应该进行每月备份?
-
已编辑。当我调用脚本时,我用 -d 指定数据库的名称,然后对于每个 Daily/monthly/yearly.days_to_Backup 数组,我想检查其中的数字是否与当前日期相同。如果是,只需打印一个回显它是同一日期。
-
你必须对
date +%d小心一点——对于个位数的日子,你会得到一个前导零,这可能会影响你的比较。 -
你可能会发现 gron 比 jq 更容易使用