base64のエンコード結果がターミナルとシェルスクリプトで違ってた件

ちょっとした確認用にシェルスクリプトを書いていたのですが、base64 でエンコードした結果がターミナルと shellscript で異なっていてハマりました。もう同じ轍は踏まねーぜ。

事象の説明

ターミナルで base64 エンコードするコマンドを実行した場合、下記のような結果になります。

# ↓実行コマンド
$ echo -n "hoge" | base64
# ↓出力結果
aG9nZQ==

一方、shellscript で実行した結果が下記です。

#!/bin/bash
echo -n "hoge" | base64
# ↓出力結果
LW4gaG9nZQo=

ターミナルと shellscript で結果が違う 🥺

解決策

echo の代わりに printf を使います。

#!/bin/bash
printf "hoge" | base64
# ↓出力結果
aG9nZQ==

同じになりました 😊

echo はバージョンや shellscript の行頭で指定する shebang(!/bin/bash とか!/bin/sh)に依存して挙動が異なるようです。

まとめ

shellscript では echo の代わりに printf を使うと良いです。