Я пытаюсь запустить следующий сценарий оболочки, который должен проверять, не является ли строка ни пробелом, ни пустой. Однако я получаю одинаковый результат для всех трех упомянутых строк. Я также пробовал использовать синтаксис "[[", но безрезультатно.
Вот мой код:
str="Hello World"
str2=" "
str3=""
if [ ! -z "$str" -a "$str"!=" " ]; then
echo "Str is not null or space"
fi
if [ ! -z "$str2" -a "$str2"!=" " ]; then
echo "Str2 is not null or space"
fi
if [ ! -z "$str3" -a "$str3"!=" " ]; then
echo "Str3 is not null or space"
fi
Я получаю следующий результат:
# ./checkCond.sh
Str is not null or space
Str2 is not null or space
Ответы:
Вам нужно пространство по обе стороны от
!=
. Измените свой код на:str="Hello World" str2=" " str3="" if [ ! -z "$str" -a "$str" != " " ]; then echo "Str is not null or space" fi if [ ! -z "$str2" -a "$str2" != " " ]; then echo "Str2 is not null or space" fi if [ ! -z "$str3" -a "$str3" != " " ]; then echo "Str3 is not null or space" fi
источник
var=value [command [args]]
это синтаксис, в котором переменной присваивается значение. для сравнения[
(/usr/bin/[
) - это команда, и она требует, чтобы var1,! = & var2 были тремя отдельными аргументами. var1! = var2 - единственный аргумент.Для проверки пустой строки в оболочке
if [ "$str" == "" ];then echo NULL fi
ИЛИ
if [ ! "$str" ];then echo NULL fi
источник
=
. Это==
непереносимый хакер, изобретенный авторами оболочки, чтобы запутать умы молодых программистов.Если вам нужно проверить любое количество пробелов, а не только одно, вы можете сделать это:
Чтобы удалить строку лишнего пробела (также объединяет пробелы в середине с одним пробелом):
trimmed=`echo -- $original`
В
--
гарантирует , что если$original
содержит переключатели понято эхом, они все равно будут рассматриваться как нормальные аргументы , которые будут выводиться. Кроме того , важно не ставить""
вокруг$original
, или пространства не будут удалены.После этого вы можете просто проверить,
$trimmed
пуст ли.[ -z "$trimmed" ] && echo "empty!"
источник
Еще один быстрый тест на наличие в строке чего-то, кроме пробела.
if [[ -n "${str// /}" ]]; then echo "It is not empty!" fi
«-n» означает строку ненулевой длины.
Тогда первые две косые черты означают совпадение всего следующего, в нашем случае пробелов. Затем за третьей косой чертой следует замещающая (пустая) строка и закрывается знаком "}". Обратите внимание на отличие от обычного синтаксиса регулярных выражений.
Вы можете узнать больше о манипуляциях со строками в сценариях оболочки bash здесь .
источник
[[ -n "$1" ]]
то же самое, что[[ ! -z "$1" "]]
?Чтобы проверить, пуста ли строка или содержит только пробелы, вы можете использовать:
shopt -s extglob # more powerful pattern matching if [ -n "${str##+([[:space:]])}" ]; then echo '$str is not null or space' fi
См. Раздел « Расширение параметров оболочки и сопоставление с образцом» в Руководстве по Bash.
источник
[ $(echo $variable_to_test | sed s/\n// | sed s/\ //) == "" ] && echo "String is empty"
Удаление всех символов новой строки и пробелов из строки приведет к тому, что пустая строка будет сведена к нулю, что можно проверить и принять меры.
источник