- blogs:
- cles::blog
2011/02/28

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

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 を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
- crontab -r とやってしまった... (2)
- Jawbone Companion (beta) (1)
- GPS ロガーを自作 (1)
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(114354)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112887)
3 . 年次の人間ドックへ(112323)
4 . 2023 年分の確定申告完了!(1つめ)(111888)
5 . 三菱鉛筆がラミーを買収(111766)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112887)
3 . 年次の人間ドックへ(112323)
4 . 2023 年分の確定申告完了!(1つめ)(111888)
5 . 三菱鉛筆がラミーを買収(111766)
cles::blogについて
Referrers