Bash脚本输入参数空值检查失败及目录文件计数异常求助
解决你的两个Bash脚本问题
一、输入参数为空检查失败的修复
很多时候参数为空检查出错,都是因为没搞对Bash的字符串判断逻辑。比如你要是直接写if [ $1 ],当参数为空时,这个表达式会变成if [ ],这在Bash里属于语法错误,肯定执行失败。
正确的做法是用-z选项判断字符串是否为空,一定要给变量加双引号,避免参数展开时出现意外:
#!/bin/bash # 检查第一个参数是否为空 if [[ -z "$1" ]]; then echo "错误:输入参数不能为空!" exit 1 fi # 后续业务逻辑 echo "你输入的参数是:$1"
要是需要兼容更严格的POSIX环境,也可以用这种写法:
#!/bin/sh if [ -z "$1" ]; then echo "错误:输入参数不能为空!" exit 1 fi
核心就是给变量套双引号,防止参数为空或包含空格时,Bash解析出问题。
二、统计目录内文件数量(忽略子目录)
你说去掉if语句计数器显示4(包含目录),说明遍历逻辑没问题,但判断是否为文件的条件写错了。我们需要精准判断每一项是不是普通文件,把目录、符号链接这些都排除掉。
下面是能正常工作的脚本:
#!/bin/bash # 先检查目标目录参数是否存在 if [[ -z "$1" ]]; then echo "请指定要统计的目录路径!" exit 1 fi target_dir="$1" # 开启nullglob选项:目录为空时,*不会被当成字符串输出 shopt -s nullglob file_count=0 # 只遍历当前目录下的直接子项,不递归进子目录 for item in "$target_dir"/*; do # 判断当前项是否是普通文件 if [[ -f "$item" ]]; then ((file_count++)) fi done echo "目录 $target_dir 中的普通文件数量为:$file_count" # 可选:关闭nullglob,避免影响后续脚本逻辑 shopt -u nullglob
几个关键细节:
shopt -s nullglob:如果目标目录是空的,$target_dir/*会被展开为空,而不是变成"$target_dir/*"这个字符串,防止计数器错误加1。-f选项:专门用来判断路径是否为普通文件,自动排除目录、符号链接、设备文件等非文件类型。"$target_dir"/*:只遍历目标目录下的直接子项,不会深入子目录,完全符合你的需求。
要是你原脚本里用了错误的判断(比如搞反了用-d判断目录),那肯定统计不对,换成-f就能解决问题啦。
内容的提问来源于stack exchange,提问作者user9213141
相关产品推荐
相关产品推荐

