2022年02月09日 更新

Linuxコマンドで特殊文字を含む長い文字列をファイル保存

どうも、クラゲジュニアです。
Linuxコマンドで長い文章をファイル保存するときに役立つメモです。
ステップバイステップで実験しながら対策して最後に解決します。
忙しい人は一番最後を見て下さい。

[TOC]

echoで標準出力

まずは画面にそのまま出す例です。
echo "文字列" で行います。

echo "どうも、クラゲジュニアです。"

どうも、クラゲジュニアです。

echoでファイル書き込み

> ファイル名をつけることで上書き保存されます。

echo "どうも、クラゲジュニアです。" > data.txt

ちなみに追加書き込みしたい場合は>>を使ってください。

以降の実験は、簡単にするために標準出力で行います。

ダブルクォートがある場合

NG例

文字列の中にダブルクォートがある場合、意図通りに表示されません。

echo "どうも、"クラゲジュニア"です。"

どうも、クラゲジュニアです。

暫定対策

echo '文字列' で行います。

echo 'どうも、"クラゲジュニア"です。'

どうも、"クラゲジュニア"です。

しかし、ダブルクォートもシングルクォートもある場合は別の対策が必要です。

恒久対策

バックスラッシュ記号\を使ってエスケープします。

echo "どうも、\"クラゲジュニア\"です。"

どうも、"クラゲジュニア"です。

他にも特殊文字がある

先ほどのダブルクォートやシングルクォートは「メタ文字」と呼ばれる特殊な文字です。長い文章などの場合は、中に様々なメタ文字が混ざっている可能性があります。

echo "どうも、クラゲジュニアです。現在$1は115円です。"

どうも、クラゲジュニアです。現在は115円です。

$がメタ文字のため、$1が表示されていません。

1つずつエスケープ対応するのは大変です。そこでヒアドキュメントというものを使います。

ヒアドキュメント

cat << "EOF"
どうも、クラゲジュニアです。現在$1は115円です。
EOF

どうも、クラゲジュニアです。現在$1は115円です。

問題なく表示できました。

cat << "終端文字列"がヒアドキュメントです。
以下のように終端文字列を入力するまで、複数行を入力できます。

cat << "EOF"
どうも、クラゲジュニアです。
現在$1は115円です。
以上クラゲでした!
EOF

どうも、クラゲジュニアです。 現在$1は115円です。 以上クラゲでした!

終端文字列はEOF以外の任意の文字列で問題ありません。
ちなみに、cat << "EOF" ではなく cat << EOFとするとエスケープされないので注意してください!

まとめ

Linuxコマンドで長い文字列をファイル保存する具体例は以下の通りです。

cat << "EOF" > data.txt
どうも、"クラゲジュニア"です。
現在$1は'115円'です。
以上クラゲでした!
EOF

特殊文字も含め、問題なくdata.txtに書き込まれています。

以上です。