文字数カウントの練習 (bash)

文字数カウントの練習 (bash)

ユーザー入力の文字数をカウントする次のスクリプトがあります。

    echo -n "Type text: ";
    read mystring;
    echo -n $mystring | wc -m;

最後の行に「-n」がないと、echo によってそこに置かれた改行文字も含まれるため、文字数は間違ってしまいます (したがって、たとえば「abc」の文字数は 3 ではなく 4 になります)。

練習のために、この修正をより複雑な方法で実行したいと思います。大まかな考え方は次のようになります。

     var=$($mystring | wc -m);
     echo -n "Type text: ";
     read mystring;
     echo $(( $var - 1 ));

したがって、ユーザー入力の文字数は $var になり、$var から 1 を減算します。これを機能させるにはどうすればよいですか?

答え1

スクリプトが機能しない理由はいくつかあります:

  • この時点では null なので、varコマンドを実行したときの出力と等しくなるように初期化することから始めます。| wc -mmystring
  • たとえ null でなかったとしても、その内容をコマンドとして実行し、その出力を に送信しようとしますwc

A. 物事を正しい順序で実行し、ii. 正しいことを行う必要があります。

read -p "Type something > " mystring
var="$( wc -m <<< "$foo" )"
echo $(($var-1))

答え2

ユーザーが入力した文字のうち、改行文字を含まない文字数をカウントする場合は、次のようにします。

#! /bin/sh -
printf 'Type text: '
IFS= read -r userInput
length=$(printf %s "$userInput" | wc -m)
# or:
length=${#userInput}

ユーザーが入力した可能性のある改行文字を含める場合は、次のようにします。

#! /bin/sh -
printf 'Type text: '
IFS= read -r userInput && userInput="$userInput
"
length=$(printf %s "$userInput" | wc -m)
# or:
length=${#userInput}

read通常は戻ってくる真実完全な行が入力された場合(改行文字が存在する場合)、read成功した場合は 1 を追加します。

ほとんどのシェル実装 (zshは例外) では、ユーザーが NUL (別名^@) 文字を入力すると正しく動作しないことに注意してください。

これを回避するには、次のようにします。

printf 'Type text: '
length=$(line | wc -m)

代わりに。または:

length=$(line | tr -d '\n' | wc -m)
# or
length=$(($(line | wc -m) - 1)) # as line always includes a newline on
                                # output even if one was not provided on
                                # input.

改行をカウントしたくない場合は、

ユーザーが有効な文字の一部を形成しないバイトを入力した場合も、動作は異なります。また、マルチバイト文字で適切に動作しないsh実装もいくつかあります${#var}(文字ではなくバイトで長さを返します)。

答え3

expr " $mystring" : '.*' - 1

シェル変数の内容の長さを返しますmystring

答え4

bashでは次のように使います

#!/usr/bin/env bash

read -p 'Type text: ' userInput
printf 'Your input was %d chars long\n' "${#userInput}"

文字列の数は で取得できます${#var}wcこの場合 は不要です。

関連情報