Überprüfen Sie die Länge einer Variablen

Ich muss die Länge der gelesenen Variablen überprüfen (mein Skript beschränkt sich auf fünf der eingefügten Zeichen). Ich denke an so etwas dies:

#!/bin/bash read string check=${#string} echo $check if [ $check -ge 5 ]; then echo "error" ; exit else echo "done" fi 

Gibt es eine „elegantere“ Lösung?

Kommentare

  • Ihr Skript funktioniert unter Standard-POSIX /bin/sh ordnungsgemäß. Sie sollten in Betracht ziehen, die Shebang-Zeile in #!/bin/sh zu ändern, damit sie portabler ist und in Umgebungen ausgeführt werden, in denen bash nicht ' t verfügbar ist. Außerdem ist /bin/sh möglicherweise eine leichtere Shell wie ein Bindestrich, der nicht ' ist nicht mit Funktionen für die interaktive Verwendung belastet.
  • @Celada, obwohl in diesem Fall dash ' s ${#string} gibt Ihnen die Länge in Byte anstelle von Zeichen an.

Antwort

M. oder elegant? Nein

kürzer? Ja 🙂

#!/bin/bash read string if [ ${#string} -ge 5 ]; then echo "error" ; exit else echo "done" fi 

Und wenn Sie kein Problem damit haben, mehr Eleganz zugunsten einer kürzeren zu tauschen, können Sie ein Skript mit 2 Zeilen weniger haben:

#!/bin/bash read string [ ${#string} -ge 5 ] && echo "error" || echo "done" 

Sie können doppelte Klammern verwenden, wenn Sie dies für sicherer halten. Erläuterung hier .

Antwort

A Bourne-kompatibel Alternative (${#string} ist POSIX, aber nicht Bourne (nicht, dass Sie heutzutage wahrscheinlich jemals auf eine Bourne-Shell stoßen werden)):

case $string in ?????*) echo >&2 Too long; exit 1;; *) echo OK esac 

Beachten Sie, dass sowohl für ${#string} als auch für ???? die Anzahl der Bytes oder Zeichen abhängt die Shell. Im Allgemeinen (und es wird von POSIX benötigt) ist es die Anzahl der Zeichen. Bei einigen Shells wie dash, die nicht über mehrere Bytes verfügen, handelt es sich stattdessen um Bytes.

Mit mksh benötigen Sie set -o utf8-mode (in UTF-8-Gebietsschemas), um Multibyte-Zeichen zu verstehen:

$ string=€€€ bash -c "echo "${#string}"" 3 $ string=€€€ dash -c "echo "${#string}"" 9 $ string=€€€ mksh -c "echo "${#string}"" 9 $ string=€€€ mksh -o utf8-mode -c "echo "${#string}"" 3 $ locale charmap UTF-8 

Kommentare

  • außerhalb des Themas, unterscheidet sich jedoch echo Too long unter der Haube von echo 'Too long'
  • Und wenn Sie nur drucken, wenn ' " zu lang ist ", ich kann meine if -Option noch mehr komprimieren 🙂
  • @StevenPenny, echo Too long übergibt zwei Argumente (Too und long) an echo, die echo Ausgaben, die durch ein Leerzeichen (und gefolgt von einem Zeilenumbruch) getrennt sind, während wir in echo 'Too long' eine Too long übergeben Argument zu , gefolgt von einer neuen Zeile. Es ist also ' ein funktionales Äquivalent.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.