Q1printf '%s\t%s\n' a bの\tと\nは何を表しますか?
出力とレポート — printf と here-doc で書き出す
この記事は、基礎コマンドからシェルスクリプトまでLinuxの実践的なスキルを1からマスターする「Linux入門講座の一部」です。
printf '%s\t%s\n' で列をそろえ、> >> で結果を追記し2> でエラーを別ファイルへ分け、here-docテンプレートに $(wc -l)を埋め込んだ集計レポートを作る流れを、図解と端末で実習します。
整形して出力する — printf と出力先の振り分け
スクリプトの結果を読みやすく出すには、文字列をそのまま出すechoと、書式を指定して桁や区切りをそろえるprintfを使い分けます。
変数の値を 1 行そのまま出すだけならecho "$v"で十分です。
printf '%s\t%s\n' name ageのように書くと、%sの位置に引数が順に入り、\tはタブ、\nは改行になります。
echoと違いprintfは自動で改行しないので、行末に必ず\nを書きます。
コマンドの出力には標準出力と標準エラーの2系統があります。
> fileは標準出力をファイルへ上書き、>> fileは末尾へ追記、2> fileは標準エラーだけを別ファイルへ振り分けます。
正常な結果はレポートに、エラーは別ファイルに分けると、後から原因を追いやすくなります。
vi fmt.sh # エディタで開き、次の内容を書いて :wq で保存
# #!/bin/sh
# printf '%s\t%s\n' name age # 見出しをタブ区切りで
# printf '%s\t%s\n' alice 30 # データ行をそろえて出力
# echo "done" >> fmt.log # ログには追記
chmod +x fmt.sh
./fmt.sh
>(上書き)/>>(追記)でレポートへ、エラーは2>で別ファイルへ分けます。| 書き方 | 意味 | 例 |
|---|---|---|
echo "$v" | 変数や文字列をそのまま出力する | echo "$name" |
printf "%s\t%s\n" a b | 書式付きで出力する(タブ区切り・改行を明示) | printf '%s\t%s\n' name age |
> f | 標準出力をファイルへ上書きする | echo line > report.txt |
>> f | 標準出力をファイルへ追記する | echo more >> report.txt |
2> err | 標準エラーだけを別ファイルへ分ける | cat missing 2> err.log |
集計レポートを1ファイルにまとめる — here-doc とコマンド置換
決まった体裁のレポートは here-doc で雛形を書き、その中にコマンドの結果を埋め込みます。
cat > report.txt <<EOF … EOFの間に書いた行はそのままファイルになり、$(...)を書くと実行結果がその位置に展開されます。
クォートしない<<EOFでは変数とコマンド置換が展開され、<<'EOF'(シングルクォート付き)では一切展開されず字面のまま出ます。
件数や合計などの集計値はwc -lやgrep -cなどをコマンド置換で取り込みます。
レポートを書き終えたら処理が成功したかどうかをexitのコードで呼び出し元へ返します。
exit 0なら成功、exit 1なら何か問題があったことを意味し、後続の&&や CI から判定できます。
vi summary.sh # エディタで開き、次の内容を書いて :wq で保存
# #!/bin/sh
# log=access.log
# lines=$(wc -l < "$log") # 行数を集計
# cat > summary.txt <<REPORT # テンプレートに値を埋め込む
# --- access summary ---
# total lines: $lines
# REPORT
# echo "summary.txt created"
# exit 0
chmod +x summary.sh
$(wc -l)で集計した値を here-doc テンプレートの$(...)位置に埋め込み、1 つのレポートにまとめます。| 書き方 | 意味 | 例 |
|---|---|---|
<<EOF … EOF | 変数・コマンド置換を展開する here-doc | cat <<EOF > t.txt |
<<'EOF' … EOF | 一切展開せず字面のまま出す here-doc | cat <<'EOF' > t.txt |
$(wc -l < f) | 集計値をコマンド置換で取り込む | n=$(wc -l < access.log) |
exit 0 / exit 1 | 成功・失敗の終了コードを返す | exit 0 |
標準出力とエラーを別ファイルへ分ける
1 つのコマンドが正常な結果とエラーを同時に出すとき、> ok.txt 2> err.txtのように書くと、標準出力はok.txt、標準エラーはerr.txtへ分けて保存できます。
後から「結果」と「問題」を別々に確認できるので、運用スクリプトのログ設計でよく使う形です。
ls /etc /no_such_dir > ok.txt 2> err.txt # 一覧は ok.txt、エラーは err.txt へ
cat ok.txt # /etc の一覧(標準出力)
cat err.txt # /no_such_dir のエラー(標準エラー)
> ok.txt、標準エラーは2> err.txtへ同時に分けて保存できます。| 書き方 | 意味 | 例 |
|---|---|---|
cmd > ok 2> err | 標準出力と標準エラーを同時に別ファイルへ | ls /etc > ok.txt 2> err.txt |
echo "…" 1>&2 | メッセージを標準エラー側へ出す | echo failed 1>&2 |
理解度チェック
まずは1問ずつ答えてみましょう。
Q2コマンドの標準エラーだけを別ファイルへ振り分ける書き方はどれですか?
Q3here-doc のテンプレート内で$(...)の実行結果を埋め込みたいとき、開始タグはどちらにしますか?