bash中使用DATE的操作

时间:2017-09-27 12:00:59

标签: bash date rhel5

所以我需要创建一个脚本,在脚本中写入有关电话的详细信息。该文件需要包含: -CALLING_NUMBER - >以0742,0743和0744开头,其余数字随机生成(共10个)

-CALLED_NUMBER - >以07开头,其余数字也是随机的

-START_DATE - >电话的开始日期,格式为yyyy-mm-dd hh24:mm:ss。对于所有电话,开始日期必须从同一天开始,并涵盖当天的所有时间

-END_DATE - >电话结束日期,格式相同,大于开始日期,随机生成0-7200之间的额外秒数

-CALL_TYPE - >如果通话持续时间为1秒,则返回短信,如果超过,则返回“语音”

我有CALLING_NUMBER和CALLED_NUMBER,并且一旦你有结束和开始日期,CALL_TYPE就非常直接。我在开始和结束日期遇到了麻烦。

GNU bash,版本3.2.25(1)-release(x86_64-redhat-linux-gnu)

谢谢!

1 个答案:

答案 0 :(得分:1)

这会在特定日期生成一个随机start_date,然后生成一个随机end_date,比之前晚0-7200秒:

#!/bin/bash

# all start_date's will be on this day
start_date_anchor="2017-09-01"
# start_date in seconds since Unix epoch
start_date_zero=$(date -d "$start_date_anchor" +%s)
# random offset in seconds from midnight (note: RANDOM is a 15-bit int)
start_date_offset=$(( ((RANDOM<<15)|RANDOM) % 86400 ))
# random start_date in "YYYY-MM-DD HH:MM:SS" format
start_date=$(date -d @"$((start_date_zero + start_date_offset))" +"%F %T")

# 0-7200 seconds offset
end_date_offset=$((RANDOM % 7200))
# end_date in "YYYY-MM-DD HH:MM:SS" format
end_date=$(date -d @"$((start_date_zero + start_date_offset + end_date_offset))" +"%F %T")

echo "Start date: $start_date"
echo "End date: $end_date"

请注意我们在这里使用:

  • date -d 'some_date' +%ssome_date转换为Unix时间戳(自纪元以来的秒数)
  • bash RANDOM变量,每次调用/引用时返回15位范围(0到32767)的随机整数。我们可以通过将两个15位整数的位组合为RANDOM<<15 | RANDOM来获得30位随机整数。
  • 以秒为单位的日期算术
  • date -d @unix_timestamp将Unix时间戳转换回人类可读的日期/时间
  • +"%F %T"格式说明符,作为YYYY-mm-dd HH:MM:SS格式
  • 的快捷方式