Bash:获取由ls命令生成的数组中元素的数量? $ {#a [@]}不起作用

时间:2019-03-03 20:13:26

标签: arrays bash shell command-line

我从数组中的当前目录中获取了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循环确实显示了多行。

我在做什么错?如何获取数组中的元素数?

1 个答案:

答案 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将变成MyImage.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[@]}"