1. 程式人生 > >輸入一串隨機數字,然後按千分位輸出。

輸入一串隨機數字,然後按千分位輸出。

shell腳本 千分位輸出 for循環 切片數組

輸入一串隨機數字,然後按千分位輸出。

比如輸入數字串為“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,執行elifif判斷len=3,條件成立
if判斷len不等於3,執行elifif判斷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


輸入一串隨機數字,然後按千分位輸出。