echo コマンド 2016/10/22
文字列を引数で渡してそれをそのまま標準出力に出力するコマンド。
引数を複数渡した場合は空白(U+0020)で区切って出力する。
デフォルトでは最後に自動で改行される。
-n
の有無など環境によって仕様は大きく変わるので、移植性の問題は起きやすい。
HOWTO
最後に改行をさせないようにするには 2014/12/24
-n
をつける
$ echo -n "message ..."
printf
コマンドも最後に改行がつかない。
文字を16進で指定して出力するには 2016/11/03
環境によっては \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 で確認)