Então fiz 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á apenas aqui 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 se eu deixar em branco, ele ainda conta 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 este problema?
Tente
printf
em vez deecho
Usando
echo
,wc
contará um caractere de nova linha.Ou, talvez melhor, use Bash puro sem tubulação para
wc
:Eu também preferiria o método de "expansão de parâmetros" do shell; mas se você usar
wc
, também poderá usar a opção de contagem de palavras:Você pode querer certificar-se de que apenas caracteres ASCII sejam usados - sem caracteres internacionais multibyte.
Se você seguir o
bash
caminho interno, a verificação de espaços pode ser