wc -cと${#}の違いは何ですか?

wc -cと${#}の違いは何ですか?

base64を使用して文字列を28回エンコードするスクリプトを作成しました。その後、出力文字列に文字数を表示したいと思います。

${#var}最初はそれを使って34070を得ました。

それから同じロープを使ってみました。

script.sh | wc -c

これは私に34071を与えます。

#!/bin/bash
var="9M"
for i in {1..28};do
var=$(echo $var | base64)
done
echo ${#var}

これら2つの出力は正確にどのように違いますか?

答え1

この例に示すように、show bytes コマンドを使用すると、od改行文字が印刷されます。

$エコfoo OD-CB |
0000000 金持ち  \N
        146157157012
0000004

したがって、この場合は改行文字wc -cも計算されます。wc -m

改行なし:

$ echo -n foo | od -c -b
0000000   f   o   o
        146 157 157
0000003

したがって、を使用している場合は、改行文字を印刷しないように適切echoなオプションを追加するか、次の手順を実行します。-nprintf

$ printf "%s" foo | od -c -b
0000000   f   o   o
        146 157 157
0000003

答え2

追加の文字は改行文字です。たとえば、次のようにするとこれを見ることができます。

echo $var | hd | tail

関連情報