Следующий синтаксис bash проверяет, param
не является ли он пустым:
[[ ! -z $param ]]
Например:
param=""
[[ ! -z $param ]] && echo "I am not zero"
Нет выхода и его хорошо.
Но когда param
пусто, за исключением одного (или более) пробела, тогда дело обстоит иначе:
param=" " # one space
[[ ! -z $param ]] && echo "I am not zero"
«Я не ноль» выводится.
Как изменить тест, чтобы переменные, содержащие только пробелы, рассматривались как пустые?
bash
shell
shell-script
string
maihabunash
источник
источник
man test
:-z STRING - the length of STRING is zero
. Если вы хотите удалить все пробелы в$param
, используйте${param// /}
trim()
функции, встроенной в любой * nix? Так много разных хаков для достижения чего-то такого простого ...[[ ! -z $param ]]
эквивалентноtest ! -z $param
.Ответы:
Во-первых, обратите внимание, что
-z
тест явно для:То есть строка, содержащая только пробелы, не должна быть истинной
-z
, так как имеет ненулевую длину.Вы хотите удалить пробелы из переменной, используя расширение параметра замены шаблона :
Это расширяет
param
переменную и заменяет все совпадения шаблона(один пробел) ничем, поэтому строка, содержащая только пробелы, будет расширена до пустой строки.
Суть в том, как это работает, - то, что
${var/pattern/string}
заменяет первый самый длинный матчpattern
сstring
. Когдаpattern
начинается с/
(как указано выше), он заменяет все совпадения. Поскольку замена пуста, мы можем опустить финал/
иstring
значение:После всего этого мы в конечном итоге
${param// }
удаляем все пробелы.Обратите внимание, что, хотя присутствует в
ksh
(где он возник),zsh
иbash
что этот синтаксис не POSIX и не должен использоваться вsh
сценариях.источник
sed
они сказали ... толькоecho
переменную, которую они сказали ...${var/pattern/string}
должно ли быть[[ -z ${param/ /} ]]
пространство между слешами, чтобы быть шаблоном, и ничто после того, чтобы быть строкой?[[ -z "${param// }" ]]
, безусловно , выглядит так, как будтоpattern
пусто иreplacement string
является одним пробелом. AH! Теперь я вижу, чтоif pattern begins with a slash
пропустил ту часть. таким образом, шаблон/
и строка оставлены и, следовательно, пустые. Благодарю.Самый простой способ проверить, что строка содержит только символы в авторизованном наборе, - это проверить наличие несанкционированных символов. Таким образом, вместо проверки, содержит ли строка только пробелы, проверьте, содержит ли строка какой-либо символ, отличный от пробела. В bash, ksh или zsh:
«Только состоит из пробелов» включает случай пустой (или неустановленной) переменной.
Вы можете проверить наличие любого символа пробела. Используется
[[ $param = *[^[:space:]]* ]]
для использования настроек локали или любого другого явного списка пробельных символов, для которого вы хотите проверить, например,[[ $param = *[$' \t\n']* ]]
для проверки пробела, табуляции или новой строки.Сопоставление строки с шаблоном с
=
внутренним[[ … ]]
является расширением ksh (также присутствует в bash и zsh). В любом стиле Bourne / POSIX вы можете использоватьcase
конструкцию для сопоставления строки с шаблоном. Обратите внимание, что стандартные шаблоны оболочки используют!
для отрицания набора символов, а не^
как в большинстве синтаксисов регулярных выражений.Чтобы проверить наличие пробельных символов,
$'…'
синтаксис специфичен для ksh / bash / zsh; Вы можете вставить эти символы в ваш скрипт буквально (обратите внимание, что символ новой строки должен быть в кавычках, так как обратная косая черта + символ новой строки расширяется до нуля), или генерировать их, напримеристочник
${var?not set}
что прохождение этого теста и выживание гарантируют, что переменная, соответствующая вашей*)
case
, произведет определенное действие ответ, например.[[ $param = *[!\ ]* ]]
вmksh
.POSIXly:
Для того, чтобы различать пустой , не пустым , пустой , снята с охраны :
[:blank:]
предназначен для горизонтальных символов пробела (пробел и табуляция в ASCII, но, возможно, в вашей локали есть еще несколько; некоторые системы будут включать неразрывный пробел (где это возможно), некоторые не будут). Если вы также хотите использовать вертикальные символы (например, перевод строки или перевод строки), замените их[:blank:]
на[:space:]
.источник
zsh
Кажется, есть проблема с[![:blank:]]
, это повышение:b
недопустимый модификатор. Вsh
иksh
подражать, это поднять событие не найдено[
var=foo zsh -c 'case ${var+x$var} in (x*[![:blank:]]*) echo x; esac'
это нормально для меня. Событие не найдено будет только для интерактивных оболочек.:b
Недействителен Модификатор немного странно.sh
будетbash
построен с ,--enable-xpg-echo-default
и--enable-strict-posix-default
так, чтобы быть совместимым Unix (который включает в себяecho '\t'
вывод вкладки).Единственная оставшаяся причина написать сценарий оболочки вместо сценария на хорошем языке сценариев - это то, что крайняя переносимость - это первостепенная проблема. Наследие
/bin/sh
- единственное, в чем вы можете быть уверены, но Perl, например, с большей вероятностью будет доступен кроссплатформенно, чем Bash. Поэтому никогда не пишите сценарии оболочки, которые используют функции, которые не являются действительно универсальными, и имейте в виду, что несколько проприетарных поставщиков Unix заморозили свою среду оболочки до POSIX.1-2001 .Существует портативный способ сделать этот тест, но вы должны использовать
tr
:(Значение по умолчанию для
$IFS
удобства - пробел, табуляция и новая строка.)(
printf
Встроенная система сама по себе портативна, но полагаться на нее гораздо проще, чем выяснять, какой уecho
вас вариант .)источник
case
.case
глобус, чтобы обнаружить строку, которая либо пуста, либо содержит только пробельные символы. (Это было бы легко с регулярным выражением, ноcase
не выполняет регулярные выражения . Конструкция в вашем ответе не сработает, если вы заботитесь о переводах строки.)case $param in *[![:space:]]*) …
. Если вы хотите проверить наIFS
символы, вы можете использовать шаблон*[$IFS]*
.<space><tab><newline>
в начале, а затем никогда больше не трогаете его. Я думал, что это будет отвлекать..profile
которое было выполнено многими снарядами Борна. Конечно[$IFS]
, не будет делать то, что было задумано, еслиIFS
имеет определенные значения не по умолчанию (пустые (или неустановленные), содержащие]
, начиная с!
или^
).источник
Для проверки, если переменная пуста или содержит пробелы, вы также можете использовать этот код:
источник
:
.name=aaaa
затем запустите эту команду,echo ${name:?variable is empty}
она напечатает значение имени переменной, и теперь, запустив эту команду,echo ${name1:?variable is empty}
она напечатает -sh: name1: переменная пустаecho ${name:?variable is empty}
либо получит$name
ненулевое значение, либо убьет оболочку. Так что по той же причине, которую вы не делаете,prompt > $randomvar
не следует${var?}
- если там есть команда, она, вероятно, будет выполняться - и вы не знаете, что это такое. Интерактивная оболочка не должна выходить - вот почему ваша нет. Тем не менее, если вы хотите увидеть некоторые тесты, их много здесь. , Этот не такой длинный ...Чтобы проверить, является ли переменная неустановленной, пустой (имеет нулевое значение) или содержит только пробелы:
Объяснение:
${param%%[! ]*}
удаляет от первого не пробела до конца.-z
, то эхоempty
.Вышесказанное совместимо с POSIX и работает в любом потомке Bourne.
Если вы хотите расширить это также на вкладки, включите явную вкладку:
или используйте переменную с символами, которые вам нужно удалить:
или вы можете использовать некоторое POSIX «символьное выражение класса» (пробел означает пробел и табуляцию):
Но это не удастся в MKSH, LKH и шикарный.
источник
Попробуй это:
источник