Вы правильно получаете количество элементов, и оно действительно равно 1.
Поскольку вы знаете JS, вот ваш код на JavaScript, чтобы увидеть, что на самом деле происходит:
// Assign all filenames to a single index
var images = ["foo.jpg\nbar.jpg\nbaz.jpg"]
// Join all the elements on spaces, then split them up on whitespace
var elements = images.join(" ").split(/[ \t\n]/);
for (var i in elements) {
console.log("Found this image: " + elements[i]);
}
console.log("Array length: " + images.length);
Вывод:
Found this image: foo.jpg
Found this image: bar.jpg
Found this image: baz.jpg
Array length: 1
Вот что вы вместо этого хотели сделать в Bash:
images=( $(ls -1tr *.jpg *.png | tail -n 15) )
for i in "${images[@]}"; do echo "Found this image: $i"; done
echo "${#images[@]}"
Синтаксический анализ ls
вывод считается хрупким: приведенный выше код по-прежнему разделяется на пробелы, поэтому My Image.jpg
превратится в My
и Image.jpg
.
К сожалению, простой, хорошей замены нет, когда вам нужны файлы, отсортированные по дате модификации, но это позволяет избежать проблем, когда файлы содержат *
или пробелы (Bash 4+):
mapfile -t images < <(ls -tr *.jpg *.png | tail -n 15)
for i in "${images[@]}"; do echo "Found this image: $i"; done
echo "${#images[@]}"