wc -c me dá uma contagem extra de caracteres

0

Então, criei um script que adiciona usuários ao sistema e queria forçar o comprimento dos nomes de usuário para 8 caracteres ou menos.

#!/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

Esse é o script completo, mas acho que o problema está aqui apenas em algum lugar:

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

Portanto, o problema com isso é que, sempre que eu insiro um nome de usuário de 8 caracteres, a variável nrchar parece sempre adicionar mais um caractere a ele, assim:

[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]$ 

Mesmo que eu deixe em branco, ainda conta de alguma forma um caractere:

[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:

Como identificar esse problema?

    
por iamAguest 20.08.2018 / 15:47

2 respostas

5

Even if I leave it blank, it still somehow counts one character [. . .] Could somebody please help me identify this problem?

Experimente printf em vez de echo

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

Usando echo , wc contará um caractere de nova linha.

Ou, talvez melhor, use Bash puro sem canalizar para wc :

$ string=foobar
$ echo "${#string}"
6
    
por 20.08.2018 / 15:50
0

Eu preferiria o método "expansão de parâmetro" do shell também; mas se você usar wc , também poderá usar sua opção de contagem de palavras:

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

Você pode querer ter certeza de que somente caracteres ASCII sejam usados - não há caracteres internacionais de vários bytes.

Se você for para o caminho bash internals, a verificação de espaços pode ser

[ "$USERNAME" = "${USERNAME%% *}" ] && echo No spaces || echo some spaces
    
por 20.08.2018 / 16:12