Самый простой способ проверить, что строка содержит только символы в авторизованном наборе, - это проверить наличие несанкционированных символов. Таким образом, вместо проверки, содержит ли строка только пробелы, проверьте, содержит ли строка какой-либо символ, отличный от пробела. В bash, ksh или zsh:
if [[ $param = *[!\ ]* ]]; then
echo "\$param contains characters other than space"
else
echo "\$param consists of spaces only"
fi
«Только состоит из пробелов» включает случай пустой (или неустановленной) переменной.
Вы можете проверить наличие любого символа пробела. Используется [[ $param = *[^[:space:]]* ]]
для использования настроек локали или любого другого явного списка пробельных символов, для которого вы хотите проверить, например, [[ $param = *[$' \t\n']* ]]
для проверки пробела, табуляции или новой строки.
Сопоставление строки с шаблоном с =
внутренним [[ … ]]
является расширением ksh (также присутствует в bash и zsh). В любом стиле Bourne / POSIX вы можете использовать case
конструкцию для сопоставления строки с шаблоном. Обратите внимание, что стандартные шаблоны оболочки используют !
для отрицания набора символов, а не ^
как в большинстве синтаксисов регулярных выражений.
case "$param" in
*[!\ ]*) echo "\$param contains characters other than space";;
*) echo "\$param consists of spaces only";;
esac
Чтобы проверить наличие пробельных символов, $'…'
синтаксис специфичен для ksh / bash / zsh; Вы можете вставить эти символы в ваш скрипт буквально (обратите внимание, что символ новой строки должен быть в кавычках, так как обратная косая черта + символ новой строки расширяется до нуля), или генерировать их, например
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
. Если вы хотите удалить все пробелы в$param
, используйте${param// /}