プロが教える店舗&オフィスのセキュリティ対策術

パラメータでYYYYMMDDをもらうようなシェルを作成します。

./XXX.sh 20031112
みたいな感じです。

で、このパラメータが日付として問題ないかの判定をしたいのですが
方法がいまいちわかりません。

例)
./XXX.sh 20031131 ⇒ エラー

なにか良い方法は無いでしょうか。

よろしくお願いいたします。

A 回答 (5件)

最終手段としてもっと高レベルのスクリプト言語、


例えば Perl とか Ruby とか Python は使えませんか?
Ruby, Perl でさっきの checkdate.sh を書き直してみました。

#!/usr/bin/env ruby
# できれば Ruby の絶対パスを書いてください
require 'date'
require 'parsedate'
include ParseDate

unless Date.exist?(*parsedate(ARGV[0])[0,3])
STDERR.puts "Invalid date"
exit 1
end

Perl 版
#!/usr/bin/env perl
# 同じく
use Date::Manip "ParseDate";

$date = ParseDate($ARGV[0]);
if (!$date) {
print STDERR "Invalid date\n";
exit(1);
}
    • good
    • 0
この回答へのお礼

Perl版まで教えていただきありがとうございます。

結局のところシェルのみでどうにかする方法は
関数を自作する以外無いということなんでしょうか・・・

それはそれで仕方の無いことなので
諦めて自作の道を辿る事にします。

ありがとうございましたm(__)m

お礼日時:2003/11/13 09:03

Solarisのときはいつも、/usr/sadm/bin/valdateコマンドを使っています。


ご参考まで。


% cat chkdate

#!/bin/sh
/usr/sadm/bin/valdate -f %Y%m%d 20031131
echo $?
/usr/sadm/bin/valdate -f %Y%m%d 20031132
echo $?
/usr/sadm/bin/valdate -f %Y%m%d 20031231
echo $?
/usr/sadm/bin/valdate -f %Y%m%d 20040100
echo $?


% ./chkdate
0
1
0
1

この回答への補足

回答ありがとうございます。

同じように試してみましたが、20031131は正となってしまいますね。
現実には11/31は無いのでエラーになってほしいのですが・・・
日付の部分は01~31ならすべて正になるみたいで。。。

特定の月の場合は31をエラーとかしてもいいのですが
うるう年とか考えると処理がかなり増えそうです(--;

これに関してはどうしようもないのでしょうか・・・

補足日時:2003/11/12 14:50
    • good
    • 0

Solaris でしたか。

GNU date だとうまくいくんですけど…
ckdate(1)やvaldate(1)というのが使えないでしょうか。

参考URL:http://docs.sun.com/db/doc/816-3518/6m9ptvqth?l= …
    • good
    • 0

少し書き直して。



$ cat checkdate.sh
#!/bin/sh

datestr=$1
result=`date -d $datestr +%Y%m%d`

if [ $datestr -ne $result ]
then
echo "Invalid date"
exit 1
fi

終了ステータスも見ましょう。

$ ./checkdate.sh 20031112; echo $?
0
$ ./checkdate.sh 20031131; echo $?
Invalid date
1

こんなものでどうでしょう。

この回答への補足

回答ありがとうございます。

試してみたところ、-dオプションが無いと言われてしまいました・・・

OSがSolaris8なのでdateがLinux版と違うのでしょうか・・・

補足日時:2003/11/12 13:24
    • good
    • 0

こんにちは。

このような日付文字列なら date コマンドが解釈してくれます。
また、「20031131」のようなありえない日付は黙って存在する日付に変換されます。

$ date -d "20031131" +%Y%m%d
20031201

これを利用して、変換前の文字列と変換後の文字列を比較して
違いがあればエラーを出せばいいのでは。

#!/bin/sh

datestr="20031131"
result=`date -d $datestr +%Y%m%d`

if [ $datestr -ne $result ]
then
echo "Invalid date"
exit 1
fi

というところでしょうか。

参考URL:http://www.linux.or.jp/JM/html/gnumaniak/man1/da …
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!