Sprawdź długość zmiennej

Chciałem zweryfikować długość odczytywanej zmiennej (mój skrypt ogranicza się do pięciu wstawionych znaków), myślę o czymś w rodzaju to:

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

Czy jest bardziej „eleganckie” rozwiązanie?

Komentarze

  • Twój skrypt działa poprawnie w standardowym POSIX /bin/sh. Należy rozważyć zmianę linii shebang na #!/bin/sh, aby była bardziej przenośna i działa w środowiskach, w których bash nie jest ' nie jest dostępny. Ponadto /bin/sh może być lżejszą powłoką, taką jak myślnik, która nie jest ' nie jest obciążony funkcjami przeznaczonymi do użytku interaktywnego.
  • @Celada, prawda, chociaż w tym przypadku dash ' s ${#string} poda długość w bajtach zamiast w znakach.

Odpowiedź

M czy elegancki? Nie

Krótszy? Tak 🙂

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

A jeśli nie masz problemu z zamianą większej elegancji na krótszą, możesz mieć skrypt z 2 liniami mniej:

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

Możesz użyć podwójnych nawiasów, jeśli uważasz, że jest to bezpieczniejsze. Wyjaśnienie tutaj .

Odpowiedź

Zgodność z Bourne alternatywa (${#string} to POSIX, ale nie Bourne (nie oznacza to, że prawdopodobnie kiedykolwiek natkniesz się na powłokę Bournea w dzisiejszych czasach)):

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

Zwróć uwagę, że zarówno w przypadku ${#string}, jak i ????, liczba bajtów czy znaków będzie zależała od Powłoka. Ogólnie (i jest to wymagane przez POSIX), jest to liczba znaków. Ale w przypadku niektórych powłok, takich jak dash, które nie obsługują wielu bajtów, zamiast tego będą to bajty.

Z mksh, potrzebujesz set -o utf8-mode (w językach UTF-8), aby zrozumiał znaki wielobajtowe:

$ 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 

Komentarze

  • poza tematem, ale echo Too long pod maską różni się od echo 'Too long'
  • Jeśli wydrukujesz tylko wtedy, gdy ' s " za długie ", mogę jeszcze bardziej kompaktować na mojej if opcji 🙂
  • @StevenPenny, echo Too long przekazuje dwa argumenty (Too i long) do echo, które echo wyjścia oddzielone spacją (i zakończonym znakiem nowej linii), podczas gdy w echo 'Too long' przekazujemy jedno Too long argument do , które wyświetla po nowej linii. Jest to więc ' odpowiednik funkcjonalny.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *