Controleer de lengte van een variabele

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

  • Uw script werkt correct in de standaard POSIX /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.
  • @Celada, waar in dit geval echter dash ' s ${#string} geeft u de lengte in aantal bytes in plaats van tekens.

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 van echo '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 en long) door aan echo die echo uitvoer gescheiden door een spatie (en gevolgd door een nieuwe regel), terwijl we in echo 'Too long' een Too long argument naar die wordt weergegeven, gevolgd door een nieuwe regel. Dus het ' is functioneel equivalent.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *