はじめに
echo
コマンドを使って改行を含む文字列をエンコード/デコードした際、正しく復元できない状態に陥りました。
原因はエンコードする際にエスケープ文字を認識してくれないという点にあり、調べたところ、-e
というオプションを加えることで、エスケープ文字を認識できるということが分かりました。
結論
- echoコマンドにオプション
-e
をつけることでエスケープ文字(\n: 改行
,\t: タブ
等)が有効になる
$ echo -e "Hello\nWorld"
=> Hello
World
環境
- macOS Catalina 10.15.5
- bash
出力の確認
「-e」なしの場合
-eのオプションを追加しないと 「\n」がエスケープ文字ではなく単純な文字として認識され改行が反映されません。
$ echo "Hello\nWorld"
=> Hello\eWorld
「-e」ありの場合
すると、「\n」がエスケープ文字として認識され正しく出力されることが分かります。
$ echo -e "Hello\nWorld"
=> Hello
World
ダブルクォーテーション("")なしの場合
""をつけない場合は「\n」ではなく 「\\n」 をつけないと認識してくれません。
$ echo -e Hello\nWorld
=> HellonWorld
$ echo -e Hello\\nWorld
=> Hello
World
エンコードしてみる
「-e」オプションでエスケープ文字が有効になり改行が反映されるようになったので実際にエンコードしてみます。
- エンコード/デコードは
base64
コマンドにより実行できます。
# エンコード
echo "文字列" | base64
# デコード
echo "文字列" | base64 -D
(--decode)
※ base64コマンドはGNU coreutilsと呼ばれるパッケージ(echo
, cat
, ls
等のUNIX系のOSで使われることが多い基本的なコマンドが格納されている)に含まれているそうです。
「-e」なしの場合
改行が反映されないので復元した結果も改行されていません。
# エンコード
$ echo "Hello\nWorld" | base64
=> SGVsbG9cbldvcmxkCg==
# デコード
$ echo "SGVsbG9cbldvcmxkCg==" | base64 -D
=> Hello\nWorld
「-e」ありの場合
改行が反映され正しく復元できていることが分かります。
# エンコード
$ echo -e "Hello\nWorld" | base64
=> SGVsbG8KV29ybGQK
# デコード
$ echo "SGVsbG9cbldvcmxkCg==" | base64 -D
=> Hello
World