ksh epoch到datetime格式

时间:2016-06-30 14:37:58

标签: perl datetime ksh aix epoch

我有一个脚本可以找到任何用户密码的过期日期。脚本可以以秒(纪元)找到过期日期,但不能将其转换为日期时间格式。

#!/usr/bin/ksh

if (( ${#} < 1 )) ; then
   print "No Arguments"
   exit
fi

lastupdate=`pwdadm -q $1|awk '{print $3;}'`
((lastupdate=$lastupdate+0))
maxagestr=`lsuser -a maxage $1`
maxage=${maxagestr#*=}
let maxageseconds=$maxage*604800
expdateseconds=$(expr "$maxageseconds" + "$lastupdate")
((expdateseconds=$expdateseconds+0))
expdate=`perl -le 'print scalar(localtime($expdateseconds))'`
echo $expdateseconds
echo $expdate

在此脚本中,expdateseconds值为true。如果我输入expdateseconds的值作为localtime()函数的参数,该函数将以datetime格式显示日期。

但是如果我键入$ expdateseconds变量,该函数将不起作用,并始终返回01.01.1970。

如何输入变量作为localtime()函数的参数?

3 个答案:

答案 0 :(得分:1)

Shell变量不会在单引号内展开。所以在你的代码中,perl不是&#34;看到&#34;它是shell变量,而是看到一个未初始化的perl变量,其值默认为零。 Shell变量 在双引号内扩展,因此在这种情况下您需要做的只是:

expdate=`perl -le "print scalar(localtime($expdateseconds))"`

答案 1 :(得分:0)

正如@JeffY所说,你的问题是引用。你也可以不用perl来做(假设你的date命令是GNU版本):

expdate=`date -d @$expdateseconds`

虽然,既然你正在使用ksh - 实际上,任何现代的POSIX shell - 我建议你避免使用`...`,这可能会引起令人困惑的引用行为,并使用$( .. 。)而不是。

expdate=$(date -d @$expdateseconds)

这不是代码审查,但我还有一些关于您的脚本的其他提示。通常的规则是将错误消息(例如&#34;无参数&#34;)发送到标准错误而不是标准输出(使用print -u2),并在出现“非零值”(通常为1)时退出。 sa使用错误。

每当将参数传递给命令(例如pwadm -q $1)时,除非你引用参数:pwadm -q "$1",否则你冒着搞笑角色搞乱的风险。

您的算术中混合了let((expr。我建议您使用typeset -i varname 声明所有数字变量,并使用(( ... ))进行所有算术运算。在(( ... ))内,你不必担心乱七八糟的事情(如果当前目录中有文件,let a=b*c会扩展为语法错误例如,名为a=b.c; (( a=b*c ))赢得了&#t; t)。你也不需要在变量上放置美元符号(这只是让shell将它们转换为字符串,然后再将它们的数值解析出来),或者为了确保它们加上0而对它们加0。号。

答案 2 :(得分:0)

无需使用 awk 或 perl。例如:

#!/usr/bin/ksh93

[[ -z $1 ]] && print -u2 "No Arguments" && exit 1

typeset -i LASTUPDATE  S

X=( ${ pwdadm -q "$1" ; } )
LASTUPDATE=${X[3]}
X=${ lsuser -a maxage "$1" ; }
S=${X#*=}
(( S *= 604800 ))
(( S += LASTUPDATE ))
printf "$S\n%T\n" "#$S"