Überprüfen Sie die Länge einer Variablen

27

Ich muss die Länge der gelesenen Variablen überprüfen (mein Skript beschränkt sich auf fünf eingefügte Zeichen). Ich denke über Folgendes nach:

#!/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?

Pol Hallen
quelle
1
Ihr Skript funktioniert ordnungsgemäß in Standard-POSIX /bin/sh. Sie sollten erwägen, die shebang-Linie #!/bin/shso zu ändern, dass sie portabler ist und in Umgebungen ausgeführt wird, in denen bash nicht verfügbar ist. Außerdem /bin/shkönnte es sich um eine leichtere Hülle wie Dash handeln, die nicht mit Funktionen belastet ist, die für die interaktive Verwendung vorgesehen sind.
Celada
@ Celada, wahr, aber in diesem Fall würde dash's ${#string}Ihnen die Länge in Anzahl von Bytes anstelle von Zeichen geben.
Stéphane Chazelas

Antworten:

43

Eleganter? 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 zu tauschen, anstatt kürzer zu sein, 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. Erklärung hier .


quelle
3

Eine Bourne-kompatible Alternative ( ${#string}ist POSIX, aber nicht Bourne (es ist unwahrscheinlich, dass Sie heutzutage jemals auf eine Bourne-Shell stoßen)):

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

Beachten Sie, dass für beide ${#string}und ????die Anzahl der Bytes oder Zeichen von der Shell abhängt. Im Allgemeinen (und es wird von POSIX benötigt) ist es die Anzahl der Zeichen. Aber für einige Shells dash, die nicht mehrbytefähig sind, werden stattdessen Bytes verwendet.

Mit mkshmüssen Sie set -o utf8-mode(in UTF-8-Gebietsschemata) Multi-Byte-Zeichen 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
Stéphane Chazelas
quelle
off topic, ist aber echo Too longanders unter der Haube vonecho 'Too long'
Steven Penny
Und wenn Sie nur drucken, wenn es "zu lang" ist, kann ich noch mehr auf meine ifOption
2
@StevenPenny, echo Too longgibt zwei Argumente ( Toound long) zu echoder echoAusgängen durch einen Raum getrennt (und gefolgt von einem Zeilenvorschub), während in der echo 'Too long'wir einen Durchlauf Too longArgument an echoden sie durch eine neue Zeile folgende anzeigt. Es ist also funktional äquivalent.
Stéphane Chazelas