文字列を引数で渡してそれをそのまま標準出力に出力するコマンド。
引数を複数渡した場合は空白(U+0020)で区切って出力する。
デフォルトでは最後に自動で改行される。
-n
の有無など環境によって仕様は大きく変わるので、移植性の問題は起きやすい。
-n
をつける
$ echo -n "message ..."
printf
コマンドも最後に改行がつかない。
環境によっては\x61
のような16進表記で文字を書ける。
環境によらず同じ動きをさせるにはecho
よりもprintf
コマンドのほうがよい。
$ /usr/bin/printf '\x61\xE3\x81\x82'aあ
単にprintf
と書くと、シェルの組み込み関数が起動して、シェルによって挙動が異なってしまう。
printf
はecho
と違ってデフォルトで最後に改行が付かない。
以下の例のように、\x61
などと書いてシェルによらず16進数表記で解釈してほしい場合は、シェル組み込みに頼らずに外部コマンドの/usr/bin/printf
を使うしかない。
シェル組み込みのprintf
zshの場合
$ printf '\x61\xE3\x81\x82'aあ$ printf "\x61\xE3\x81\x82"aあ
bashの場合
$ printf '\x61\xE3\x81\x82'aあ$ printf "\x61\xE3\x81\x82"aあ
dashの場合
$ printf '\x61\xE3\x81\x82'\x61\xE3\x81\x82$ printf "\x61\xE3\x81\x82"\x61\xE3\x81\x82
外部コマンドのprintf
zshの場合
$ /usr/bin/printf '\x61\xE3\x81\x82'aあ$ /usr/bin/printf "\x61\xE3\x81\x82"aあ
bashの場合
$ /usr/bin/printf '\x61\xE3\x81\x82'aあ$ /usr/bin/printf "\x61\xE3\x81\x82"aあ
dashの場合
$ /usr/bin/printf '\x61\xE3\x81\x82'aあ$ /usr/bin/printf "\x61\xE3\x81\x82"aあ
シェル組み込みのecho
zshの場合
$ echo '\x61\xE3\x81\x82'aあ$ echo "\x61\xE3\x81\x82"aあ
bashの場合
$ echo '\x61\xE3\x81\x82'\x61\xE3\x81\x82$ echo "\x61\xE3\x81\x82"\x61\xE3\x81\x82
dashの場合
$ echo '\x61\xE3\x81\x82'\x61\xE3\x81\x82$ echo "\x61\xE3\x81\x82"\x61\xE3\x81\x82
外部コマンドのecho
zshの場合
$ /bin/echo '\x61\xE3\x81\x82'\x61\xE3\x81\x82$ /bin/echo "\x61\xE3\x81\x82"\x61\xE3\x81\x82
bashの場合
$ /bin/echo '\x61\xE3\x81\x82'\x61\xE3\x81\x82$ /bin/echo "\x61\xE3\x81\x82"\x61\xE3\x81\x82
dashの場合
$ /bin/echo '\x61\xE3\x81\x82'\x61\xE3\x81\x82$ /bin/echo "\x61\xE3\x81\x82"\x61\xE3\x81\x82
(Ubuntu 14.04 で確認)