Tendo um problema com um script de shell contando caracteres

11

Estou tentando aprender o básico e tive um problema com meu script contando os caracteres das entradas de um usuário. Aqui está o meu script, alguém pode apontar onde estou errado, por favor?

#!/bin/bash

echo "Enter a word!"    
read INPUT_STRING   
len= echo $INPUT_STRING | wc -c 
echo "Your character length is " $len
exit
Jack Slater
fonte

Respostas:

12

todo começo é difícil:

#!/bin/bash
read INPUT
echo $INPUT
len=$(echo -n "$INPUT" | LC_ALL=C.UTF-8 wc -m)
echo $len

especificamente, não deve haver um espaço ao redor =e um comando separado precisa ser colocado dentro $(...). Além disso, você pode escrever suas variáveis ​​entre aspas "usando esta sintaxe "${INPUT}", isso garante que a variável não seja acidentalmente concatenada com o que se segue e pode conter caracteres especiais (por exemplo, novas linhas \n).

Sebastian
fonte
1
Obrigado, meu código funciona agora e a ajuda adicional me ajudará no futuro. Obrigado
Jack Slater
@Gnouc Obrigado por esta edição perspicaz! Ainda aprendendo ...
Sebastian
desculpe-me pela referência futura, você poderia me dizer o que o -n faz e LC_ALL = C.UTF-8 porque eu gostaria de saber qual é o seu objetivo. Obrigado
Jack Slater
1
para encontrar o significado de uma opção de linha de comando, tente usar o mancomando (neste caso man echo: -n do not output trailing newline). A invocação frequente de manavançará rapidamente suas habilidades em Linux. Para obter mais informações LC_ALL, consulte esta pergunta / resposta
Sebastian Sebastian
1
copiar do link: geralmente você executa um comando LC_ALL=Cpara evitar que as configurações do usuário interfiram no seu script. Por exemplo, se você quiser [a-z]combinar os 26 caracteres ASCII de a a z, precisará definirLC_ALL=C
Sebastian
8

Eu acho que preferencialmente seria usar

len=${#INPUT_STRING}

caso contrário, o caractere de fim de linha adicionado pelo eco também será contado. A menos que seja isso que você deseja.

bfloriang
fonte
Eu concordo, é mais curto e mais rápido.
Franki