Najłatwiejszym sposobem sprawdzenia, czy łańcuch zawiera tylko znaki w autoryzowanym zestawie, jest sprawdzenie obecności nieautoryzowanych znaków. Dlatego zamiast sprawdzać, czy łańcuch zawiera tylko spacje, sprawdź, czy łańcuch zawiera znak inny niż spacja. W bash, ksh lub zsh:
if [[ $param = *[!\ ]* ]]; then
echo "\$param contains characters other than space"
else
echo "\$param consists of spaces only"
fi
„Składa się tylko ze spacji” obejmuje przypadek pustej (lub nieustawionej) zmiennej.
Możesz przetestować dowolny znak spacji. Użyj, [[ $param = *[^[:space:]]* ]]aby użyć ustawień regionalnych lub jakiejkolwiek wyraźnej listy białych znaków, które chcesz przetestować, np. [[ $param = *[$' \t\n']* ]]Aby sprawdzić spację, tabulator lub znak nowej linii.
Dopasowywanie łańcucha do wzorca z =wnętrzem [[ … ]]jest rozszerzeniem ksh (występującym również w bash i zsh). W dowolnym stylu Bourne / POSIX możesz użyć casekonstrukcji, aby dopasować ciąg do wzorca. Zauważ, że standardowe wzorce powłoki służą !do negowania zestawu znaków, a nie ^jak w większości składni wyrażeń regularnych.
case "$param" in
*[!\ ]*) echo "\$param contains characters other than space";;
*) echo "\$param consists of spaces only";;
esac
Aby przetestować znaki spacji, $'…'składnia jest specyficzna dla ksh / bash / zsh; możesz dosłownie wstawić te znaki w skrypcie (pamiętaj, że nowa linia musi znajdować się w cudzysłowach, ponieważ ukośnik + nowa linia rozwija się do zera), lub wygeneruj je, np.
whitespace=$(printf '\n\t ')
case "$param" in
*[!$whitespace]*) echo "\$param contains non-whitespace characters";;
*) echo "\$param consists of whitespace only";;
esac
man test:-z STRING - the length of STRING is zero. Jeśli chcesz usunąć wszystkie spacje$param, użyj${param// /}