Se você quiser contar o número de caracteres em que o usuário inseriu, mas não incluindo o caractere de nova linha, deverá estar:
#! /bin/sh -
printf 'Type text: '
IFS= read -r userInput
length=$(printf %s "$userInput" | wc -m)
# or:
length=${#userInput}
Se você quiser incluir o caractere de nova linha que o usuário possivelmente inseriu, então:
#! /bin/sh -
printf 'Type text: '
IFS= read -r userInput && userInput="$userInput
"
length=$(printf %s "$userInput" | wc -m)
# or:
length=${#userInput}
read
normalmente retornará verdadeiro se uma linha completa foi inserida (o caractere de nova linha está presente) e é por isso que adicionamos um se read
for bem-sucedido.
Observe que na maioria das implementações do shell ( zsh
sendo a exceção), ele não funcionará corretamente se o usuário inserir um caractere NUL (também conhecido como ^@
).
Para contornar isso, você poderia fazer:
printf 'Type text: '
length=$(line | wc -m)
em vez disso. Ou:
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.
se você não quiser contar a nova linha.
O comportamento também variará se o usuário conseguir inserir bytes que não fazem parte de caracteres válidos. Você também encontrará algumas sh
implementações cujo ${#var}
não funciona corretamente com caracteres de múltiplos bytes (retornaria o comprimento em bytes em vez de caracteres).