593 Stimmen

Länge des Strings in bash

Wie erhalten Sie die Länge eines in einer Variablen gespeicherten Strings und weisen dies einer anderen Variable zu?

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

Wie weisen Sie einer anderen Variable den Wert 11 zu?

19voto

Dick Guertin Punkte 687

Wenn Sie dies mit Befehlszeile oder Funktionsargumenten verwenden möchten, stellen Sie sicher, dass Sie size=${#1} anstelle von size=${#$1} verwenden. Die zweite Variante mag intuitiver sein, ist jedoch falsche Syntax.

18voto

thistleknot Punkte 919

Verwendung Ihres bereitgestellten Beispiels

#KISS (Keep it simple stupid)
size=${#myvar}
echo $size

15voto

Mukesh Shakya Punkte 319

Hier sind ein paar Möglichkeiten, um die Länge einer Variablen zu berechnen:

echo ${#VAR}
echo -n $VAR | wc -m
echo -n $VAR | wc -c
printf $VAR | wc -m
expr length $VAR
expr $VAR : '.*'

Um das Ergebnis in einer anderen Variablen zu speichern, weisen Sie einfach den obigen Befehl mit Backquote einer anderen Variablen wie folgt zu:

otherVar=`echo -n $VAR | wc -m`   
echo $otherVar

http://techopsbook.blogspot.in/2017/09/how-to-find-length-of-string-variable.html

2voto

Troublemaker-DV Punkte 162

Ich weiß, dass die Fragen und Antworten alt genug sind, aber heute stand ich zum ersten Mal vor dieser Aufgabe. Normalerweise habe ich die ${#var}-Kombination verwendet, aber sie funktioniert nicht mit Unicode: der meiste Text, den ich mit Bash verarbeite, ist kyrillisch... Basierend auf der Antwort von @atesin habe ich eine kurze (und bereit, noch kürzer zu sein) Funktion erstellt, die für das Skripten verwendet werden kann. Diese Aufgabe hat mich zu dieser Frage geführt: eine Nachricht variabler Länge in einem Pseudografik-Box darzustellen. Also, hier ist es:

$ cat draw_border.sh
#!/bin/sh
#basiert auf https://stackoverflow.com/questions/17368067/length-of-string-in-bash
border()
{
local BPAR="$1"
local BPLEN=`echo $BPAR|wc -m`
local OUTLINE=\|\ "$1"\ \|
# Linie unten basierend auf https://www.cyberciti.biz/faq/repeat-a-character-in-bash-script-under-linux-unix/
# Kommentar von Bit Twiddler 5. Jun 2021 um 8:47
local OUTBORDER=\+`head -c $(($BPLEN+1))

``

Und was dieses Beispiel produziert:

$ draw_border.sh
+-------------+
| Généralités |
+-------------+
+----------------------------------+
|     /usr/bin/lesspipe |
+----------------------------------+
+--------------+
| reines ENGLISCH |
+--------------+

Das erste Beispiel (in Französisch?) wurde aus dem Beispiel von jemandem oben übernommen. Das zweite kombiniert Kyrillik und den Wert einiger Variablen. Das dritte ist selbsterklärend: nur die Hälfte der ASCII-Zeichen.

Ich habe echo $BPAR|wc -m anstelle von printf ... verwendet, um mich nicht darauf verlassen zu müssen, ob printf vorhanden ist oder nicht.

Oben habe ich Gespräche über abschließende neue Zeilen und den -n-Parameter für echo gesehen. Ich habe es nicht verwendet, daher füge ich nur eins zum $BPLEN hinzu. Sollte ich -n verwenden, müsste ich 2 hinzufügen.

Um den Unterschied zwischen wc -m und wc -c zu erklären, sehen Sie dasselbe Skript mit nur einer kleinen Änderung: -m wurde durch -c ersetzt

$ draw_border.sh
+----------------+
| Généralités |
+----------------+
+---------------------------------------------+
|     /usr/bin/lesspipe |
+---------------------------------------------+
+--------------+
| reines ENGLISCH |
+--------------+

Akzentuierte Zeichen im Lateinischen und die meisten Zeichen im Kyrillischen sind zweibyte, daher sind die Längen der gezeichneten horizontalen Linien größer als die tatsächliche Länge der Nachricht. Ich hoffe, es wird jemandem Zeit sparen :-)

P.S. Der russische Text sagt "hier ist noch ein weiterer"

P.P.S. Funktionierender "Zweizeiler"

#!/bin/sh
#basiert auf https://stackoverflow.com/questions/17368067/length-of-string-in-bash
border()
{
# Linie unten basierend auf https://www.cyberciti.biz/faq/repeat-a-character-in-bash-script-under-linux-unix/
# Kommentar von Bit Twiddler 5. Jun 2021 um 8:47
local OUTBORDER=\+`head -c $(( $(echo "$1"|wc -m) +1))

`

Um den Code nicht mit wiederholtem Zeichnen von OUTBORDER zu überladen, habe ich das Bilden von OUTBORDER in einen separaten Befehl gelegt

` ``

1voto

刘千强 Punkte 11

Vielleicht einfach wc -c verwenden, um die Anzahl der Zeichen zu zählen:

myvar="Hallo, ich bin ein String."
echo -n $myvar | wc -c

Ergebnis:

21

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X