计算shell变量中的项数

时间:2017-07-05 19:10:45

标签: shell

我有一个shell变量sampleDir:

sampleDir=/home/sample*
echo $sampleDir

会给:

/home/sample_001 /home/sample_002 /home/sample_003

(注意样本_ ***下有子目录)

如果我想计算这个$ sampleDir变量中有多少这些项目,请问最好的方法是什么? (期待返回3)

3 个答案:

答案 0 :(得分:4)

将变量存储在数组中:

sampleDir=(/home/sample*)

使用参数扩展来获取数组中的项目数:

echo "${#sampleDir[@]}"

答案 1 :(得分:3)

sampleDir=/home/sample*将文字'/home/sample*'分配到sampleDir

$ echo "$sampleDir" 
/home/sample*

但是如果你不引用变量扩展,它将进行全局扩展(除非set -f打开) 并分割$IFS个字符(IFS变量中的字符 - 通常为空格,制表符和换行符。)

您可以通过将不带引号的$sampleDir传递给一个函数来计算扩展后的项目数 计算其论点。

argc() { argc=$#; } 
argc $sampleDir
echo $argc      #will print the number of items $sampleDir expanded to 

这就是你可以在任何POSIX shell上进行移植的方法(基于类似数据的解决方案仅限于拥有它们的shell)。

(我建议通过将shell函数分配给与函数同名的全局变量来返回shell函数。 它是可移植的,命名空间清理的,而且非常快(不像回声,然后使用捕获来获取回显的字符串,这是常见的,但相当昂贵))

答案 2 :(得分:2)

正如所提出的,您正在尝试计算字符串中的空格数并添加一个空格。有a number个好方法可以做到这一点。最短的类型可能是

COUNT=$(grep -o ' ' <<< "$sampleDir" | wc -l)
((COUNT++))

此方法的问题在于文件名中的任何位置都不能包含空格。更好的方法可能是只存储您感兴趣的目录的名称,并在其上运行find之类的命令:

sampleRoot=/home
find "$sampleRoot" -name 'sample*' | wc -l