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
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 longpod maską różni się odecho 'Too long' - Jeśli wydrukujesz tylko wtedy, gdy ' s " za długie ", mogę jeszcze bardziej kompaktować na mojej
ifopcji 🙂 - @StevenPenny,
echo Too longprzekazuje dwa argumenty (Tooilong) doecho, któreechowyjścia oddzielone spacją (i zakończonym znakiem nowej linii), podczas gdy wecho 'Too long'przekazujemy jednoToo longargument do , które wyświetla po nowej linii. Jest to więc ' odpowiednik funkcjonalny.
/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/shmoże być lżejszą powłoką, taką jak myślnik, która nie jest ' nie jest obciążony funkcjami przeznaczonymi do użytku interaktywnego.dash' s${#string}poda długość w bajtach zamiast w znakach.