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

2018年12月8日

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

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系のハイブリットスクリプトを記述するときは、こういう不具合が起きやすいという事を改めて認識できましたね。 みなさんもお気をつけて・・・

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。