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
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ă deecho '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
șilong
) laecho
careecho
ieșiri separate printr-un spațiu (și urmate de o linie nouă), în timp ce înecho 'Too long'
, trecem unToo long
argument pentru pe care îl afișează în urma unei linii noi. Deci este ' echivalent funcțional.
/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.dash
' s${#string}
vă va oferi lungimea în număr de octeți în loc de caractere.