我从数组中的当前目录中获取了15个最新的PYTHONPATH='.' luigi --module basic_luigi WindDirection --uas-filepath /aboslute/path/to/my/file.nc --local-scheduler
或.jpg
文件:
.png
在这种情况下似乎可以正常工作
images=$(ls -1tr *.jpg *.png | tail -n 15)
它向我显示15行:
找到此图片:foo.jpg
找到此图片:bar.png
找到此图像:baz.jpg
(...等...)
但是,当我尝试像这样打印for i in ${images[*]}; do echo "Found this image: $i"; done
数组的长度时:
$images
我总是得到:
1
尽管发现了多个图像,并且echo ${#images[@]}
数组上的上述for
循环确实显示了多行。
我在做什么错?如何获取数组中的元素数?
答案 0 :(得分:3)
您正确地获取了元素数量,并且确实为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[@]}"