Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解读希捷';Bash脚本中的硬盘日期代码_Bash - Fatal编程技术网

如何解读希捷';Bash脚本中的硬盘日期代码

如何解读希捷';Bash脚本中的硬盘日期代码,bash,Bash,硬盘驱动器显示一个代码,而不是生产日期。描述了代码,并提供了在线解码器 简而言之,它是一个4位或5位数字,形式为YYWWD或YYWD,其中: YY是年份,00是1999年 W或WW是从1开始的周数 D是从1开始的星期几 第一周从所述年份7月的第一个星期六开始 例子 06212指2005年11月20日星期日 0051指1999年7月31日星期六 如何在bash脚本中对其进行解码?这就是我所做的,它应该可以工作: #!/bin/bash DATE=$1 REGEX="^(..)(..?)(

硬盘驱动器显示一个代码,而不是生产日期。描述了代码,并提供了在线解码器

简而言之,它是一个4位或5位数字,形式为
YYWWD
YYWD
,其中:

  • YY
    是年份,00是1999年
  • W
    WW
    是从1开始的周数
  • D
    是从1开始的星期几
  • 第一周从所述年份7月的第一个星期六开始
例子

  • 06212指2005年11月20日星期日
  • 0051指1999年7月31日星期六

如何在
bash
脚本中对其进行解码?

这就是我所做的,它应该可以工作:

#!/bin/bash

DATE=$1
REGEX="^(..)(..?)(.)$"

[[ $DATE =~ $REGEX ]]
YEAR=$(( ${BASH_REMATCH[1]} + 1999 ))
WEEK=$(( ${BASH_REMATCH[2]} - 1))
DAYOFWEEK=$(( ${BASH_REMATCH[3]} - 1))


OFFSET=$(( 6 - $(date -d "$YEAR-07-01" +%u) ))
DATEOFFIRSTSATURDAY=$(date -d "$YEAR-7-01 $OFFSET days" +%d)
FINALDATE=`date -d  "$YEAR-07-$DATEOFFIRSTSATURDAY $WEEK weeks $DAYOFWEEK days"`

echo $FINALDATE
它在上面给出的两个日期有效。。。
如果要自定义日期输出,请在最终日期分配的末尾添加格式字符串。

这是一个简短的脚本,它包含两个参数:
$1
是要转换的代码,
$2
是可选格式(请参见
人工日期
),否则为默认格式(请参见代码)

它使用了6月的最后一个星期六,而不是7月的第一个星期六,因为我发现它更容易定位,而且它允许我只添加相关的周数和天数

#!/bin/bash
date_format=${2:-%A %B %-d %Y}

code=$1
[[ ${#code} =~ ^[4-5]$ ]] || { echo "bad code"; exit 1; }

let year=1999+${code:0:2}
[[ ${#code} == 4 ]] && week=${code:2:1} || week=${code:2:2}
day=${code: -1}

june_last_saturday=$(cal 06 ${year} | awk '{ $6 && X=$6 } END { print X }')

date -d "${year}-06-${june_last_saturday} + ${week} weeks + $((${day}-1)) days" "+${date_format}"
示例:

$ seadate 06212
Sunday November 20 2005
$ seadate 0051
Saturday July 31 1999

我创建了一个希捷日期代码计算器,它的计算精度非常高。我已将其发布在此论坛上,供任何人使用:

它比网上的其他网站要准确得多,这些网站经常指出完全错误的年份。我知道这不是bash脚本,但仍然可以为正在寻找如何实现这一点的其他人完成任务


享受吧

我喜欢您使用
%u
获取起始日期的方式;它比我试过的更干净。是的,我也试过解析
cal
的输出。。。真不稳定!我不是想编辑原始帖子,只是想提出一个修复方案。YY年和WW周可以有一个前导0,告诉bash一个数字是八进制(以8为基数)。但是08和09是无效的八进制数。添加
10 
强制解释为十进制(以10为基数)。年=$((10#${BASH_REMATCH[1]}+1999))周=$((10#${BASH_REMATCH[2]}-1))这两个链接不再存在,但解码听起来正确。。。