Совместное использование более переносимого метода, не требующего двойных скобок [[]], при этом максимально упрощая его.
Обнаружение строки, содержащей ТОЛЬКО пробелы или = ноль:
if [ -z "${string// }" ]; then <do something>; fi
Что в этом случае будет:
${var// }
Например:
if [ -z "${string// }" ]; then echo "It's empty!"; fi
То, что это делает, просто заменяет все пустое пространство нулем через подстановку.Если $ string содержит только пробел, тест -z оценивает TRUE.Если в строке есть непробельные символы, уравнение оценивается как ЛОЖЬ.
Дальнейшая разработка BASH (так как OP спросил об этом в BASH), в приведенном выше примере не будут ловить вкладки, хотя это возможносделать это.Вот еще примеры в BASH, которые работают и работают не так, как ожидалось.
Допустим, в строке поиска есть вкладка.
Это работает:
string=$(echo -e "\t"); if [ -z ${string// } ]; then echo "It's empty!"; fi
Но это не так:
string=$(echo -e "\t"); if [ -z "${string// }" ]; then echo "It's empty!"; fi
string=$(echo -e "\t"); if [ -z '${string// }' ]; then echo "It's empty!"; fi
Два последних примера, приведенные выше, сообщают, что строка не пуста.Если вы считаете, что табуляция является пробелом, это будет проблемой, и вы захотите использовать первый пример.
Как насчет перевода строки?Давайте посмотрим на сценарий \n
.Во-первых, «правильное» поведение зависит от ваших ожиданий.
Они обрабатывают символы новой строки (\n
) как пробел (уравнение оценивает ИСТИНА):
string=$(echo -e "\n\n"); if [ -z ${string// } ]; then echo "It's empty!"; fi
string=$(echo -e "\n\n"); if [ -z "${string// }" ]; then echo "It's empty!"; fi
Это не так (уравнение оценивается как ЛОЖЬ), то есть это уравнение думает, что новая строкане пробел.
string=$(echo -e "\n\n"); if [ -z '${string// }' ]; then echo "It's empty!"; fi
Если вам требуется проверка на наличие новых строк, вкладок и пробелов, вам может понадобиться использовать два оператора IF / THEN или метод CASE, описанный выше.