Muszę zweryfikować długość odczytu zmiennej (mój limit skryptu do pięciu wstawionych znaków), myślę o czymś takim:
#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi
czy istnieje bardziej „eleganckie” rozwiązanie?
/bin/sh
. Powinieneś rozważyć zmianę linii shebang na,#!/bin/sh
aby była bardziej przenośna i działała w środowiskach, w których bash nie jest dostępny. Ponadto/bin/sh
może być bardziej lekką powłoką, taką jak deska rozdzielcza, która nie jest obciążona funkcjami przeznaczonymi do użytku interaktywnego.dash
jest${#string}
nie daje długość w bajtach zamiast znaków.Odpowiedzi:
Bardziej elegancki? Nie
Krótszy? Tak :)
A jeśli nie masz problemu z zamianą większej elegancji na korzyść bycia krótszym, możesz mieć skrypt z 2 liniami mniej:
Możesz użyć podwójnych nawiasów, jeśli uważasz, że jest to bezpieczniejsze. Wyjaśnienie tutaj .
źródło
Alternatywa kompatybilna z Bourne (
${#string}
jest POSIX, ale nie Bourne (nie jest tak, że w dzisiejszych czasach najprawdopodobniej spotkasz pocisk Bourne)):Zauważ, że dla obu
${#string}
i to????
, czy będzie to liczba bajtów czy znaków, zależy od powłoki. Ogólnie (i jest to wymagane przez POSIX), jest to liczba znaków. Ale dla niektórych takich powłokdash
nie są one rozpoznawane w wielu bajtach, zamiast tego będą to bajty.Za pomocą (w ustawieniach regionalnych UTF-8)
mksh
musiszset -o utf8-mode
zrozumieć znaki wielobajtowe:źródło
echo Too long
różni się pod maską odecho 'Too long'
if
opcję :)echo Too long
przekazuje dwa argumenty (Too
ilong
), doecho
których daneecho
wyjściowe są oddzielone spacją (i po których następuje nowa linia), natomiast wewnątrz przekazujemyecho 'Too long'
jedenToo long
argument, doecho
którego wyświetla się po nim nowa linia. Jest to więc funkcjonalnie równoważny.