Verificați lungimea unei variabile

Trebuie să verific lungimea variabilei citite (limita scriptului meu la cinci caractere inserate), mă gândesc la ceva de genul aceasta:

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

există o soluție mai „elegantă”?

Comentarii

  • Scriptul dvs. funcționează corect în POSIX standard /bin/sh. Ar trebui să luați în considerare schimbarea liniei shebang în #!/bin/sh, astfel încât acesta să fie mai portabil și rulați în medii în care bash nu este ' t disponibil. În plus, /bin/sh ar putea fi un shell mai ușor, cum ar fi liniuța, care nu este ' nu este împovărat cu funcții destinate utilizării interactive.
  • @Celada, adevărat deși în acest caz, dash ' s ${#string} vă va oferi lungimea în număr de octeți în loc de caractere.

Răspuns

M minereu elegant? Nu

Mai scurt? Da 🙂

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

Și dacă nu aveți nicio problemă în tranzacționarea mai multă eleganță în favoarea de a fi mai scurt, puteți avea un script cu 2 rânduri mai puțin:

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

Puteți utiliza paranteze duble dacă credeți că este mai sigur. Explicație aici .

Răspuns

A Bourne-compatible alternativă (${#string} este POSIX, dar nu Bourne (nu că probabil că veți întâlni vreodată un shell Bourne zilele acestea)):

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

Rețineți că atât pentru ${#string} cât și pentru ????, dacă va fi numărul de octeți sau de caractere va depinde de În general (și este cerut de POSIX), este numărul de caractere. Dar pentru unele shell-uri precum dash care nu sunt conștiente de mai mulți octeți, vor fi în schimb octeți.

Cu mksh, aveți nevoie de set -o utf8-mode (în regiunile UTF-8) pentru ca acesta să înțeleagă caracterele multi-octet:

$ 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 

Comentarii

  • off topic, dar este echo Too long diferit sub capotă de echo 'Too long'
  • Și, dacă pur și simplu veți imprima când ' este " prea lung ", pot compacta și mai mult cu opțiunea mea if 🙂
  • @StevenPenny, echo Too long trece două argumente (Too și long) la echo care echo ieșiri separate printr-un spațiu (și urmate de o linie nouă), în timp ce în echo 'Too long', trecem un Too long argument pentru pe care îl afișează în urma unei linii noi. Deci este ' echivalent funcțional.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *