LINUX.ORG.RU

Как проверить массив на пустоту?

 


0

0

Многие годы я жил в заблуждении. Думал, что можно проверить

[[ -z "${ARRAY[@]}" ]]

Оказалось это не работает.
С ARRAY[0]= работает. Но стоит пявиться ARRAY[1]= и всё.

Как же проверить за один раз, пустой ли массив?
Столько скриптов переписано, а этого не знаю, вернее, был уверен, что знаю, а оказалось вон оно как.
Должно же быть какое-то элементарное решение...

★★★★★

Последнее исправление: teod0r (всего исправлений: 1)

еще ${array[*]} преобразует массив в строку, тогда возможно -z сработает.

anonymous
()
Ответ на: комментарий от anonymous

Мне не количество элементов узнать нужно, а проверить, что все элементы пустые, т.е. что они ARRAY[0]= ARRAY[1]= ARRAY[2]= ... , а не ARRAY[0]=iuy4tv8q ARRAY[1]=' ' ARRAY[2]=1

teod0r ★★★★★
() автор топика
Ответ на: комментарий от teod0r

Должно работать

IFS=''
-z "${ARRAY[*]}"
Только IFS нужно сохранять/восстанавливать или sub-shell.

А вобще, пустой массив и массив из пустых элементов это разные вещи.

mky ★★★★★
()
Ответ на: комментарий от teod0r

Я поигрался, вроде работает:

IFS=''; ARRAY[0]= ARRAY[1]=aaa ARRAY[2]=''; echo "${ARRAY[*]}"; echo; [ -z "${ARRAY[*]}" ]; echo $?

anonymous
()
Ответ на: комментарий от teod0r

Это чисто теоретический вопрос или практический?

Если практический, и если откуда-то сверху нет требования делать именно шелл-скриптами, рекомендую посмотреть в сторону чего-то более развитого, хотя бы питон/пхп, ибо шелл-скрипт с такой логикой ты даже если и напишешь то будет сложноподдерживаемым.

firkax ★★★★★
()

Столько скриптов переписано, а этого не знаю, вернее, был уверен, что знаю, а оказалось вон оно как.

Это и есть главная проблема помойки под названием bash (и другие shеллов тоже касается по большей части). На этом невозможно нормально программировать, нет нормального синтаксиса, куча edge кейсов, старое легаси, да и язык построен так, чтобы интерпретатору было удобно, а не человеку

Использовать какие-то структуры данных на баше это боль, и как только они появляются в коде, проще сразу все переписать все на питон. Единственный плюс баша это возможность быстро строить пайплайны и вызывать экзешники, без всякой сторонней мишуры как в том же пайтоне.

Не, можно конечно постичь все тонкости, знать все подводные камни, но один вопрос: зачем на это тратить свое время?

Fizzika ★★
()
Ответ на: комментарий от Fizzika

Использовать какие-то структуры данных на баше это боль, и как только они появляются в коде, проще сразу все переписать все на питон. Единственный плюс баша это возможность быстро строить пайплайны и вызывать экзешники, без всякой сторонней мишуры как в том же пайтоне.

И тут врывается xonsh:

def func():
    a = sys.argv[1]
    git clone @(a)
t184256 ★★★★★
()
Ответ на: комментарий от tz4678

Там свое попугайство, я пока его отключил, чуть не поседел.

Ну и разговор шёл вроде про скриптование (хотя он и как интерактив тоже the best).

t184256 ★★★★★
()
Ответ на: комментарий от teod0r

работает, но какое-то не очевидное решение

Хренасе, заявочка. Да на языках более низкого уровня это вообще развертывается в целый блок кода, с циклом по элементам и проверкой на неинициализованность (ну на NULL) и если инициализовано, то на длину строки. А тут вполне логичный простой двухстрочник сразу даёт ответ. Вы ещё потребуйте, что если A[1]=aaa, то считать такой массив - пустой...

vodz ★★★★★
()
Ответ на: комментарий от teod0r

неочевидное — это твое дикое представление о понятии «пустота массива», а это всего лишь починка твоего кода

t184256 ★★★★★
()

да, надо менять shell.
в bash даже невозможно завершить работу программ и скриптов (включая всех потомков) по ^C !!! никакой trap 'kill -9 -$$' 2 3 15 не работает. вообще trap ведёт себя непредсказуемо в некоторых ситуациях. единственое, попробовать через команду bind забиндить kill, и то не знаю, будет ли работать; как-то с первого раза не понял, как использовать этот bind.

есть ещё fish, и rc (из plan9). как с ними вообще дела?

teod0r ★★★★★
() автор топика

Просто не надо использовать bash для чего-то хоть немного сложного. В sh вообще массивы не поддерживаются и это правильно.

fulmar_lor
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.