日付/時刻のゼロサプレス

対象:csh、tcsh

Cシェルの日付計算ジ時の0の扱い

dateコマンドで日付や時刻を取得した場合、ゼロ付きというかゼロで先頭を埋めて返ってくるものがあります。man dateを見てください。

       %H     hour (00..23)

       %I     hour (01..12)

       %j     day of year (001..366)

       %k     hour ( 0..23)

       %l     hour ( 1..12)

       %m     month (01..12)

       %M     minute (00..59)

       %S     second (00..60)


抜粋したものを載せました。

時などは、%H の代わりに %k を使うなどすれば良いのですが、分や秒はどうしても0が付く場合があります。0が付いたままシェルの中で計算するとエラーになる場合があります。下記に例を示します。

% @ b = 8 + 1
% echo $b
9

% @ b = 08 + 1
@: 番号が正しい書式になっていません.

例では 8 と 08 で比較していますが、二桁であればうまく動いてしまいます。

そこで、先頭から続く0を考慮する必要があります。やり方としては2つあります。サンプルにあるように @を 使いたい場合と、@ をやめる方法です。

200×200 高速大容量レンタルサーバ10G
mixhost

@を使う場合

@ に与える変数からあらかじめ0を取り除きます。やり方は、bc コマンドを使い、値に影響しない0を足すという処理をさせます。

% set a = 08
% @ b = $a + 1
@: 番号が正しい書式になっていません.

% set a = `echo $a + 0 | bc`
% @ b = $a + 1
% echo $b
9

 

@をやめる場合

いっそのこと、@ を使うのをやめます。前者の解決策にも出てきた bc に置き替えます。expr コマンドでもいいですが、ちょっと複雑な計算式になると対応できないので、bc にしておいたほうが無難です。

% set a = 08
% @ b = $a + 1
@: 番号が正しい書式になっていません.

% set b = `echo $a + 1 | bc`
% echo $b
9

いかがでしょうか、bc はプロセスを起こす必要があるので、ループ中で使ったりすると性能が犠牲になりますが、単発の計算であれば思ったとおりの計算をしてくれます。




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です