Comment obtenir la longueur d'une chaîne stockée dans une variable et l'affecter à une autre variable?
myvar="some string"
echo ${#myvar}
# 11
Comment définissez-vous une autre variable sur la sortie 11
?
Comment obtenir la longueur d'une chaîne stockée dans une variable et l'affecter à une autre variable?
myvar="some string"
echo ${#myvar}
# 11
Comment définissez-vous une autre variable sur la sortie 11
?
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:
Pour confirmer qu'il a été correctement enregistré,
echo
il:la source
$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:
wc -c
ouwc --bytes
pour le nombre d'octets = les caractères Unicode sont comptés avec 2, 3 octets ou plus.wc -m
ouwc --chars
pour le nombre de caractères = les caractères Unicode sont comptés individuellement jusqu'à ce qu'ils utilisent plus d'octets.la source
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:
la source
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 desize=${#$1}
. Le second peut être plus instinctif mais est une syntaxe incorrecte.la source
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:
avec le code:
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:
Voir GNU et wooledge pour une liste plus complète des expressions conditionnelles Bash.
la source
En utilisant votre exemple fourni
la source
Voici quelques façons de calculer la longueur d'une variable:
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:
http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html
la source