TL;DR
POSIX 準拠の tr
コマンドでは文字の範囲指定に [ ]
は不要です。[0-9]
のような書き方は System V 版の古い書き方であり、0-9
と書くのが POSIX 準拠の今の書き方です。いずれの環境でも動く書き方であり POSIX 準拠の環境を最低基準とするならば古い書き方をする必要はありません。[0-9]
でも動くように思えるかもしれませんが -d
オプションを指定した場合に困ることになります。正規表現の書き方と混乱するという方は「tr
コマンドは正規表現は使えない」で覚えると良いのではないかと思います。
完
System V 版を考慮した書き方をする必要はないよ
「System V 版の書き方をしないと動かない環境がある」と反論されそうなので指摘しておくと、それは 「Unix 互換モード」から「POSIX 準拠モード」に切り替えていないだけです。(注意 「Unix 互換モード」と「POSIX 準拠モード」は私がつけた便宜上の名前です)
商用 UNIX の一部(すべて?)では後方互換性を維持するためにデフォルトでは System V 版のコマンドが使われるようになっている場合があります。その場合でも Unix の認証を取得しているのであれば POSIX にも準拠しているので、どこかに POSIX 版の tr
コマンドを使う方法が必ずあります。
「POSIX 準拠モード」と「Unix 互換モード」
「POSIX 準拠モード」の事を知らなければ気がつきにくい点だとは思いますが man ページや OS ベンダーが提供してるドキュメントには書いていると思います。ただしこれは OS ベンダーが用意している OS 固有の機能であるため POSIX には書かれていません。POSIX しか参照してないような人は気がついてないかもしれません。ただし POSIX の tr コマンドのページ の下にある RATIONALE には BSD 版の動作を採用したというようなことが書いてあるので、ちゃんと読んでいれば何かがおかしいと気づくはずです。
こういった点から POSIX に準拠させる方法にたどり着けると思うのですが、ドキュメントを読まずにコードばかり書いているような人や知識をアップデートしない人は「POSIX 準拠モード」のことを知らずにいつまでも古い「Unix 互換モード」を使い続けてしまうことになります。「Unix 互換モード」は OS のアップデート時の互換性を保つためのもので、常用するために用意されているのではありません。少しずつ POSIX 準拠のコードに置き換えていけるようにするためのものです。
「Unix 互換モード」は POSIX に準拠してないので、さまざまなコマンドの動作が POSIX に準拠していません。例えば awk
コマンドは関数が使えません。OS 間での互換性問題がひどかった古い時代の Unix コマンドを使い続けるということは、今書いているコードも POSIX に準拠してないコードになっている可能性があるということです。例えば将来 OS を Linux にリプレースする場合などに移植性の問題が出来る可能性があるので注意してください。POSIX に準拠している実装間でも完全に同じ動作をしてないというのに System V 版のコマンドにまで対応していたのではいくら時間があっても足りません。
さいごに
ソフトウェア開発業界では新しいことを学ばずに同じやり方を続けていても技術力は上がりません。残念ながら一度覚えた知識が何年もずっと使えることはないのです。新しく優れたやり方が登場しつづける世界では、同じやり方を続けるというのは相対的に生産性を下げ続けるということを意味しています。ハードウェアは買い換えれば性能は向上しますが、ソフトウェアはやり方を変えねば生産性は向上しません。
tr
コマンドは OS のサポート期間を考慮しても 10 ~ 20 年前には System V 版を考慮した書き方をする必要は完全になくなっていたはずです。必要なものは昔の Unix に対応させるための古い知識ではなく POSIX に準拠させるための新しい知識です。・・・いや別にそんなに新しい知識でもないのですが。
関連記事「シェルスクリプトの [ は /bin/[ と言ったり [ "x$var" = "xval" ] と書く人はオジサン」