【Shell】ファイルへの書き出し

■ はじめに

小ネタ。

ファイルの書き出しについて、意外と使うのでメモ。
Dockerなんかの簡単な設定ファイル作成にも便利。

目次

【1】ファイル出力
 1)echo を使ったファイル出力
 2)printf を使ったファイル出力
【2】使用上の注意 - printf
 1)「%」を表示したい場合
 2)指定した変数に空白がある場合
【3】サンプル
【4】おまけ1:Dockerファイルでの利用
【5】おまけ2:ヒアドキュメント

【1】ファイル出力

1)echo を使ったファイル出力

* おさらいの意味をこめて、、、

構文

echo "Hello world" > hello.txt

リダイレクション 「>」と「>>」

*「>」: ファイルがあれば上書き
*「>>」: ファイルがあれば追記

オプション「-e」(改行するために)

echo -e "Hello\nWorld\n!!!" > hello3.txt

2)printf を使ったファイル出力

* C言語の printf みたいな感じで使える
* あまりにも古い環境だと使えないかも、、、

https://genzouw.com/entry/2020/02/04/140039/1912/
構文

printf "Hello world" > hello.txt

サンプル

$ printf "Hello\nWorld\n" > hello.txt

$ cat hello.txt
Hello
World

補足:数字のカンマ区切りで表示

$ printf "%'d\n" 1234567890
1,234,567,890

【2】使用上の注意 - printf

* 以下をみると、実用上、printfは扱いづらいかも
 => 数字のカンマ区切りなどの機能を使うなどで使う以外は
  使用を控えた方がよさそう。

1)「%」を表示したい場合

* 「%」を表示したい場合は、「%%」とする

例:HTML出力

# NGケース:そのまま表示する場合 => エラー「invalid format character」が表示
$ printf "<table style='width:60%'>\n"
bash: printf: `>': invalid format character
<table style='width:60

# OKケース:「%%」
$ printf "<table style='width:60%%'>\n"
<table style='width:60%'>

2)指定した変数に空白がある場合

* 指定した変数に空白がある場合、囲み文字で使う必要がある
 => これでバグった。。。
 => 囲み文字で囲うと解消できるが、素直に echo を使った方がいいと思った

例:HTML出力

#!/bin/bash

# <fontの後にスペースが入っている
input="<font color='red'>Error</font>"

echo "[NG CASE]"
printf "<p>%s</p>" ${input}

echo ""
echo "[OK CASE]"
# 囲み文字「"」で囲った
printf "<p>%s</p>" "${input}"

出力結果

$ ./sample.sh
[NG CASE]
<p><font</p><p>color='red'>Error</font></p>
[OK CASE]
<p><font color='red'>Error</font></p>

【3】サンプル

例1:psqlのパスワード

* 以下の関連記事より抜粋

https://dk521123.hatenablog.com/entry/2020/03/06/000000

#!/bin/sh

host_name="localhost"
port="5432"
db_name="sample_db"
user_name="postgres"
user_password="password"

echo "${host_name}:${port}:${db_name}:${user_name}:${user_password}" > ~/.pgpass

chmod 600 ~/.pgpass

【4】おまけ1:Dockerファイルでの利用

* Dockerの簡単なダミーファイル作成時に使えるかと。。。

サンプル

RUN echo $'\n\
[default]\n\
aws_access_key_id = xxx\n\
aws_secret_access_key = xxx\n\
' >> ~/.aws/credentials
RUN chmod 600  ~/.aws/credentials

【5】おまけ2:ヒアドキュメント

https://dk521123.hatenablog.com/entry/2016/05/13/231535

より抜粋
~~~~
* 複数行の文字列を簡潔に記述するための機能
~~~~

サンプル

#!/bin/bash

cat > HelloWorld.txt <<_EOF_
Hello world
How are you?
_EOF_

cat HelloWorld.txt

出力結果

$ ./sample.sh
Hello world
How are you?

参考文献

https://eng-entrance.com/linux-command-echo
https://qiita.com/take4s5i/items/e207cee4fb04385a9952

関連記事

psqlでパスワードを省略する
https://dk521123.hatenablog.com/entry/2020/03/06/000000
ヒアドキュメント ~ 複数行の テキストをファイル出力する ~
https://dk521123.hatenablog.com/entry/2016/05/13/231535
ファイルの内容を表示するコマンド
https://dk521123.hatenablog.com/entry/2016/08/08/235934