Wie erhält man die Länge eines in einer Variablen gespeicherten Strings und weist diese einer anderen Variablen zu?
myvar="some string"
echo ${#myvar}
# 11
Wie setzen Sie eine andere Variable auf die Ausgabe 11
?
Wie erhält man die Länge eines in einer Variablen gespeicherten Strings und weist diese einer anderen Variablen zu?
myvar="some string"
echo ${#myvar}
# 11
Wie setzen Sie eine andere Variable auf die Ausgabe 11
?
Zusätzlich zu Fedorquis korrekter Antwort möchte ich den Unterschied zwischen Stringlänge und Bytelänge zeigen:
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
wird rendern:
Généralités is 11 char len, but 14 bytes len.
Sie könnten sich sogar gespeicherte Zeichen ansehen:
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"
werde antworten:
Généralités has 11 chars, 14 bytes: ($'G\303\251n\303\251ralit\303\251s').
Nota: Laut Isabell Cowans Kommentar habe ich die Einstellung $LC_ALL
zusammen mit hinzugefügt $LANG
.
Argumente funktionieren genauso wie reguläre Variablen
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"
}
wird funktionieren als
strLen théorème
String 'théorème' is 10 bytes, but 8 chars len: $'th\303\251or\303\250me'
printf
Korrekturwerkzeug:Wenn du:
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
Nicht wirklich hübsch ... Dafür gibt es eine kleine Funktion:
strU8DiffLen () {
local bytlen oLang=$LANG oLcAll=$LC_ALL
LANG=C LC_ALL=C
bytlen=${#1}
LANG=$oLang LC_ALL=$oLcAll
return $(( bytlen - ${#1} ))
}
Dann jetzt:
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
Aber es gab ein seltsames UTF-8-Verhalten, wie Zeichen mit doppeltem Abstand, Zeichen mit null Abstand, umgekehrte Verschiebung und andere, die nicht so einfach sein konnten ...
Werfen Sie einen Blick auf diffU8test.sh oder diffU8test.sh.txt für weitere Einschränkungen.
Um die Länge eines in einer Variablen gespeicherten Strings abzurufen, sagen Sie:
Um zu bestätigen, dass es ordnungsgemäß gespeichert wurde, gilt
echo
Folgendes:quelle
$rulename
mit dem$RULE_PREFIX
Präfix beginnt :[ "${rulename:0:${#RULE_PREFIX}}" == "$RULE_PREFIX" ]
#myvar
und etwas erläutern{#myvar}
?${#parameter}
: Die Länge des erweiterten Parameterwerts wird in Zeichen ersetzt .Sie können verwenden:
wc -c
oderwc --bytes
für Byteanzahl = Unicode-Zeichen werden mit 2, 3 oder mehr Bytes gezählt.wc -m
oderwc --chars
für Zeichenanzahl = Unicode-Zeichen werden einzeln gezählt, bis sie mehr Bytes verwenden.quelle
mylen=$(printf "%s" "$HOME/.ssh" | wc -c)
während die akzeptierte Lösung fehlschlägt und Siemyvar=$HOME/.ssh
zuerst müssen.Ich wollte den einfachsten Fall, schließlich ist dies ein Ergebnis:
quelle
echo '' | wc -m
=>1
. Sie müssten verwenden-n
:echo -n '' | wc -m
=>0
... in diesem Fall ist es eine gute Lösung :)-n do not output the trailing newline
Wenn Sie dies mit Befehlszeilen- oder Funktionsargumenten verwenden möchten, stellen Sie sicher, dass Sie
size=${#1}
anstelle von verwendensize=${#$1}
. Die zweite ist zwar instinktiver, hat aber eine falsche Syntax.quelle
size=${#1}
ist sicherlich gültig.#
ersetzt nicht die$
- die$
Außenseite der Klammern ist immer noch der Erweiterungsoperator. Das#
ist wie immer der Längenoperator.Als Antwort auf den Beitrag, der beginnt:
mit dem Code:
Es kann vorkommen, dass Sie nur nach einem Argument mit der Länge Null suchen möchten und keine Variable speichern müssen. Ich glaube, Sie können diese Art von Syntax verwenden:
Eine vollständigere Liste der bedingten Bash-Ausdrücke finden Sie unter GNU und Wooledge .
quelle
Anhand Ihres Beispiels
quelle
Hier sind einige Möglichkeiten, um die Länge der Variablen zu berechnen:
und um das Ergebnis in einer anderen Variablen festzulegen, weisen Sie einfach den obigen Befehl mit dem Anführungszeichen wie folgt einer anderen Variablen zu:
http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html
quelle