Ik moet de lengte van de gelezen variabele verifiëren (mijn script beperkt tot vijf ingevoegde karakters), ik denk aan zoiets als dit:
#!/bin/bash read string check=${#string} echo $check if [ $check -ge 5 ]; then echo "error" ; exit else echo "done" fi
is er een meer “elegante” oplossing?
Reacties
Antwoord
M of elegant? Nee
Korter? Ja 🙂
#!/bin/bash read string if [ ${#string} -ge 5 ]; then echo "error" ; exit else echo "done" fi
En als je er geen probleem mee hebt om meer elegantie te ruilen voor korter, dan kun je een script hebben met 2 regels minder:
#!/bin/bash read string [ ${#string} -ge 5 ] && echo "error" || echo "done"
Je zou dubbele haakjes kunnen gebruiken als je denkt dat het veiliger is. Uitleg hier .
Antwoord
Een Bourne-compatibel alternatief (${#string}
is POSIX maar niet Bourne (niet dat je tegenwoordig waarschijnlijk ooit een Bourne-shell zult tegenkomen)):
case $string in ?????*) echo >&2 Too long; exit 1;; *) echo OK esac
Merk op dat voor zowel ${#string}
als ????
het aantal bytes of tekens afhangt van de shell. Over het algemeen (en het is vereist door POSIX), is dit het aantal karakters. Maar voor sommige shells zoals dash
die niet multi-byte bewust zijn, zullen het in plaats daarvan bytes zijn.
Met mksh
, je hebt set -o utf8-mode
(in UTF-8-landinstellingen) nodig om multi-byte-tekens te begrijpen:
$ 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
Reacties
- staat niet op het onderwerp, maar is
echo Too long
anders onder de motorkap vanecho 'Too long'
- En, als je gewoon wilt afdrukken wanneer het ' s " te lang ", ik kan nog meer comprimeren met mijn
if
optie 🙂 - @StevenPenny,
echo Too long
geeft twee argumenten (Too
enlong
) door aanecho
dieecho
uitvoer gescheiden door een spatie (en gevolgd door een nieuwe regel), terwijl we inecho 'Too long'
eenToo long
argument naar die wordt weergegeven, gevolgd door een nieuwe regel. Dus het ' is functioneel equivalent.
/bin/sh
. U kunt overwegen om de shebang-regel te wijzigen in#!/bin/sh
zodat het draagbaarder wordt en worden uitgevoerd in omgevingen waar bash isn ' t beschikbaar. Bovendien is/bin/sh
mogelijk een lichtere shell zoals een streepje dat niet ' t beladen met functies die bedoeld zijn voor interactief gebruik.dash
' s${#string}
geeft u de lengte in aantal bytes in plaats van tekens.