KSH按~分割字符串赋值数组后长度始终为1问题求解
问题根因
- 你的写法将命令执行结果赋值给了普通字符串变量而非数组,
Var2本质是单个长字符串,因此用${#Var2[@]}取长度时永远返回1(KSH会把普通变量识别为长度为1的数组) - 即使输出内容包含换行符,直接赋值给普通变量也不会自动按分隔符切分为多个数组元素,需要配合KSH的数组赋值规则和字段分隔符(IFS)处理
- 原变量末尾带额外的
~分隔符,不处理的话拆分后会生成多余的空元素
正确实现方案
推荐使用临时修改IFS的方式实现,无需调用外部sed、echo命令,性能更高,也能兼容元素内部带空格的场景:
# 原变量定义 Var="Key1:Val1~Key2:Val2~" # 第一步:删除变量末尾的~,避免生成空元素 Var=${Var%~} # 第二步:临时切换IFS为~,拆分字符串到数组 old_IFS=$IFS IFS='~' Var2=( $Var ) IFS=$old_IFS # 验证结果 ArrSize=${#Var2[@]} echo $ArrSize # 输出结果为2,符合预期 echo ${Var2[0]} # 输出Key1:Val1 echo ${Var2[1]} # 输出Key2:Val2
如果你坚持要使用sed替换的写法,需要调整为数组赋值语法,兼容KSH88版本:
Var="Key1:Val1~Key2:Val2~" Var=${Var%~} set -A Var2 $(echo "$Var" | sed 's/~/\n/g') ArrSize=${#Var2[@]} # 此时长度为2
内容的提问来源于stack exchange,提问作者NoRestartOnUpdate
相关产品推荐
相关产品推荐

