2015-04-20 26 views
0

是否有可能做bash像这样与cut提取子字符串传递变量削减

strLf="JJT9879YGTT" 
strZ=(2, 3, 5, 6, 9, 11) 
numZ=${#strZ[@]} 
for ((ctZ=0; ctZ<${numZ}; ctZ++)) 
do 
    lenThis=${strZ[${ctZ}]} 
    fetch=$(echo "${strLf}" | cut -c 1-${lenThis}) 
done 

通过连续环路,我想${fetch}包含"JJ" "JJT" "JJT98" "JJT987" "JJT9879YG" "JJT9879YGTT"等,根据strZ给出的指标。

或者还有其他的方式我需要这样做吗?

回答

2

您可以使用${string:position:length}获取$stringlength个字符,从position开始。

$ s="JJT9879YGTT" 
$ echo ${s:0:2} 
JJ 
$ echo ${s:0:3} 
JJT 

并且还使用变量:

$ t=5 
$ echo ${s:0:$t} 
JJT98 

所以,如果你把所有这些值在数组中,可以遍历它们,并使用它的值作为length论证说${string:0:length}

strLf="JJT9879YGTT" 
strZ=(2 3 5 6 9 11) 
for i in ${strZ[@]}; do 
    echo "${strLf:0:$i}" 
done 

对于给定的字符串,它会将此返回给我:

$ for i in ${strZ[@]}; do echo "${strLf:0:$i}"; done 
JJ 
JJT 
JJT98 
JJT987 
JJT9879YG 
JJT9879YGTT 
+0

你应该改变你的第三个例子的数组名称为'strZ' –

+1

你是对的,谢谢你通知@PedroLobito! – fedorqui

0
words="JJT9879YGTT" 
strZ=(2 3 5 6 9 11) 
for i in "${strZ[@]}" 
do 
    echo ${words:0:$i} 
done 

输出:

JJ 
JJT 
JJT98 
JJT987 
JJT9879YG 
JJT9879YGTT 

DEMO

0

意识到我的错 - 我用的是阵列中的逗号来标识元素。

所以不是我用:

strZ=(2, 3, 5, 6, 9, 11) 

我必须使用:

strZ=(2 3 5 6 9 11) 

它适用于cut为好。