Как разместить пробелы в массиве bash

Я просматриваю каталог для определенной команды; однако я не знаю, как приспособить для пробелов

#!/bin/bash

image=(`ls *.bmp *.jpeg *.jpg | sort`)
data=(`ls *.dat | sort`)

for ((i=0; i < ${#image[@]}; i++))
do
  echo ${image[$i]} ${data[$i]}
done

Я запустил этот скрипт, и он вернул

OIS032_OS.bmp Disc
OIS034_OS.bmp Cube
OIS035_OD.bmp 200x200_9-30-2010_OD
OIS035_OS.bmp _ILM_RNFLOb.dat
OIS036_OD.bmp OIS007_Optic
OIS036_OS.bmp Disc

Я хотел, чтобы программа вернула эту строку

OIS016_OD.bmp  OIS016_Optic Disc Cube 200x200_OS _ILM_RNFLOb.dat 

Как исправить массив bash для хранения того, что мне нужно

data=(`ls *.dat | sort`) 

person user1462442    schedule 07.09.2012    source источник


Ответы (2)


Не звоните ls; просто используйте сопоставление с образцом для заполнения массива:

shopt -s extglob    # We'll use a more complicated glob to avoid needing to sort
image=( *.@(bmp|jpeg|jpg) )
data=( *.dat )

for ((i=0; i < ${#image[@]}; i++))
do
  echo ${image[$i]} ${data[$i]}
done
person chepner    schedule 07.09.2012
comment
Спасибо за ваш ответ. Сегодня я чувствую себя немного не в своей тарелке - добавил эту строку, потому что комментарий символа минимума переполнения стека - person user1462442; 07.09.2012
comment
Не требуя extglob, вы можете использовать расширение скобок: image=( *.{bmp,jpeg,jpg} ) - person glenn jackman; 08.09.2012
comment
Сравните a=(*.{bmp,jpeg,jpg}) и b=(*.@(bmp|jpeg|jpg)) для трех файлов a.bmp, a.jpeg и z.jpeg. Я использовал расширенный шаблон, чтобы имитировать сортировку, показанную в исходном вопросе, в то время как расширение фигурных скобок приведет к 3 отдельным шаблонам, которые будут подвергаться расширению имени файла отдельно. - person chepner; 08.09.2012
comment
Спасибо вам, ребята. Я за объяснение сложностей bash. Я всегда буду использовать его, чтобы писать свои сценарии. Мне интересно, почему я говорю спасибо дважды - person user1462442; 21.09.2012

Я верю, но не уверен, что вы можете делать то, что хотите, с readarray и MAPFILE.

Я спросил примерно следующее: Bash декларативно определяет список для цикла для < / а>

Вот еще одна аналогичная ссылка для ответа: https://stackoverflow.com/a/7220619/318174

person Adam Gent    schedule 07.09.2012