array=${ls -d */}
echo ${array[@]}
У меня есть три каталога: ww
ee
qq
. Я хочу их в массиве, а затем распечатать массив.
array=${ls -d */}
echo ${array[@]}
У меня есть три каталога: ww
ee
qq
. Я хочу их в массиве, а затем распечатать массив.
Это будет
array=($(ls -d */))
EDIT: см. решение Gordon Davisson для более общего ответа (т.е. если ваши имена файлов содержат специальные символы). Этот ответ является просто коррекцией синтаксиса.
Если это возможно, вам не следует разбирать вывод 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
Это будет печатать файлы в этих каталогах по очереди.
array=(ww/* ee/* qq/*)
printf "%s\n" "${array[@]}"
Вы можете использовать ls
с опцией -m
.
ARR=($(\ls -m * |tr"," " "| tr ":" " "))
echo ${ARR[@]}