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?
/bin/sh
. Sie sollten erwägen, die shebang-Linie#!/bin/sh
so zu ändern, dass sie portabler ist und in Umgebungen ausgeführt wird, in denen bash nicht verfügbar ist. Außerdem/bin/sh
kö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.dash
's${#string}
Ihnen die Länge in Anzahl von Bytes anstelle von Zeichen geben.Antworten:
Eleganter? Nein
Kürzer Ja :)
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:
Sie können doppelte Klammern verwenden, wenn Sie dies für sicherer halten. Erklärung hier .
quelle
Eine Bourne-kompatible Alternative (
${#string}
ist POSIX, aber nicht Bourne (es ist unwahrscheinlich, dass Sie heutzutage jemals auf eine Bourne-Shell stoßen)):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 Shellsdash
, die nicht mehrbytefähig sind, werden stattdessen Bytes verwendet.Mit
mksh
müssen Sieset -o utf8-mode
(in UTF-8-Gebietsschemata) Multi-Byte-Zeichen verstehen:quelle
echo Too long
anders unter der Haube vonecho 'Too long'
if
Optionecho Too long
gibt zwei Argumente (Too
undlong
) zuecho
derecho
Ausgängen durch einen Raum getrennt (und gefolgt von einem Zeilenvorschub), während in derecho 'Too long'
wir einen DurchlaufToo long
Argument anecho
den sie durch eine neue Zeile folgende anzeigt. Es ist also funktional äquivalent.