echo / printf
| 対応: | echo | 全Linux |
|---|---|---|
| macOS(2001 Cheetah) | ||
| Bash 1.0(1989) | ||
| printf | 全Linux | |
| macOS(2001 Cheetah) | ||
| Bash 2.0(1996) |
『echo』は文字列を標準出力に表示するコマンドです。『printf』はC言語の同名関数に似た書式指定付き出力ができ、改行の制御や数値の整形が可能です。
構文
echo [オプション] [文字列...] printf 書式 [引数...]
オプション・書式一覧
| コマンド / 書式 | 概要 |
|---|---|
| echo 文字列 | 文字列を表示して末尾に改行を出力します。 |
| echo -n 文字列 | 末尾の改行を出力しません。 |
| echo -e 文字列 | バックスラッシュエスケープを解釈します(\n・\t・\033[など)。 |
| echo $変数 | 変数の値を展開して表示します。 |
| printf "%s\n" 文字列 | 書式指定で文字列を出力します。 |
| printf "%d\n" 数値 | 整数として出力します。 |
| printf "%05d\n" 数値 | 5桁ゼロ埋めで出力します。 |
| printf "%.2f\n" 数値 | 小数点2桁で出力します。 |
| printf "%10s\n" 文字列 | 10文字幅で右詰め出力します。 |
| printf "%-10s\n" 文字列 | 10文字幅で左詰め出力します。 |
サンプルコード
『echo』で文字列を表示します。
echo "Hello, World!" Hello, World!
変数の値を展開して表示します。
sample_greeting.sh
NAME="岡部倫太郎" echo "Hello, $NAME!"
実行するコマンドは次の通りです。
bash greeting.sh Hello, 岡部倫太郎!
『-n』オプションで末尾の改行を出力しません。プロンプト表示などに使います。
sample_echo_n.sh
echo -n "Processing..." echo " done!"
実行するコマンドは次の通りです。
bash echo_n.sh Processing... done!
『-e』オプションでエスケープシーケンスを解釈します。色付き出力ができます。
sample_color.sh
echo -e "\033[32mSuccess!\033[0m" echo -e "\033[31mError!\033[0m"
実行するコマンドは次の通りです。
bash color.sh Success! Error!
『printf』で書式指定付きの出力ができます。整数やゼロ埋めが可能です。
printf "%d\n" 42 42
ゼロ埋めで連番を出力します。ファイル名の生成などに便利です。
sample_numbering.sh
for i in 1 2 3; do
printf "file_%03d.txt\n" $i
done
実行するコマンドは次の通りです。
bash numbering.sh file_001.txt file_002.txt file_003.txt
なお、for 文はターミナルでも直接入力できます。『do』の後で Enter を押すと『> 』マークが表示され、これは「まだ入力が続く」というサインで、『done』を入力すると実行されます。
for i in 1 2 3; do
printf "file_%03d.txt\n" $i
done
file_001.txt
file_002.txt
file_003.txt
『printf』でテーブル形式の整形出力をします。『%-10s』は左詰め10文字幅、『%5d』は右詰め5文字幅です。
sample_table.sh
printf "%-10s %5s\n" "Name" "Score" printf "%-10s %5d\n" "岡部倫太郎" 95 printf "%-10s %5d\n" "牧瀬紅莉栖" 87
実行するコマンドは次の通りです。
bash table.sh Name Score 岡部倫太郎 95 牧瀬紅莉栖 87
概要
移植性を重視するスクリプトでは『$ echo -e』よりも『$ printf』を使う方法がよく見られます。『$ echo -e』の動作はシェルや実装によって異なる場合がありますが、『$ printf』はPOSIX標準で動作が保証されています。
標準入力から行を読み取るには『read』を使います。出力をファイルに書き込むには『リダイレクト(>)』を参照してください。
よくあるミス
よくあるミス1: echo -e がシェルによって動作しない
bash では『echo -e』でエスケープ文字が展開されますが、sh や dash では展開されない場合があります。
/bin/sh -c 'echo -e "a\tb"' -e a b
エスケープ文字を使いたい場合は printf を使うと環境に依存しません。
printf "a\tb\n" a b
よくあるミス2: printf で改行を付け忘れる
printf は echo と違い改行を自動で付けません。末尾に『\n』を付け忘れると次の出力と繋がります。
printf "処理開始" printf "完了" 処理開始完了
各 printf の末尾に『\n』を付けます。
printf "処理開始\n" printf "完了\n" 処理開始 完了
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。