Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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 用于在HP-UX框上比较日期的语法-未找到错误_Bash_Date_Math_Compare_Hp Ux - Fatal编程技术网

Bash 用于在HP-UX框上比较日期的语法-未找到错误

Bash 用于在HP-UX框上比较日期的语法-未找到错误,bash,date,math,compare,hp-ux,Bash,Date,Math,Compare,Hp Ux,这与在HP-UX设备上检查SSL证书到期有关。没有日期-d可用 我有以下几点: #!/bin/bash # Exit script if program fails or an unset variable is used set -eu server="BLABLA" port="443" graceperiod_days="30" # Get expiry date of SSL certificate, in format 'Jan 31 11:59:00 2018 G

这与在HP-UX设备上检查SSL证书到期有关。没有日期-d可用

我有以下几点:

#!/bin/bash 

# Exit script if program fails or an unset variable is used
    set -eu 

server="BLABLA"
port="443"
graceperiod_days="30" 

# Get expiry date of SSL certificate, in format 'Jan 31 11:59:00 2018 GMT'
enddate="$(openssl s_client -connect "$server:$port" 2>/dev/null | openssl x509 -noout -enddate | sed -e 's#notAfter=##')" 

# Get today's date in format DD-MM-YYYY
todaysdate="$(date "+%d-%m-%Y")"
    echo "Today's date is $todaysdate" 

# Convert $enddate to format DD-MM-YYYY
enddate_formatted=$(printf '%s\n' "$enddate" | awk '{printf "%02d-%02d-%04d\n",$2,(index("JanFebMarAprMayJunJulAugSepOctNovDec",$1)+2)/3,$4}')
    echo "Certificate expiry date is $enddate_formatted" 

# Compare expiry date with today's date
if "$todaysdate" -ge "$("$enddate_formatted" - "$graceperiod_days")"
    then echo "$todaysdate is greater than $enddate_formatted. SSL certificate has expired!"
elif "$todaysdate" -lt "$("$enddate_formatted" - "$graceperiod_days")"
    then echo "$todaysdate is before $enddate_formatted. Everything is OK!"
else
    echo "ERROR"; fi 
据我所知,这应该是可行的,但输出是

Today's date is 29-08-2018
Certificate expiry date is 21-07-2018
./test[22]: 21-07-2018:  not found.
./test[22]: 29-08-2018:  not found.
./test[24]: 21-07-2018:  not found.
./test[24]: 29-08-2018:  not found.
ERROR 

怎么了

首先,您需要一种可以对其执行算术运算的形式的日期:

todaysdate_seconds=$(date +%s --date "$todaysdate")  # assuming GNU date
gp_seconds=$((graceperiod_days * 86400))
enddate_seconds=$(date +%s --date "$enddate_formatted")
其次,您的
if
语句缺少可以检查其退出状态的命令。您所拥有的只是这样一个命令的参数。相反,使用

if test "$todaysdate_seconds" -ge "$("$enddate_seconds" - "$gp_seconds")"; then
或者更简单的
bash
算术命令

if (( todaysdate_seconds >= enddate_seconds - gp_seconds )); then

谢谢,非常感谢。由于它是一个HPUX框,GNU--date不起作用(nor-d),您知道如何最好地将这两个日期格式化为不使用GNU date的纪元后的秒数吗?我不知道HPUX附带了哪个版本的
date
;请参阅文档。(如果您不使用Linux,请不要在问题上使用
Linux
标记。)使用比Linux更多的Posix-y,如BSDs或Solaris。一般来说,IMHO、Perl在所有“麻烦”的操作系统(SunOS、Solaris、AIX、HP-UX)中都更为一致,我通常建议寻找基于Perl的方法。