てきとーなブログ

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

Macプログラミング

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オプションは結構使うんですよね。気をつけましょう。