Avoir un problème avec un script shell comptant des caractères

11

J'essaie d'apprendre les bases et j'ai rencontré un problème avec mon script comptant les caractères de l'entrée d'un utilisateur. Voici mon script, quelqu'un peut-il indiquer où je me trompe, s'il vous plaît?

#!/bin/bash

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

Réponses:

12

chaque début est difficile:

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

en particulier, il ne doit pas y avoir d'espace autour =et une commande distincte doit être incluse à l'intérieur $(...). En outre, vous souhaiterez peut-être écrire vos variables entre guillemets à l' "aide de cette syntaxe "${INPUT}", cela garantit que la variable n'est pas accidentellement concaténée avec ce qui suit et peut contenir des caractères spéciaux (par exemple, les nouvelles lignes \n).

Sébastien
la source
1
Merci, mon code fonctionne maintenant et l'aide supplémentaire m'aidera à l'avenir. Merci
Jack Slater
@Gnouc Merci pour cette édition perspicace! en train d'apprendre ...
Sebastian
désolé pour référence future, pourriez-vous me dire ce que fait -n et LC_ALL = C.UTF-8 parce que je voudrais connaître son objectif. Merci
Jack Slater
1
pour trouver la signification d'un commutateur de ligne de commande, essayez d'utiliser la mancommande (dans ce cas man echo:) -n do not output trailing newline. L'invocation fréquente de manfera progresser vos compétences Linux rapidement. Pour plus d'informations sur LC_ALL, voir cette question / réponse
Sebastian
1
copier à partir du lien: vous exécutez généralement une commande avec LC_ALL=Cpour éviter que les paramètres de l'utilisateur n'interfèrent avec votre script. Par exemple, si vous souhaitez [a-z]faire correspondre les 26 caractères ASCII de a à z, vous devez définirLC_ALL=C
Sebastian
8

Je pense qu'il serait préférable d'utiliser

len=${#INPUT_STRING}

sinon, le caractère de fin de ligne ajouté par echo sera également pris en compte. Sauf si c'est ce que vous voulez.

bfloriang
la source
Je suis d'accord, c'est plus court et plus rapide.
Franki