Longueur de ficelle en bash

Comment obtenir la longueur d’une chaîne stockée dans une variable et l’assigner à une autre variable?

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

Comment définissez-vous une autre variable à la sortie 11 ?

Longueur de chaîne UTF-8

En plus de la réponse correcte de fedorqui , j’aimerais montrer la différence entre la longueur de la chaîne et la longueur en octets:

 myvar='Généralités' chrlen=${#myvar} oLang=$LANG oLcAll=$LC_ALL LANG=C LC_ALL=C bytlen=${#myvar} LANG=$oLang LC_ALL=$oLcAll printf "%s is %d char len, but %d bytes len.\n" "${myvar}" $chrlen $bytlen 

rendra:

 Généralités is 11 char len, but 14 bytes len. 

Vous pouvez même regarder les caractères stockés:

 myvar='Généralités' chrlen=${#myvar} oLang=$LANG oLcAll=$LC_ALL LANG=C LC_ALL=C bytlen=${#myvar} printf -v myreal "%q" "$myvar" LANG=$oLang LC_ALL=$oLcAll printf "%s has %d chars, %d bytes: (%s).\n" "${myvar}" $chrlen $bytlen "$myreal" 

répondra:

 Généralités has 11 chars, 14 bytes: ($'G\303\251n\303\251ralit\303\251s'). 

Nota: Selon le commentaire d’Isabell Cowan , j’ai ajouté le réglage à $LC_ALL avec $LANG .

Longueur d’un argument

L’argument fonctionne comme les variables régulières

 strLen() { local bytlen sreal oLang=$LANG oLcAll=$LC_ALL LANG=C LC_ALL=C bytlen=${#1} printf -v sreal %q "$1" LANG=$oLang LC_ALL=$oLcAll printf "Ssortingng '%s' is %d bytes, but %d chars len: %s.\n" "$1" $bytlen ${#1} "$sreal" } 

travaillera comme

 strLen théorème Ssortingng 'théorème' is 10 bytes, but 8 chars len: $'th\303\251or\303\250me' 

Outil de correction printf utile:

Si vous:

 for ssortingng in Généralités Language Théorème Février "Left: ←" "Yin Yang ☯";do printf " - %-14s is %2d char length\n" "'$ssortingng'" ${#ssortingng} done - 'Généralités' is 11 char length - 'Language' is 8 char length - 'Théorème' is 8 char length - 'Février' is 7 char length - 'Left: ←' is 7 char length - 'Yin Yang ☯' is 10 char length 

Pas vraiment jolie … Pour cela, il y a une petite fonction:

 strU8DiffLen () { local bytlen oLang=$LANG oLcAll=$LC_ALL LANG=C LC_ALL=C bytlen=${#1} LANG=$oLang LC_ALL=$oLcAll return $(( bytlen - ${#1} )) } 

Alors maintenant:

 for ssortingng in Généralités Language Théorème Février "Left: ←" "Yin Yang ☯";do strU8DiffLen "$ssortingng" printf " - %-$((14+$?))s is %2d chars length, but use %2d bytes\n" \ "'$ssortingng'" ${#ssortingng} $((${#ssortingng}+$?)) done - 'Généralités' is 11 chars length, but use 14 bytes - 'Language' is 8 chars length, but use 8 bytes - 'Théorème' is 8 chars length, but use 10 bytes - 'Février' is 7 chars length, but use 8 bytes - 'Left: ←' is 7 chars length, but use 9 bytes - 'Yin Yang ☯' is 10 chars length, but use 12 bytes 

Pour obtenir la longueur d’une chaîne stockée dans une variable, dites:

 myvar="some ssortingng" size=${#myvar} 

Pour confirmer qu’il a été correctement enregistré, echo le:

 $ echo "$size" 11 

Vous pouvez utiliser:

 MYSTRING="abc123" MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c) 
  • wc -c ou wc --bytes pour le wc --bytes d’octets = Les caractères Unicode sont comptés avec 2, 3 octets ou plus.
  • wc -m ou wc --chars pour le wc --chars de caractères = Les caractères Unicode sont comptés wc --chars jusqu’à ce qu’ils utilisent plus d’octets.

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} . Le second peut être plus instinctif mais la syntaxe est incorrecte.

Voici quelques façons de calculer la longueur de la 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, affectez simplement la commande ci-dessus avec un devis supplémentaire 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-ssortingng-variable.html

En réponse au post départ:

Si vous voulez l’utiliser avec des arguments de ligne de commande ou de fonction …

avec le code:

 size=${#1} 

Il se peut que vous souhaitiez simplement vérifier un argument de longueur zéro et que vous n’ayez pas besoin de stocker une variable. Je pense que vous pouvez utiliser ce type de syntaxe:

 if [ -z "$1" ]; then #zero length argument else #non-zero length fi 

Voir GNU et wooledge pour une liste plus complète des expressions conditionnelles de Bash.

J’essayais de faire quelque chose de similaire, mais je voulais juste m’assurer que la saisie de l’utilisateur n’était pas trop longue.

 if [ ${#ssortingng} -ge 12 ]; then echo ">= 12 characters. too long" exit else echo "under 12 characters, not too long." fi 

Je voulais le cas le plus simple, enfin c’est un résultat:

 echo -n 'Tell me the length of this sentence.' | wc -m; 36 

Je voudrais utiliser quelque chose comme ça:

 var2=$(echo $myvar | wc -c) 

Vous n’avez pas besoin d’un script.