Bash

字元計數練習(bash)

  • November 17, 2018

我有以下腳本計算使用者輸入中的字元:

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

如果最後一行中沒有“-n”,字元計數將是錯誤的,因為它還包括由 echo 放在那裡的換行符(因此例如“abc”的計數將是 4 而不是 3。)

為了練習起見,我現在想以更複雜的方式進行此校正。大體構想是這樣的:

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

所以使用者輸入的字元數變成了 $ var and then I subtract 1 from $ 變種。我如何使它工作?

您的腳本不起作用有幾個原因:

  • 您首先初始化var為等於執行命令的輸出,| wc -m因為mystring此時為空。
  • 即使它不為空,它也會嘗試將其內容作為命令執行,並將該輸出發送到wc.

你必須 A> 以正確的順序做事,並且 ii.> 做正確的事:

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

如果要計算使用者輸入的字元數,但不包括換行符,則應為:

#! /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如果輸入了整行(存在換行符),通常會返回trueread ,這就是我們在成功時添加一個的原因。

請注意,在大多數 shell 實現中(例外),如果使用者輸入 NUL(又名)字元zsh,它將無法正常工作。^@

要解決此問題,您可以執行以下操作:

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}

引用自:https://unix.stackexchange.com/questions/361039