Как я могу использовать массив Bash в качестве входных данных для команды? - PullRequest
6 голосов
/ 31 марта 2011

Скажем, например, у меня есть следующий массив:

files=( "foo" "bar" "baz fizzle" )

Я хочу передать содержимое этого массива с помощью команды, скажем sort, как если бы каждый элемент был строкой в ​​файле. Конечно, я мог бы записать массив во временный файл, а затем использовать временный файл в качестве входных данных для sort, но я бы хотел по возможности избегать использования временного файла.

Если бы у "bar fizzle" не было этого пробела, я мог бы сделать что-то вроде этого:

echo ${files[@]} | tr ' ' '\012' | sort

Есть идеи? Спасибо!

Ответы [ 4 ]

8 голосов
/ 31 марта 2011
sort <(for f in "${files[@]}" ; do echo "$f" ; done)
4 голосов
/ 01 апреля 2011

Еще одно решение:

printf "%s\n" "${files[@]}" | sort
2 голосов
/ 31 марта 2011
SAVE_IFS=$IFS
IFS=$'\n'
echo "${files[*]}" | sort
IFS=$SAVE_IFS

Конечно, он не будет работать должным образом, если в значениях массива есть какие-либо символы новой строки.

1 голос
/ 01 апреля 2011

Для сортировки файлов я бы порекомендовал сортировку в режиме с нулевым завершением (чтобы избежать ошибок в случае внедрения новых строк в именах файлов или путях):

files=(
$'fileNameWithEmbeddedNewline\n.txt'
$'saneFileName.txt'
)

echo ${#files[@]}

sort <(for f in "${files[@]}" ; do printf '%s\n' "$((i+=1)): $f" ; done)
sort -z <(for f in "${files[@]}" ; do printf '%s\000' "$((i+=1)): $f" ; done) | tr '\0' '\n'

printf "%s\000" "${files[@]}" | sort -z | tr '\0' '\n'
find . -type f -print0 | sort -z | tr '\0' '\n'

sort -z чтение и запись нулевые строки!

...