опция -n вместо -z

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
lgar
Сообщения: 118
ОС: Ubuntu

опция -n вместо -z

Сообщение lgar »

Необходимо проверить массив на следующие условия: массив существует, массив не пустой. Конструкция

Код: Выделить всё

 [[ ! -z ${var[@]} ]] или [[  ${#ht[*]} -ne 0 ]]
, но хочется что-то подобное

Код: Выделить всё

[ -n "${host:-x}" ]
. такое возможно?
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: опция -n вместо -z

Сообщение sgfault »

Что значит не пустой? К-во элементов >0 или элементы не пустые?
Если к-во элементов >0, то такое вроде работает

Код: Выделить всё

$ ( arr=(  ); echo "'${arr[*]:+x}'"; )
''
$ ( arr=( '' ); echo "'${arr[*]:+x}'"; )
'x'
$ ( arr=( '1' ); echo "'${arr[*]:+x}'"; )
'x'


Насчет "совместимости" между версиями такой конструкции мне ничего не известно.

Upd. Исправил вывод (неправильно скопировал).
Upd2. А, вообще, если в элементах массива не будет новой строки, то я бы использовал обычную переменную. Те как-то так

Код: Выделить всё

IFS=$'\xa'
arr='1
2
3'

В большинстве случаев, этого должно хватить.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: опция -n вместо -z

Сообщение watashiwa_daredeska »

lgar писал(а):
29.07.2012 19:50
хочется что-то подобное

Код: Выделить всё

[ -n "${host:-x}" ]
. такое возможно?
Приведенной команде полностью тождественна команда false.

lgar писал(а):
29.07.2012 19:50
массив существует
В bash это понятие практически бессмысленно, ибо любая «несуществующая» переменная ведет себя как пустой массив. Но если очень хочется, то

Код: Выделить всё

if set | grep ^VARNAME=\( >/dev/null; then
  echo "VARNAME exists"
else
  echo "VARNAME doesn't exist"
fi


sgfault писал(а):
29.07.2012 19:59
Если к-во элементов >0, то такое вроде работает
Вообще-то, можно не шибко извращаться-то. "${#arr[@]}" раскрывается в длину массива. Т.е. что-то вроде:

Код: Выделить всё

if [ "${#arr[@]}" -gt 0 ]; then
  echo "arr is not empty"
else
  echo "arr is empty"
fi
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: опция -n вместо -z

Сообщение sgfault »

watashiwa_daredeska писал(а):
29.07.2012 20:58
lgar писал(а):
29.07.2012 19:50
массив существует
В bash это понятие практически бессмысленно, ибо любая «несуществующая» переменная ведет себя как пустой массив. Но если очень хочется, то

Код: Выделить всё

if set | grep ^VARNAME=\( >/dev/null; then
  echo "VARNAME exists"
else
  echo "VARNAME doesn't exist"
fi


Не то же самое?

Код: Выделить всё

$ declare -pa | grep VAR


watashiwa_daredeska писал(а):
29.07.2012 20:58
sgfault писал(а):
29.07.2012 19:59
Если к-во элементов >0, то такое вроде работает
Вообще-то, можно не шибко извращаться-то. "${#arr[@]}" раскрывается в длину массива. Т.е. что-то вроде:

Код: Выделить всё

if [ "${#arr[@]}" -gt 0 ]; then
  echo "arr is not empty"
else
  echo "arr is empty"
fi


Хм, ну да, действительно. В ${[*]+x} нету смысла, вы правы. И, действительно, проверить есть ли непустые элементы в массиве можно просто с помощью

Код: Выделить всё

[ -n "${arr[*]}" ] ...

Я как-то не подумал про это сразу, но тогда непонятно в чем был вопрос, если и про то, и про то lgar знал с самого начала.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: опция -n вместо -z

Сообщение watashiwa_daredeska »

sgfault писал(а):
29.07.2012 21:07
Не то же самое?

Код: Выделить всё

$ declare -pa | grep VAR
Да, про declare я забыл, только grep тут надо поточнее: declare -pa | grep " VAR=", или вообще так: declare -p VAR | grep '^declare -a'.

sgfault писал(а):
29.07.2012 21:07
И, действительно, проверить есть ли непустые элементы в массиве можно просто с помощью

Код: Выделить всё

[ -n "${arr[*]}" ] ...
Не получится. "${arr[*]}" будет содержать $IFS в количестве ${#arr[@]} - 1. Тогда уж { k="${arr[@]}"; [[ $((${#arr[@]} - 1)) == ${#k} ]]; }
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: опция -n вместо -z

Сообщение sgfault »

watashiwa_daredeska писал(а):
29.07.2012 23:11
sgfault писал(а):
29.07.2012 21:07
Не то же самое?

Код: Выделить всё

$ declare -pa | grep VAR
Да, про declare я забыл, только grep тут надо поточнее: declare -pa | grep " VAR=", или вообще так: declare -p VAR | grep '^declare -a'.

Ах, да. Опять пропустил :happy:

watashiwa_daredeska писал(а):
29.07.2012 23:11
sgfault писал(а):
29.07.2012 21:07
И, действительно, проверить есть ли непустые элементы в массиве можно просто с помощью

Код: Выделить всё

[ -n "${arr[*]}" ] ...
Не получится. "${arr[*]}" будет содержать $IFS в количестве ${#arr[@]} - 1. Тогда уж { k="${arr[@]}"; [[ $((${#arr[@]} - 1)) == ${#k} ]]; }

Получится. Я просто забыл сказать про пустой IFS:

Код: Выделить всё

$ ( IFS=''; f() { [ -z "${arr[*]}" ] && echo bu; }; arr=( ); f; arr=( '' ); f; arr=( '' '' ); f; )
bu
bu
bu
Спасибо сказали: