LoginSignup
2
1

More than 1 year has passed since last update.

echoで改行を反映させ正しくエンコードする

Last updated at Posted at 2021-07-30

はじめに

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
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1