Shell脚本疑难:执行变量中的命令无法获取预期值
你的Shell脚本问题分析与修复方案
存在的问题
- 间接引用逻辑错误:
${!path3}是间接变量引用语法,它会尝试读取名为a/b/c的变量的值,但你并没有定义这个变量,因此这部分会展开为空,导致实际执行的是ls -1q * | wc -l,统计的是当前工作目录的文件数,而非a/b/c目录下的内容。 - 命令执行方式错误:你将命令字符串存入
command变量后,用$(command)执行是错误的——这会尝试调用系统中名为command的命令(该命令不存在),而非执行变量中存储的命令。 - 用
ls统计文件数不可靠:如果目录下存在含换行符的文件名,ls的输出会被wc -l错误统计,导致结果失真。
修复方案
推荐用更可靠的数组glob方式统计,避免解析问题和特殊文件名干扰:
path3="a/b/c" # 开启nullglob选项:若目录为空,数组会保持为空,不会保留无效的匹配字符串 shopt -s nullglob # 将目标目录下的所有条目存入数组 files=("$path3"/*) # 数组长度即为条目数量 length=${#files[@]} echo "$length"
如果需要区分文件和目录,也可以用find实现:
path3="a/b/c" # 统计目录下的所有文件(不含子目录) length=$(find "$path3" -maxdepth 1 -type f | wc -l) # 若要统计所有条目(含目录),去掉-type f即可 # length=$(find "$path3" -maxdepth 1 | wc -l) echo "$length"
内容的提问来源于stack exchange,提问作者Prashant Kumar Jha
相关产品推荐
相关产品推荐

