bashスクリプト内で数値を3桁ごとにカンマ区切りにする命令がエラーになる時の対応方法

2018年12月8日

Shell テクノロジー トラブル プログラミング

t f B! P L
Shellスクリプトを書いている時に意図せずエラーが出る事があり、ハマってしまいました。 桁数の多い数値を表示する際に、3桁ごとにカンマ区切りにしたい場合、printfを使って、下記のように書けば、コマンドを入力すると簡単に表示する事ができます。 printf "%'d\n" 10000 > 10,000 なんでシングルクォーテーションで3桁区切りになるのかは、「おまじない」だと思って使いましょう。 さらに、この命令は、ロケールの環境変数が"export LANG=ja_JP.utf-8;"になっていないと使えない命令なのだそうです。

shellスクリプト(bash)内で使うと何故かエラーになる事象発生

shellスクリプトを使って、色々なデータの値を表示する際に、桁数が多いものに3桁カンマをつけようと思い、上記の記述を行ったところ、"printf: %': invalid directive"とエラー表示がされる・・・ 通常shellスクリプトでは、`(バッククォート)を使って、値を変数に格納する書き方ができるが、その中は、コマンドをそのまま書く事ができる。 今回のスクリプトは以下のような感じだ。 test=100000 number=`printf "%'d" $test` echo number これを実行すると、上記のエラーが発生する。 %'でエラーが出ているので、他のprintf分も試して見る。 printf "9keta : %09d\n" 100000 > 9keta : 000100000 printf "string : %s\n" 100000 string : 100000 printf "float : %.3f\n" 100000 float : 100000.000 どれもうまく行くんだな・・・ どうやら'(シングルクォート)がよろしくないようだ。

解決方法

シングルクォートを\(バックスラッシュ)をつけてエスケープしてみても、まったく効果が無く、行き着いた解決方法は以下のように記述するだけでした。 /usr/bin/printf "number-format : %'d\n" 100000 > number-format : 100,000 printfモジュールをフルパスで書く事で、何故か正常に表示されてしまいました。 ちなみに、この事象が発生したサーバーはDebian系Linuxだったので、CentOS系で同じプログラムを実行してみたところ、そちらでは問題なく動作しました。 Debian系とCentOS系のハイブリットスクリプトを記述するときは、こういう不具合が起きやすいという事を改めて認識できましたね。 みなさんもお気をつけて・・・

このブログを検索

プロフィール

自分の写真
プログラミングとサーバーを心の底から楽しむクリエーターです。 経営者であり、開発者でもありますが、得意としているのは、アイデア創出で、出来高は無限大です。

ブログ アーカイブ

QooQ