対象: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つあります。サンプルにあるように @を 使いたい場合と、@ をやめる方法です。
@を使う場合
@ に与える変数からあらかじめ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 はプロセスを起こす必要があるので、ループ中で使ったりすると性能が犠牲になりますが、単発の計算であれば思ったとおりの計算をしてくれます。