Macのシェルスクリプト内で echo -n しても改行が抑制されない件

echoコマンドはオプションなしだと指定文字列に改行を付けて表示します。-nオプションを付けると改行を出力しなくなります。odコマンドでダンプ出力してみるとよくわかります。

$ echo ABC | od -t x1
0000000 41 42 43 0a
0000004
$ echo -n ABC | od -t x1
0000000 41 42 43
0000003

ところがMacの場合、シェルスクリプト内で echo -n を使うと -n 部分を文字列として出力してしまい、かつ、改行を付けてしまいます。

$ cat echoABC1.sh ←内容表示
#!/bin/sh
echo -n ABC
$ sh echoABC1.sh ←実行
-n ABC

なんでこうなるか詳しく調べてませんが、どうもシェルスクリプトでechoとするとシェルの内部コマンドのechoを呼び出してしまいそのechoは改行抑制オプションがないっぽいです。なので、外部コマンドの/bin/echoを絶対パス指定で実行すればこの問題を回避できます。

$ cat echoABC2.sh ←内容表示
#!/bin/sh
/bin/echo -n ABC
$ sh echoABC1.sh ←実行
ABC

LinuxとかFreeBSDだとシェルスクリプト内での echo -n が有効なので、そうなっているシェルスクリプトをそのままMacに持ってきて使おうとするとハマるかもしれませんね。MD5ハッシュ取ったりBase64エンコードしたりするとき改行が邪魔になるので-nオプションは結構使うんですよね。気をつけましょう。

「Macのシェルスクリプト内で echo -n しても改行が抑制されない件」への1件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA