字符计数练习 (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在这种情况下没有必要使用

相关内容