bash数组计数始终返回1

时间:2016-07-26 18:41:55

标签: arrays bash

我为此搜索过,但条款显然过于笼统。我正在编写脚本来搜索.mp3文件的一组文件夹。有些文件夹没有mp3,所以必须将它们排除在外。

我创建了一个数组来保存uniq&#d; d文件夹名称。这个find命令将获取我需要的文件夹。

Folders=$(sudo find /my/music/ -type f -name "*.mp3" | cut -d'/' -f7 | sort -u)

当我尝试计算数组中的文件夹数量时,我总是得到1

echo ${#Folders[@]}

echo ${Folders[@]}将它们打印在不同的行上,因此我认为它们是独立的数组元素。谁能解释一下发生了什么?您可能必须在cut命令中抖动字段编号以在本地重现。

3 个答案:

答案 0 :(得分:4)

Folders不是数组而是变量。

你需要:

Folders=( $(sudo find /my/music/ -type f -name "*.mp3" | cut -d'/' -f7 | sort -u) )

即。用()括起命令替换。现在${#Folders[@]}会为您提供数组Folders的元素数量。

答案 1 :(得分:0)

或者做:

sudo find /my/music/ -type f -name "*.mp3" | cut -d'/' -f7 | sort -u | wc -l

注意

  • wc -l打印行数,在这种情况下是唯一文件的数量
  • 为了使事情更加明确,请在-printf "%p\n"中使用find选项,其中%p说明符以完整路径打印文件。

答案 2 :(得分:0)

假设{string[2]} [0]: "Abc" [1]: "123PQR" 4或更高版本,请勿在此使用bash;使用find运算符。

globstar

另外假设shopt -s globstar folders=( /my/music/**/*.mp3 ) 应该单独提取文件名,请按照

进行操作
cut -d/ -f7

填充数组的其他方法必须更加谨慎地容纳包含空格或folders=${folders[@]##*/} ?*等字符的文件。包含换行符(罕见但非非法)的文件名更难以正确处理。路径名扩展是在shell内部完成的,因此您不必担心任何此类特殊字符。