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