wc -c 给我一个额外的字符数

wc -c 给我一个额外的字符数

所以我制作了一个向系统添加用户的脚本,并且我想强制用户名的长度为 8 个字符或更少。

#!/bin/bash
# Only works if you're root

for ((a=1;a>0;a)); do
 if [[ "$UID" -eq 0 ]]; then
  echo "Quit this shit anytime by pressing CTRL + C"
  read -p 'Enter one usernames: ' USERNAME
  nrchar=$(echo ${USERNAME} | wc -c)
  echo $nrchar
  spcount=$(echo ${USERNAME} | tr -cd ' ' | wc -c)
  echo $spcount
  if [[ "${nrchar}" -ge 8 ]]; then
    echo "You may not have more than 8 characters in the username"
   elif [[ "${spcount}" -gt 0 ]]; then
    echo "The username may NOT contain any spaces"
   else
     read -p 'Enter one names of user: ' COMMENT
     read -s -p 'Enter one passwords of user: ' PASSWORD
     useradd -c "${COMMENT}" -m ${USERNAME}
     echo ${PASSWORD} | passwd --stdin ${USERNAME}
     passwd -e ${USERNAME}
   fi
 echo "------------------------------------------------------"
 else
  echo "You're not root, so GTFO!"
  a=0
 fi
done

这是完整的脚本,但我认为问题只出在某个地方:

  read -p 'Enter one usernames: ' USERNAME
  nrchar=$(echo ${USERNAME} | wc -c)
  echo $nrchar

所以问题是,每当我输入 8 个字符的用户名时,nrchar 变量似乎总是向其中添加一个字符,如下所示:

[vagrant@localhost vagrant]$ sudo ./exercise2-stuffs.sh
Quit this shit anytime by pressing CTRL + C
Enter one usernames: userdoi1
9
0
You may not have more than 8 characters in the username
------------------------------------------------------
Quit this shit anytime by pressing CTRL + C
Enter one usernames: ^C
[vagrant@localhost vagrant]$ 

即使我将其留空,它仍然会以某种方式计算一个字符:

[vagrant@localhost vagrant]$ sudo !.
sudo ./exercise2-stuffs.sh
Quit this shit anytime by pressing CTRL + C
Enter one usernames:
1
0
Enter one names of user:

如何识别这个问题呢?

答案1

即使我将其留空,它仍然会以某种方式计算一个字符[。 。 .] 有人可以帮我找出这个问题吗?

尝试printf代替echo

$ echo "" | wc -m
1
$ printf "" | wc -m
0

使用echo,wc将计算换行符。

或者,也许更好的是,使用纯 Bash 而不使用管道wc

$ string=foobar
$ echo "${#string}"
6

答案2

我也更喜欢 shell 的“参数扩展”方法;但如果你使用wc,你也可以使用它的字数统计选项:

read LENGTH WORDS REST <<<$(echo -n ${USERNAME} | wc -cw)
echo $LENGTH $WORDS 
2 8

您可能需要确保仅使用 ASCII 字符 - 不使用多字节国际字符。

如果您走bash内部路径,则可能会检查空格

[ "$USERNAME" = "${USERNAME%% *}" ] && echo No spaces || echo some spaces

相关内容