Подтвердить что ты не робот

Как назначить ls массиву в Linux Bash?

array=${ls -d */}
echo ${array[@]}  

У меня есть три каталога: ww ee qq. Я хочу их в массиве, а затем распечатать массив.

4b9b3361

Ответ 1

Это будет

array=($(ls -d */))

EDIT: см. решение Gordon Davisson для более общего ответа (т.е. если ваши имена файлов содержат специальные символы). Этот ответ является просто коррекцией синтаксиса.

Ответ 2

Если это возможно, вам не следует разбирать вывод ls (см. Грег wiki по теме). В принципе, вывод ls будет неоднозначным, если в любом из имен файлов есть забавные символы. Это также обычно пустая трата времени. В этом случае, когда вы выполняете ls -d */, происходит то, что оболочка расширяет */ до списка подкаталогов (который уже точно соответствует вашему желанию), передает этот список в качестве аргументов ls -d, который смотрит на каждый один, говорит "да, что каталог все в порядке" и печатает его. Команда ls ничего полезного не делает!

Хорошо, хорошо, это полезно: если нет подкаталогов, */ будет оставаться как есть, ls будет искать подкаталог с именем "*", не найти его, распечатать ошибку что он не существует (для stderr), и не печатайте "*/" (в стандартный вывод).

Более чистый способ создания массива имен подкаталогов - использовать glob (*/), не передавая его в ls. Но для того, чтобы избежать размещения "*/" в массиве, если нет реальных подкаталогов, сначала нужно установить nullglob (опять же, см. Грег wiki):

shopt -s nullglob
array=(*/)
shopt -u nullglob # Turn off nullglob to make sure it doesn't interfere with anything later
echo "${array[@]}"  # Note double-quotes to avoid extra parsing of funny characters in filenames

Если вы хотите напечатать сообщение об ошибке, если нет подкаталогов, вам лучше сделать это самостоятельно:

if (( ${#array[@]} == 0 )); then
    echo "No subdirectories found" >&2
fi

Ответ 3

Это будет печатать файлы в этих каталогах по очереди.

array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"

Ответ 4

Вы можете использовать ls с опцией -m.

ARR=($(\ls -m * |tr"," " "| tr ":" " "))
echo ${ARR[@]}