Email Subscription Notifications Suspended Temporarily
We are in the process of making navigation in the Servers and Operating Systems forums simpler and more direct. While doing this, we have to temporarily suspend email notifications for subscriptions. If you are subscribed to one or more discussion boards or blogs in the community, please check them daily to see new content. Notifications will be turned back on in a few days. We apologize for any inconvenience this may cause. Thanks, Warren_Admin
システム管理
キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

letコマンドによる計算について

K_K
時折のアドバイザー

letコマンドによる計算について

いつも参考にさせていただいております。

現在シェルスクリプトにて日付を変数に代入し、

そこから月の数値を取り出して

さらにletコマンドによって2ヶ月前の月にするといったことを行ってます。

しかし、今月に入ってからスクリプトがうまく行かず、

調べた結果letコマンドで数値08に対して計算が出来ないことがわかりました。

webなどで原因を調査しましたが特に見つけることが出来ませんでした。

原因を知っている方がいらっしゃれば、是非お教え願えますでしょうか?

以下にスクリプトの抜粋を載せておきます。

説明不足な点やご不明な点があれば遠慮なくおっしゃってください。

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

↓↓↓スクリプト抜粋↓↓↓

DATE=`date +%Y%m%d%H%M%S`

MM=`echo $DATE|cut -c5-6`

let MM=MM-2 ←右辺のMMが8月(08)、と9月(09)で失敗する
3 件の返信
super32x
時折のビジター

letコマンドによる計算について

推測ですがletコマンドでは、数字の前に0(ゼロ)を付けると8進数と理解して計算していると思います。

よって8進数の08は存在しないため、エラーになっているんじゃないですかね。

DosのSETコマンドでも同じ現象でエラーが出て苦労したのを覚えています。

対策としてletコマンドではなく、exprコマンドを使用してみてはどうですか?

MM=`expr ${MM} - 2`

K_K
時折のアドバイザー

letコマンドによる計算について

super32xさん、早速のご回答誠にありがとうございます。

はい、exprを使用すると確かに実行できました。

今後はexprを使用しようと思います。

しかし、letによる計算は実は数年前から行ってました。

もちろん、去年の8月や9月も行っており当時は問題なく実行されてきました。

今年(今月)に入りなぜか出来なくってしまったのです。これらを今後は調査していこうと思います。

どうもありがとうございました。
isao
頻繁なアドバイザー

letコマンドによる計算について

以下のように変数の前に、その内容が10進数であるという基数を指定すると、letでも大丈夫です。

$ MM=08

$ echo $MM

08

$ let MM=MM-2

sh: 08: The specified number is not valid for this command.

$ echo $MM

08

$ let MM=10#${MM}-2

$ echo $MM

6

SHELLのパッチがインストールされて動作が変わったのかも知れませんね。