574 votes

Longueur de la chaîne en bash

Comment obtenir la longueur d'une chaîne de caractères stockée dans une variable et l'affecter à une autre variable ?

myvar="some string"
echo ${#myvar}  
# 11

Comment définir une autre variable à la sortie 11 ?

19voto

Dick Guertin Points 37

Si vous voulez l'utiliser avec des arguments de ligne de commande ou de fonction, assurez-vous d'utiliser size=${#1} au lieu de size=${#$1} . La seconde est peut-être plus instinctive mais sa syntaxe est incorrecte.

14 votes

Une partie du problème avec "vous ne pouvez pas faire <syntaxe invalide>" est que, cette syntaxe étant invalide, il n'est pas clair ce qu'un lecteur doit interpréter comme signifiant. size=${#1} est certainement valable.

0 votes

Eh bien, c'est inattendu. Je ne savais pas que #1 était un substitut de $1 dans ce cas.

16 votes

Ce n'est pas le cas. # ne remplace pas le $ -- le $ à l'extérieur des accolades est toujours l'opérateur d'expansion. Le site # est l'opérateur de longueur, comme toujours.

17voto

thistleknot Points 427

En utilisant l'exemple fourni

#KISS (Keep it simple stupid)
size=${#myvar}
echo $size

0 votes

Quel est l'intérêt de cette réponse ?

0 votes

@Angel La question portait sur la définition d'une variable à la sortie de la commande length, et cette question y répond.

14voto

Mukesh Shakya Points 189

Voici deux façons de calculer la longueur d'une variable :

echo ${#VAR}
echo -n $VAR | wc -m
echo -n $VAR | wc -c
printf $VAR | wc -m
expr length $VAR
expr $VAR : '.*'

et pour définir le résultat dans une autre variable, il suffit d'assigner la commande ci-dessus avec des guillemets dans une autre variable comme suit :

otherVar=`echo -n $VAR | wc -m`   
echo $otherVar

http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html

2voto

Troublemaker-DV Points 142

Je sais que les questions et réponses sont assez anciennes, mais aujourd'hui, j'ai été confronté à cette tâche pour la première fois. D'habitude, j'utilise les ${#var} mais cela échoue avec l'unicode : la plupart des textes que je traite avec le bash sont en cyrillique... Sur la base de la réponse de @atesin, j'ai fait une fonction courte (et prête à être plus raccourcie) qui pourrait être utilisable pour le scripting. C'est une tâche qui m'a conduit à cette question : montrer un message de longueur variable dans une boîte pseudo-graphique. Donc, voilà :

$ cat draw_border.sh
#!/bin/sh
#based on https://stackoverflow.com/questions/17368067/length-of-string-in-bash
border()
{
local BPAR="$1"
local BPLEN=`echo $BPAR|wc -m`
local OUTLINE=\|\ "$1"\ \|
# line below based on https://www.cyberciti.biz/faq/repeat-a-character-in-bash-script-under-linux-unix/
# comment of Bit Twiddler Jun 5, 2021 @ 8:47
local OUTBORDER=\+`head -c $(($BPLEN+1))</dev/zero|tr '\0' '-'`\+
echo $OUTBORDER
echo $OUTLINE
echo $OUTBORDER
}
border "Généralités"
border 'А вот еще одна '$LESSCLOSE' '
border "pure ENGLISH"

Et ce que cet échantillon produit :

$ draw_border.sh
+-------------+
| Généralités |
+-------------+
+----------------------------------+
| А вот еще одна /usr/bin/lesspipe |
+----------------------------------+
+--------------+
| pure ENGLISH |
+--------------+

Le premier exemple (en français ?) a été repris de l'exemple de quelqu'un ci-dessus. Le deuxième combine le cyrillique et la valeur d'une variable. Le troisième s'explique de lui-même : seulement 1s 1/2 des caractères ASCII.

J'ai utilisé echo $BPAR|wc -m au lieu de printf ... afin de ne pas dépendre du fait que le printf soit intégré ou non.

Plus haut, j'ai vu que l'on parlait de newline de fin de ligne et de -n pour echo . Je ne l'ai pas utilisé, donc je n'en ajoute qu'un à la liste. $BPLEN . Dois-je utiliser -n je dois en ajouter deux.

Pour expliquer la différence entre wc -m y wc -c , voir le même script avec seulement un changement mineur : -m a été remplacé par -c

$ draw_border.sh
+----------------+
| Généralités |
+----------------+
+---------------------------------------------+
| А вот еще одна /usr/bin/lesspipe |
+---------------------------------------------+
+--------------+
| pure ENGLISH |
+--------------+

Les caractères accentués en latin et la plupart des caractères en cyrillique ont deux octets, ce qui fait que la longueur des lignes horizontales tracées est supérieure à la longueur réelle du message. J'espère que cela fera gagner du temps à quelqu'un :-)

p.s. Le texte russe dit "en voici un de plus".

p.p.s. Travailler "deux-liner"

#!/bin/sh
#based on https://stackoverflow.com/questions/17368067/length-of-string-in-bash
border()
{
# line below based on https://www.cyberciti.biz/faq/repeat-a-character-in-bash-script-under-linux-unix/
# comment of Bit Twiddler Jun 5, 2021 @ 8:47
local OUTBORDER=\+`head -c $(( $(echo "$1"|wc -m) +1))</dev/zero|tr '\0' '-'`\+
echo $OUTBORDER"\n"\|\ "$1"\ \|"\n"$OUTBORDER
}
border "Généralités"
border 'А вот еще одна '$LESSCLOSE' '
border "pure ENGLISH"

Afin de ne pas encombrer le code avec le dessin répétitif de OUTBORDER, j'ai mis la formation de OUTBORDER dans une commande séparée

1voto

刘千强 Points 1

Peut-être juste utiliser :

echo $myvar | wc -c

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X