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
?
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
?
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.
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.
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
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
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.