我有一个脚本可以找到任何用户密码的过期日期。脚本可以以秒(纪元)找到过期日期,但不能将其转换为日期时间格式。
#!/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()函数的参数?
答案 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"