BLOGTIMES
2011/02/28

bash の $(( )) と expr はどこが違う?

  sh 
このエントリーをはてなブックマークに追加

bashでちょっとした数値の演算をするときは $(( )) か、 expr を使うのが定石と思うのですが、今日までこの2つに挙動の違いがあるということを知りませんでした

前者は0で始まる数値を受け取ると、8進数リテラルと解釈してしまうようで、値が基数よりも大きいという「value too great for base」というエラーを吐きますが、後者にはこのような機能がないようで、0から始まる数値であっても10進数で解釈されています。もしやと思って実験してみましたが、16進数もいけるようです。例えばこんな感じ。

$ echo `expr 09 - 1` 8 $ echo $(( 09 - 1 )) -bash: 09: value too great for base (error token is "09") $ echo $(( 0x10 - 1 )) 15

何でこれに気づいたかというと、隔週で動くようにと作っておいた自分のシェルスクリプトの「$(( `date '+%W'` % 2))」という部分がコケたからです。
この部分については「$(expr $(date '+%W') % 2)」という感じに修正することで事なきを得ました。


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/4091
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン