echo コマンド

文字列を引数で渡してそれをそのまま標準出力に出力するコマンド。

引数を複数渡した場合は空白(U+0020)で区切って出力する。

デフォルトでは最後に自動で改行される。

-n の有無など環境によって仕様は大きく変わるので、移植性の問題は起きやすい。

HOWTO

最後に改行をさせないようにするには

-n をつける

$ echo -n "message ..."

printf コマンドも最後に改行がつかない。

文字を16進で指定して出力するには

環境によっては \x61 のような16進表記で文字を書ける。

環境によらず同じ動きをさせるにはechoよりもprintfコマンドのほうがよい。

$ /usr/bin/printf '\x61\xE3\x81\x82'
aあ

単に printf と書くと、シェルの組み込み関数が起動して、シェルによって挙動が異なってしまう。

printfecho と違ってデフォルトで最後に改行が付かない。

以下の例のように、\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 で確認)

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。