BASH循环数组问题:无法获取未知名称的子目录路径
解决Bash中获取多层未知目录路径的问题
你的问题出在双引号包裹路径时,Bash不会自动展开通配符,导致*被当作字面量输出。以下是几种可行的解决方法:
方法一:用循环遍历第二层目录(推荐,兼容多子目录场景)
通过for循环直接遍历通配符匹配的路径,Bash会自动展开*为实际目录:
#!/bin/bash DATE=$(date +"%Y%m%d") CUSTOM_PATH=/home/usr/logs/day/location DST=("$DATE"01 "$DATE"02 "$DATE"03) for i in "${DST[@]}"; do primary_dir="$CUSTOM_PATH/Primary/$i" echo "Primary Alerts: $primary_dir" # 遍历第一层目录下的所有子目录(/*/ 确保只匹配目录) for sub_dir in "$primary_dir"/*/; do # 检查目录是否存在,避免无匹配时输出通配符字符串 if [ -d "$sub_dir" ]; then echo "子目录路径: $sub_dir" fi done done
方法二:用数组存储匹配结果(适合单目录场景)
如果确定每个第一层目录下只有一个第二层子目录,可以用数组直接捕获展开后的路径:
#!/bin/bash DATE=$(date +"%Y%m%d") CUSTOM_PATH=/home/usr/logs/day/location DST=("$DATE"01 "$DATE"02 "$DATE"03) for i in "${DST[@]}"; do primary_dir="$CUSTOM_PATH/Primary/$i" echo "Primary Alerts: $primary_dir" # 用数组接收通配符展开的目录 sub_dirs=("$primary_dir"/*/) # 取数组第一个元素(仅当存在单个子目录时有效) if [ -d "${sub_dirs[0]}" ]; then echo "子目录路径: ${sub_dirs[0]}" fi done
关键说明
- 避免用双引号包裹带通配符的路径:双引号内Bash会保留
*的字面意义,不会解析成实际目录。 - 末尾加
/可以确保只匹配目录,过滤掉同名文件。 - 添加
[ -d "$sub_dir" ]检查是为了防止当目录不存在时,通配符未展开导致输出错误路径。
内容的提问来源于stack exchange,提问作者Light605
相关产品推荐
相关产品推荐

