我有以下脚本来计算用户输入中的字符:
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
在这种情况下没有必要使用