輸入一串隨機數字,而後按千分位輸出。數組
好比輸入數字串爲「123456789」,輸出爲123,456,789bash
#!/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
解析:ide
read -p 將輸入變量賦值給變量numspa
-n string 若是 string長度非零,則爲真 [ -n "$myvar" ]字符串
${#num}獲取(num)字符串的長度string
sum=','${num:$[0-$i]:1}$sum 將這個拆開看就好理解了,sum=','(單獨的,)${num:${0-$i}:1}(切片數組)$sum(變量$sum的值)it
${num:$[0-$i]:1},直接經過 ${數組名[@或*]:起始位置:長度} 切片原先數組,$[0-$i]就是起始位置,若是數值是0或正數,就從左到右數,下標依次爲0,1,2,3.....,若是數值是負數,就從右往左數,下標依次爲......-4,-3-2,-1,最後的長度爲,從下標起始位置從左往右開始數,長度是多少就數到第幾個io
例如:for循環
[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 '^,'表示打印以「,」開頭的行table
主要是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 |