Verifiera längden på en variabel

Jag ”har för att verifiera längden på den variabel som lästs (min skriptgräns till fem inlagda tecken), jag tänker på något liknande detta:

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

finns det en mer ”elegant” lösning?

Kommentarer

  • Ditt skript fungerar korrekt i standard POSIX /bin/sh. Du bör överväga att ändra shebang-raden till #!/bin/sh så att den blir mer bärbar och kör i miljöer där bash inte finns ' t tillgängligt. Plus, /bin/sh kan vara ett lättare skal som streck som inte är ' t belastad med funktioner avsedda för interaktiv användning.
  • @Celada, sant men i det här fallet, dash ' s ${#string} ger dig längden i antal byte istället för tecken.

Svar

M. malm elegant? Nej

Kortare? Ja 🙂

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

Och om du inte har några problem med att handla mer elegans till förmån för att bli kortare, kan du ha ett skript med två rader mindre:

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

Du kan använda dubbla parenteser om du tycker att det är säkrare. Förklaring här .

Svar

Ett Bourne-kompatibelt alternativ (${#string} är POSIX men inte Bourne (inte att du troligtvis kommer att stöta på ett Bourne-skal idag)):

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

Observera att både ${#string} och ???? beror på om det kommer att vara antalet byte eller tecken i allmänhet (och det krävs av POSIX) är det antalet tecken. Men för vissa skal som dash som inte är medveten om flera byte kommer det att vara byte istället.

Med mksh, du behöver set -o utf8-mode (på UTF-8-platser) för att den ska kunna förstå flerbyte-tecken:

$ 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 

Kommentarer

  • utanför ämnet, men är echo Too long annorlunda under huven från echo 'Too long'
  • Och om du bara skriver ut när den ' s " för lång ", jag kan komprimera ännu mer på mitt if -alternativ 🙂
  • @StevenPenny, echo Too long skickar två argument (Too och long) till echo vilket echo utgångar åtskilda av ett mellanslag (och följt av en ny rad), medan vi i echo 'Too long' passerar en Too long argument till som den visar efter en ny rad. Så det ' s motsvarande funktion.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *