Réponses:
En plus de la bonne réponse de fedorqui , je voudrais montrer la différence entre la longueur de chaîne et la longueur d'octet:
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 consulter 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é un paramètre à $LC_ALL
avec $LANG
.
L'argument fonctionne de la même manière que 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 "String '%s' is %d bytes, but %d chars len: %s.\n" "$1" $bytlen ${#1} "$sreal"
}
fonctionnera comme
strLen théorème
String 'théorème' is 10 bytes, but 8 chars len: $'th\303\251or\303\250me'
printf
outil de correction:Si vous:
for string in Généralités Language Théorème Février "Left: ←" "Yin Yang ☯";do
printf " - %-14s is %2d char length\n" "'$string'" ${#string}
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 joli ... 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 string in Généralités Language Théorème Février "Left: ←" "Yin Yang ☯";do
strU8DiffLen "$string"
printf " - %-$((14+$?))s is %2d chars length, but uses %2d bytes\n" \
"'$string'" ${#string} $((${#string}+$?))
done
- 'Généralités' is 11 chars length, but uses 14 bytes
- 'Language' is 8 chars length, but uses 8 bytes
- 'Théorème' is 8 chars length, but uses 10 bytes
- 'Février' is 7 chars length, but uses 8 bytes
- 'Left: ←' is 7 chars length, but uses 9 bytes
- 'Yin Yang ☯' is 10 chars length, but uses 12 bytes
Mais il restait un comportement UTF-8 étrange, comme les caractères à double interligne, les caractères à zéro, le déplacement inverse et d'autres qui ne pouvaient pas être aussi simples ...
Jetez un œil à diffU8test.sh ou diffU8test.sh.txt pour plus de limitations.
Pour obtenir la longueur d'une chaîne stockée dans une variable, dites:
myvar="some string"
size=${#myvar}
Pour confirmer qu'il a été correctement enregistré, echo
il:
$ echo "$size"
11
$rulename
commence par le $RULE_PREFIX
préfixe: [ "${rulename:0:${#RULE_PREFIX}}" == "$RULE_PREFIX" ]
#myvar
et {#myvar}
?
${#parameter}
: La longueur en caractères de la valeur étendue du paramètre est remplacée .
Vous pouvez utiliser:
MYSTRING="abc123"
MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c)
wc -c
ou wc --bytes
pour le nombre d'octets = les caractères Unicode sont comptés avec 2, 3 octets ou plus.wc -m
ou wc --chars
pour le nombre de caractères = les caractères Unicode sont comptés individuellement jusqu'à ce qu'ils utilisent plus d'octets.mylen=$(printf "%s" "$HOME/.ssh" | wc -c)
alors que la solution acceptée échoue et vous devez d' myvar=$HOME/.ssh
abord.
Je voulais le cas le plus simple, enfin voici un résultat:
echo -n 'Tell me the length of this sentence.' | wc -m;
36
echo '' | wc -m
=> 1
. Vous devez utiliser -n
: echo -n '' | wc -m
=> 0
... auquel cas c'est une bonne solution :)
-n do not output the trailing newline
Si vous souhaitez utiliser ceci 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 est une syntaxe incorrecte.
size=${#1}
est certainement valable.
#
ne remplace pas le $
- l' $
extérieur des accolades est toujours l'opérateur d'expansion. L' #
opérateur est la longueur, comme toujours.
En réponse au début du post:
Si vous souhaitez l'utiliser avec des arguments de ligne de commande ou de fonction ...
avec le code:
size=${#1}
Il peut y avoir le cas où vous voulez simplement vérifier un argument de longueur nulle et n'avez 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 Bash.
Voici quelques 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, attribuez simplement la commande ci-dessus avec guillemet arrière 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