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 long
pod maską różni się odecho '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
ilong
) doecho
, któreecho
wyjścia oddzielone spacją (i zakończonym znakiem nowej linii), podczas gdy wecho 'Too long'
przekazujemy jednoToo long
argument 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/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.dash
' s${#string}
poda długość w bajtach zamiast w znakach.