我有一个shell变量sampleDir:
sampleDir=/home/sample*
echo $sampleDir
会给:
/home/sample_001 /home/sample_002 /home/sample_003
(注意样本_ ***下有子目录)
如果我想计算这个$ sampleDir变量中有多少这些项目,请问最好的方法是什么? (期待返回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