字元計數練習 (bash)

字元計數練習 (bash)

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

    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,然後我從 $var 中減去 1。我該如何讓它發揮作用?

答案1

您的腳本無法執行有以下幾個原因:

  • 首先將其初始化var為等於運行命令的輸出,| wc -m因為mystring此時 為 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成功時追加一個。

請注意,在大多數 shell 實作中(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

將返回 shell 變數內容的長度mystring

答案4

在 bash 中你會使用

#!/usr/bin/env bash

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

字串計數可以透過 檢索${#var}wc在這種情況下沒有必要使用

相關內容