web-dev-qa-db-ja.com

なぜ "wc -c"はエコーで1つの値を出力するのですか?

実行中

echo abcd | wc -c

5を返します。
しかし、単語abcdは4文字しかありません。

echoは単語の後に特殊文字を印刷していますかabcd

そして、echoがそれを印刷しないようにできますか?

13
user78050

echo行末に改行を印刷(\n

echo abcd | xxd
0000000: 6162 6364 0a          abcd.

一部のecho実装では、-nを使用できます。

-n末尾の改行を出力しません

そしてテスト:

echo -n abcd | wc -c
4

その他の場合、\cエスケープシーケンスが必要です。

\c :出力の最後の引数の後に続く<newline>を抑制します。引数の'\c'に続くすべての文字は無視されます。

echo -e 'abcd\c' | wc -c
4

移植性の高い、printfを使用:

printf %s abcd | wc -c
4

wc -cは文字ではなくバイトをカウントすることに注意してください(ただし、abcdの場合、それらは一般的に同等です。文字をカウントするにはwc -mを使用します)。

21

-nオプションなしでechoを実行すると、引数の後に改行文字が書き込まれます。それ以外の場合、echo fooと入力すると、次のシェルプロンプトがfooの右側に表示されます。つまり、wcは改行をカウントしています。

echoがそれを印刷しないようにするにはどうすればよいですか?

echo -n abcd | wc -c

デフォルトでは、echoは文字列の後に 改行文字\n)を出力します(そのため、同じ行ではなく次の行にシェルプロンプトが表示されます) abcdが出力されます。)

-nパラメータをechoに追加して、末尾の改行文字を無効にすることができます。

echo -n abcd | wc -c
4