2016-06-30 18 views
0

私は任意のユーザパスワードの有効期限を見つけるためのスクリプトを持っています。スクリプトは期限(秒)を検出できますが、これをdatetime形式に変換することはできません。kshエポックから日時書式

#!/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です。 localtime()関数のパラメータとしてexpdatesecondsの値を入力すると、この関数は日付を日時形式で表示します。

しかし、$ expdateseconds変数を入力すると、関数は正しく機能せず、常に01.01.1970を返します。

localtime()関数のパラメータとして変数を入力するにはどうすればよいですか?

+0

あなたの 'perl'スクリプトの代わりにdbl-quotesを使用しますか?また、 'date'コマンドが提供するオプションを見てみると、ロードする小さなプログラムです(' man date')。がんばろう。 – shellter

答えて

1

シェル変数は、一重引用符では展開されません。だからあなたのコードでは、perlはシェル変数を "見て"いません。代わりに、値がデフォルトでゼロになっている初期化されていないperl変数を見ています。あるシェル変数はそうあなたがする必要があるすべてです。この場合には、二重引用符内で拡張:

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

ありがとうございます。私はこの分野では新しいです。私の評判が申し訳ないので、私は有用な答えを与えることができません。 –

+0

このような1つのライナーでは、私は 'scalar'の代わりに' ~~ 'を使い、括弧をなくします:' perl -le "print ~~ localtime $ expdateseconds" '。最新のperlでは '-le'と' print'の代わりに '-E'と' say'を使うこともできます。 –

0

@JeffYはあなたの問題は引用符で、言ったように。あなたはまた、(あなたのdateコマンドはGNUバージョンであると仮定した場合)のperlなしでそれを行うことができます。

expdate=`date -d @$expdateseconds` 

あなたはkshのを使用していることから、けれども - そして実際に、任意の近代的なPOSIXシェル - 私は `あなたが避けることをお勧めします。.. .`を使用すると、引用符で混乱する可能性があります。代わりに$( ... )を使用してください。

expdate=$(date -d @$expdateseconds) 

これはcodereviewではありませんが、あなたのスクリプトに関するいくつかのヒントがあります。通常のルールでは、標準エラー出力()の代わりにエラーメッセージ(「引数なし」など)を標準エラー出力に送信し、使用エラーが発生した場合はゼロ以外の値(通常は1)で終了します。

pwadm -q $1のようにコマンドにパラメータを渡すときは、パラメータを二重引用符で囲まない限り面白い文字が混乱する危険性があります。pwadm -q "$1"

算術演算では、let,((、およびexprという奇妙な混合があります。 typeset -ivarnameですべての数値変数を宣言し、すべての算術演算には(( ... ))を使用することをお勧めします。 (( ... ))の内部では、現在のディレクトリにa=b.cというファイルがある場合、let a=b*cは構文エラーに拡張されます(例:((a=b*c))はそうではありません)。変数にドル記号を付ける必要もありません(文字列に変換してから数値を解析する)か、数値になるように0を追加するだけです。

+0

私は答えが遅すぎますが、どうもありがとうございます。私は肯定的な点を与えることはできません、申し訳ありませんが、私はすることができます、私はできます。 –

関連する問題