1

特定の形式で日付を検索しようとしています。以前に perl( strftime) で実行したことがありますが、今回は静的な時間について言及しました。今回は変数 $CURRENT_DAY が必要です。

CURRENT_DAY以下は問題です。使用することDAYHOUR=86400と整数を同等にすると、変数は適切な時間を与えますが、$CURRENT_DAY変数をステートメントに入れると、日付は減少しません。

$ DAYHOUR=86400
$ DAY=1
$ CURRENT_DAY=`echo $(($DAYHOUR*$DAY))`
$ DD=`perl -e 'use POSIX; print strftime "%d", localtime time - $CURRENT_DAY;'`
$ echo $DD
20
$ DAY=`echo $(($DAY+1))`
$ CURRENT_DAY=`echo $(($DAYHOUR*$DAY))`
$ DD=`perl -e 'use POSIX; print strftime "%d", localtime time - $CURRENT_DAY;'`
$ echo $DD
20
$ DAY=`echo $(($DAY+1))`
$ echo $DAY
3
$ CURRENT_DAY=`echo $(($DAYHOUR*$DAY))`
$ echo $CURRENT_DAY
259200
$ echo `perl -e 'use POSIX; print strftime "%d", localtime time - 259200;'`
17
4

4 に答える 4

4

あなたの主な問題は、それ$CURRENT_DAYが Perl スクリプト変数であることです。Perl スクリプトを一重引用符で囲むと、同じ名前のシェルの変数が表示されなくなります。警告を (たとえば で-w) 有効にしていたら、これが表示されたはずです。

問題を回避するには、いくつかの方法があります。1 つは二重引用符を使用して Perl をカプセル化し、Perl が実行される前にシェルが最初に変数の値を展開できるようにすることです。

CURRENT_DAY=3
perl -MPOSIX -wle "print strftime qq(%d),localtime time-(86400*$CURRENT_DAY);print $CURRENT_DAY" 
17

もう一つは:

export CURRENT_DAY=3
perl -MPOSIX -wle 'print strftime qq(%d),localtime time-(86400*$ENV{CURRENT_DAY})' 

昨日または明日を計算するために時間に 24 時間を加算または減算すると、夏時間の変更が正しく考慮されないことに注意してください。このよくある質問を見る

于 2012-12-20T13:54:29.340 に答える
1

Perl と同様shに、一重引用符で囲まれた文字列を補間しないため、Perl は$CURRENT_DAY実際の数値の代わりに認識し、その Perl 変数に何も割り当てていません。二重引用符で囲まれた文字列に切り替えることができます。

perl -MPOSIX -e"print strftime '%d', localtime time-$CURRENT_DAY;"

は数値なので問題$CURRENT_DAYありませんが、任意の文字列を渡したい場合は、環境変数または引数を使用します。

export CURRENT_DAY
perl -MPOSIX -e'print strftime "%d", localtime time-$ENV{CURRENT_DAY};'

また

perl -MPOSIX -e'print strftime "%d", localtime time-$ARGV[0];' -- "$CURRENT_DAY"

ただし、コードにはバグがあることに注意してください。すべての日が 86400 秒であるとは限らないため、コードが間違った答えを出す時間は毎年 2 時間あります。82800 を持っているものもあれば、90000 を持っているものもあります (うるう秒が考慮されていないと仮定しています)。

perl -MDateTime -e'print
   DateTime->today(time_zone=>"local")
    ->subtract(days=>$ARGV[0])
     ->strftime("%d")' -- "$DAY"

または、 を使用できますdate

date -d "$DAY days ago" +%d
于 2012-12-20T18:24:24.097 に答える
0

シェル変数に過去の日数を渡し、DAYシェル変数 DD に答えが必要だと仮定しています

その月の 20DAY日で が 1 の場合、DD は 19 に設定する必要があります。

次のように Perl コマンドを変更できます。

 DD=`perl -e 'use POSIX; print strftime "%d", localtime( time - ($ENV{DAY}* 86400))';

dateまたは、広く利用可能なGNU コマンドを使用することもできます

 DD=`date -d "$DAY days ago" +%d`

dateうるう日などを扱うには、おそらく使用する方が良いでしょう

于 2012-12-20T13:57:44.197 に答える