如何提取Bash数组每个元素中的最后一段字符串?
问题描述
用户定义了如下Bash数组RePos:
declare -p RePos=("$MntPnt"/Module-Basesystem\ sles-15-"$ServPck"-server-basesystem-x86_64 "$MntPnt"/Module-Server-Applications\ sles-15-"$ServPck"-server-application-x86_64 "$MntPnt"/Module-Development-Tools\ sles-15-"$ServPck"-server-development_tools-x86_64 )
期望提取每个数组元素中的最后一段字符串(即路径中最后一个/之后的部分),示例结果如下:
sles-15-sp3-server-basesystem-x86_64 sles-15-sp3-server-application-x86_64 sles-15-sp3-server-development_tools-x86_64
但使用以下循环代码时,输出的是数组所有元素,无法得到期望结果:
for Add_RePos in "${!RePos[@]}" do echo " $(tput setaf 2)--> Creating "${RePos[@]-1}" Repositories <--$(tput sgr0) " done
用户使用的GNU bash版本为4.4.23(1)-release,尝试${RePos[${#RePos[@]} - 1]}也无效,寻求解决方法。
解决方案
1. 纠正数组遍历方式
原代码中"${!RePos[@]}"是遍历数组的索引而非元素,要处理每个数组元素,应改用"${RePos[@]}"遍历。
2. 提取路径最后一段的方法
利用Bash的参数扩展${变量##*/},该语法会删除变量值中从开头到最后一个/的所有内容,直接保留路径的最后一段。
3. 正确的循环代码
for repo in "${RePos[@]}" do # 提取当前元素的最后一段字符串 last_segment="${repo##*/}" echo " $(tput setaf 2)--> Creating \"${last_segment}\" Repositories <--$(tput sgr0) " done
补充说明
- 原尝试的
${RePos[${#RePos[@]} - 1]}仅能获取数组的最后一个元素,而非每个元素的最后一段,因此无法满足需求。 - 上述方法兼容Bash 4.4版本,无需额外依赖。
内容的提问来源于stack exchange,提问作者user2090974
相关产品推荐
相关产品推荐

