【发布时间】:2021-09-02 06:39:30
【问题描述】:
我在变量 Var 中有一个字符串。 值如下所示:
Var="Key1:Val1~Key2:Val2~"
我只需要这个用“~”分割并只分配给 KSH 中的一个数组
当我尝试Var2=$(echo $Var | sed $'s/~/\\n/g')
并检查 Var2 数组的大小,如下所示:
ArrSize=${#Var2[@]}
我总是得到 1。我原以为会是 2。请帮助
【问题讨论】:
标签: ksh
我在变量 Var 中有一个字符串。 值如下所示:
Var="Key1:Val1~Key2:Val2~"
我只需要这个用“~”分割并只分配给 KSH 中的一个数组
当我尝试Var2=$(echo $Var | sed $'s/~/\\n/g')
并检查 Var2 数组的大小,如下所示:
ArrSize=${#Var2[@]}
我总是得到 1。我原以为会是 2。请帮助
【问题讨论】:
标签: ksh
假设您想使用x=( list of array items ) 填充数组的方法,那么您需要将赋值的右侧包装在一对括号中,例如:
$ Var2=( $( echo $Var | sed $'s/~/\\n/g' ) )
$ typeset -p Var2
typeset -a Var2=(Key1:Val1 Key2:Val2)
$ echo "${#Var2[@]}"
2
完成相同任务但减少子进程调用开销的其他选项:
这里是字符串:
$ Var2=( $(sed 's/~/ /g' <<< "${Var}") )
$ typeset -p Var2
typeset -a Var2=(Key1:Val1 Key2:Val2)
$ echo "${#Var2[@]}"
2
参数替换:
$ Var2=( ${Var//\~/ } )
$ typeset -p Var2
typeset -a Var2=(Key1:Val1 Key2:Val2)
$ echo "${#Var2[@]}"
2
注意:虽然${var//~/ } 在ksh 中工作,但其他shell(例如bash)需要转义~(即\~); ksh 似乎适用于两者 - ~ 和 \~ = 所以我更新了答案以包含转义
【讨论】:
echo "${Var//\~/ }" 中添加一个反斜杠。你知道为什么吗?
ksh,所以我只关注这个问题,即ksh93 替换了~;看起来bash 需要~ 被转义......所以我猜~ 是bash 中的一个特殊字符,但老实说我只是在猜测这一点;也看起来像转义 ~ 也有效,所以(有点)便携式答案将包括转义;我会更新答案...