Risposte:
Oltre alla risposta corretta di fedorqui , vorrei mostrare la differenza tra lunghezza della stringa e lunghezza del byte:
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
renderà:
Généralités is 11 char len, but 14 bytes len.
potresti anche dare un'occhiata ai caratteri memorizzati:
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"
risponderà:
Généralités has 11 chars, 14 bytes: ($'G\303\251n\303\251ralit\303\251s').
Nota: Secondo il commento di Isabell Cowan , ho aggiunto impostazione $LC_ALL
insieme $LANG
.
L'argomento funziona come le variabili regolari
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"
}
funzionerà come
strLen théorème
String 'théorème' is 10 bytes, but 8 chars len: $'th\303\251or\303\250me'
printf
strumento di correzione:Se tu:
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
Non proprio carino ... Per questo, c'è una piccola funzione:
strU8DiffLen () {
local bytlen oLang=$LANG oLcAll=$LC_ALL
LANG=C LC_ALL=C
bytlen=${#1}
LANG=$oLang LC_ALL=$oLcAll
return $(( bytlen - ${#1} ))
}
Quindi ora:
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
Ma rimanevano alcuni strani comportamenti UTF-8, come caratteri a doppia spaziatura, caratteri a spaziatura zero, spostamento inverso e altro che non poteva essere così semplice ...
Dai un'occhiata a diffU8test.sh o diffU8test.sh.txt per ulteriori limitazioni.
Per ottenere la lunghezza di una stringa memorizzata in una variabile, dire:
myvar="some string"
size=${#myvar}
Per confermare che è stato correttamente salvato, echo
esso:
$ echo "$size"
11
$rulename
inizi con il $RULE_PREFIX
prefisso: [ "${rulename:0:${#RULE_PREFIX}}" == "$RULE_PREFIX" ]
#myvar
e {#myvar}
?
${#parameter}
: La lunghezza in caratteri del valore espanso di parametro viene sostituito .
Puoi usare:
MYSTRING="abc123"
MYLENGTH=$(printf "%s" "$MYSTRING" | wc -c)
wc -c
o wc --bytes
per conteggi byte = i caratteri Unicode vengono conteggiati con 2, 3 o più byte.wc -m
o wc --chars
per il conteggio dei caratteri = i caratteri Unicode vengono conteggiati singoli fino a quando non usano più byte.mylen=$(printf "%s" "$HOME/.ssh" | wc -c)
mentre la soluzione accettata fallisce e devi myvar=$HOME/.ssh
prima farlo .
Volevo il caso più semplice, finalmente questo è un risultato:
echo -n 'Tell me the length of this sentence.' | wc -m;
36
echo '' | wc -m
=> 1
. Dovresti usare -n
: echo -n '' | wc -m
=> 0
... nel qual caso è una buona soluzione :)
-n do not output the trailing newline
Se si desidera utilizzarlo con gli argomenti della riga di comando o della funzione, assicurarsi di utilizzare size=${#1}
invece di size=${#$1}
. Il secondo può essere più istintivo ma è sintassi errata.
size=${#1}
è certamente valido.
#
non sta sostituendo il $
- l' $
esterno delle parentesi graffe è ancora l'operatore di espansione. Il #
è l'operatore lunghezza, come sempre.
In risposta all'avvio del post:
Se vuoi usarlo con argomenti da riga di comando o funzione ...
con il codice:
size=${#1}
Potrebbe esserci il caso in cui si desidera solo verificare un argomento di lunghezza zero e non è necessario memorizzare una variabile. Credo che tu possa usare questo tipo di sintassi:
if [ -z "$1" ]; then
#zero length argument
else
#non-zero length
fi
Vedi GNU e Wooledge per un elenco più completo delle espressioni condizionali di Bash.
Usando il tuo esempio fornito
#KISS (Keep it simple stupid)
size=${#myvar}
echo $size
Ecco un paio di modi per calcolare la lunghezza della variabile:
echo ${#VAR}
echo -n $VAR | wc -m
echo -n $VAR | wc -c
printf $VAR | wc -m
expr length $VAR
expr $VAR : '.*'
e per impostare il risultato in un'altra variabile è sufficiente assegnare il comando precedente con virgoletta indietro in un'altra variabile come segue:
otherVar=`echo -n $VAR | wc -m`
echo $otherVar
http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html