比如输入数字串为“123456789”,输出为123,456,789
#!/bin/bash read -p "输入一串数字:" num v=`echo $num| sed 's/[0-9]//g'` if [ -n "$v" ] then echo "请输入纯数字。" exit fi length=${#num} #表示num字符串的长度 len=0 sum='' for i in $(seq 1 $length) #可写为`seq 1 $length` do len=$[$len+1] if [[ $len == 3 ]] then sum=','${num:$[0-$i]:1}$sum #这里$[0-$i]也可改为0-$i #这里可以看为3个部分,','为一个部分,${num:$[0-$i]:1}为一个部分,$sum为为一个部分 len=0 else sum=${num:$[0-$i]:1}$sum fi done if [[ -n $(echo $sum | grep '^,') ]] #判断是否是以“,”开头的行,如果是以“,”开头,可能类似“,123”的形式,所以要打印下标从1开始的数组(下标默认是从0开始)。 then echo ${sum:1} else echo $sum fi
解析:
read -p 将输入变量赋值给变量num
-n string 如果 string长度非零,则为真 [ -n "$myvar" ]
${#num}获取(num)字符串的长度
sum=','${num:$[0-$i]:1}$sum 将这个拆开看就好理解了,sum=','(单独的,)${num:${0-$i}:1}(切片数组)$sum(变量$sum的值)
${num:$[0-$i]:1},直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,$[0-$i]就是起始位置,如果数值是0或正数,就从左到右数,下标依次为0,1,2,3.....,如果数值是负数,就从右往左数,下标依次为......-4,-3-2,-1,最后的长度为,从下标起始位置从左往右开始数,长度是多少就数到第几个
例如:
[root@bastion-IDC ~]# a=(1 2 3 4 5 6 7 8) [root@bastion-IDC ~]# echo ${a[@]:1:4} 2 3 4 5
[root@bastion-IDC ~]# a=(1 2 3 4 5 6 7 8) [root@bastion-IDC ~]# echo ${a[@]:0-3:2} 6 7 #0-3的值为-3,这里不能直接写-3
^表示行的开始,所以grep '^,'表示打印以“,”开头的行
主要是for循环这一段。如果输入num的值为12345,那么for循环中的i需要从1遍历到5
当i=1时 | 当i=2时 | 当i=3时 | 当i=4时 | 当i=5时 |
则len=1(len=0+1) | 则len=2(len=1+1) | 则len=3(len=2+1) | 则len=1(len=0+1) | 则len=2(len=1+1) |
if判断len不等于3,执行elif | if判断len不等于3,执行elif | if判断len=3,条件成立 | if判断len不等于3,执行elif | if判断len不等于3,执行elif |
则sum=${num:0-1:1}$sum,结果为sum=5与空($sum的值),所以sum=5 | 则sum=${num:0-2:1}$sum,结果为sum=4与 5($sum的值),所以sum=45 | 则sum=‘,’${num:0-3:1}$sum,结果为sum=,与3与 45($sum的值),所以sum=,345 | 则sum=${num:0-4:1}$sum,结果为sum=2与,345($sum的值),所以sum=2,345 | 则sum=${num:0-5:1}$sum,结果为sum=1与2,345($sum的值),所以sum=12,345 |
原文地址:http://blog.51cto.com/12129628/2072651