旧版Bash下替代`readarray -d / -t`实现路径拆分的问题咨询
Bash 4.2 环境下路径拆分方案验证
三条readarray命令的预期执行结果
首先明确readarray -d / -t的核心行为:
- 以
/作为唯一的输入拆分分隔符,默认的换行符不会触发拆分 -t参数会自动移除每个拆分元素末尾的分隔符/- 输入末尾如果没有分隔符
/,剩余的所有内容(包括换行、控制字符等)会完整保留为最后一个元素
以下是对应命令的输出结果(基于echo默认追加换行符的前提):
- 命令:
readarray -d / -t arr < <(echo /home/fravadona)
输出:
declare -a arr='([0]="" [1]="home" [2]=$'fravadona\n')'
- 命令:
readarray -d / -t arr < <(echo /home/fravadona/)
输出:
declare -a arr='([0]="" [1]="home" [2]="fravadona" [3]=$'\n')'
- 命令:
readarray -d / -t arr < <(echo /home/fravadona/$'\n'/underneath)
输出:
declare -a arr='([0]="" [1]="home" [2]="fravadona" [3]=$'\n' [4]=$'underneath\n')'
如果用printf "%s"代替echo,避免末尾多余换行的影响,拆分结果会和路径本身的结构完全一致,最后一个元素不会携带额外的换行符。
自定义路径拆分脚本的正确性验证
你编写的脚本可以100%模拟readarray -d / -t的功能,不存在兼容问题:
- 该方案基于Bash参数扩展实现,全程不依赖IFS、不做行读取操作,不会被文件名中的换行、控制字符等特殊字符打断
- 对开头带
/、末尾带/、中间含特殊字符的路径都能正确拆分,拆分结果和readarray -d / -t完全一致 - 兼容Bash 3.0及以上所有版本,完全适配你使用的Bash 4.2.46环境
内容的提问来源于stack exchange,提问作者Fravadona
相关产品推荐
相关产品推荐

