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