shell腳本sort
⑴ 怎樣編寫shell腳本實現統計一個小組的成績情況,統計信息包括:總分,平均分,最高分
#!/bin/bashx0dx0ax0dx0a# 2013/07/01 sunx0dx0ax0dx0a#功能說明:實現統計錄入學生成績的總人數,得出最高分,最低分,平均分,方差,標准方差,還有各個分數段的所佔百分比x0dx0ax0dx0aecho "請輸入所有學生的成績,以空格隔開:"x0dx0ax0dx0aread -a score_arrx0dx0ax0dx0a#定義一個數組來存放用戶輸入的成績x0dx0ax0dx0asorted_arr=($(printf '%s\n"${score_arr[@]}"|sort -n -r))x0dx0ax0dx0a#錄入學生成績,並且是成績之間使用空格隔開x0dx0ax0dx0adeclare -i i b=0 c=0 d=0 e=0 f=0x0dx0ax0dx0a#定義變數i來循環數組,依次讀出數組裡面的數據,定義五個初值為0的變數來存放每個分數段的人數x0dx0ax0dx0afor (( i=0; $i<${#sorted_arr[@]}; i=$i+1 ))x0dx0ax0dx0a #進行for循環,依次取出數組裡面的數據x0dx0ax0dx0adox0dx0ax0dx0a#對每個取出來的數據進行判斷x0dx0ax0dx0a case ${sorted_arr[i]} inx0dx0ax0dx0a ?|?\.*|[1-5]?|[1-5]?\.*)x0dx0ax0dx0a#如果取出數組裡面的數據在60分以下x0dx0ax0dx0a b=$(($b+1));;x0dx0ax0dx0a#變數b自加1,進行統計數據x0dx0ax0dx0a 6?|6?\.*)x0dx0ax0dx0a#如果取出數組裡面的數據在60分--69分之間x0dx0ax0dx0a c=$(($c+1));;x0dx0ax0dx0a#變數c自加1,進行統計數據x0dx0ax0dx0a 7?|7?\.*)x0dx0ax0dx0a#如果取出數組裡面的數據在70分--79分之間x0dx0ax0dx0a d=$(($d+1));;x0dx0ax0dx0a#變數d自加1,進行統計數據x0dx0ax0dx0a 8?|8?\.*)x0dx0ax0dx0a#如果取出數組裡面的數據在80分--89分之間x0dx0ax0dx0a e=$(($e+1));;x0dx0ax0dx0a#變數e自加1,進行統計數據x0dx0ax0dx0a 100|100\.0|9?|9?\.*)x0dx0ax0dx0a#如果取出數組裡面的數據在90分--100分之間x0dx0ax0dx0a f=$(($f+1));;x0dx0ax0dx0a#變數f自加1,進行統計數據x0dx0ax0dx0a *)x0dx0ax0dx0a score_rank[i]="Not a Score";;#判斷結束x0dx0ax0dx0acount=$(($b+$c+$d+$e+$f))x0dx0ax0dx0a#算出總人數x0dx0ax0dx0adeclare -i j max min ave countall=0 u ua=0 ual=0 uall=0 fangx0dx0ax0dx0a#定義變數j,最大值max,最小值min,平均數ave,所有人的分數之和countallx0dx0ax0dx0amax=${sorted_arr[0]}x0dx0ax0dx0a#獲取排序後的數組的第一個數,也就是最大數x0dx0ax0dx0aj=$((${#sorted_arr[@]}-1))x0dx0ax0dx0a#得到排序後的數組的最後的一個分數的下標x0dx0ax0dx0amin=${sorted_arr[j]}x0dx0ax0dx0a#獲取排序後的數組的最後一個數,也就是最小數x0dx0ax0dx0afor (( j=0; $j<${#sorted_arr[@]}; j=$j+1 ))x0dx0ax0dx0a#進行for循環,讓學生成績相加,算出學生成績的總分x0dx0ax0dx0adox0dx0ax0dx0a countall=$countall+${sorted_arr[j]}=$countall/$countx0dx0ax0dx0a#算出平均成績x0dx0ax0dx0afor (( j=0; $j<${#sorted_arr[@]}; j=$j+1 ))x0dx0ax0dx0a#進行for循環,讓學生成績相加,算出學生成績的總分x0dx0ax0dx0adox0dx0ax0dx0a ua=$(awk -v va=${sorted_arr[j]} -v vb=$ave 'BEGIN{printf "%2d" ,va-vb}')x0dx0ax0dx0a #讓每一個數都減去平均數然後賦值於uax0dx0ax0dx0a ual=$(awk -v va=$ua -v vb=$ua 'BEGIN{printf "%2d" ,va*vb}')x0dx0ax0dx0a #算得ua的平方x0dx0ax0dx0a uall=$(awk -v va=$uall -v vb=$ual 'BEGIN{printf "%2d" ,va+vb}')x0dx0ax0dx0a #算出它們的總合,也就是方差x0dx0ax0dx0adonex0dx0ax0dx0au=$(awk -v va=$uall -v vb=$count 'BEGIN{printf "%2d" ,va/vb}')x0dx0ax0dx0a#算出學生成績的平均分,並賦值於avex0dx0ax0dx0a#下面是計算每個分數段的百分數x0dx0ax0dx0acountb=$(awk -v va=$b -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')x0dx0ax0dx0a#echo $countbx0dx0ax0dx0acountc=$(awk -v va=$c -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')x0dx0ax0dx0a#echo $countcx0dx0ax0dx0acountd=$(awk -v va=$d -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')x0dx0ax0dx0a#echo $countdx0dx0ax0dx0acounte=$(awk -v va=$e -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')x0dx0ax0dx0a#echo $countex0dx0ax0dx0acountf=$(awk -v va=$f -v vb=$count 'BEGIN{printf "%2.2f%%" ,va*100/vb}')x0dx0ax0dx0a#echo $countfx0dx0ax0dx0a#輸出結果x0dx0ax0dx0aecho "總人數 最高分 最低分 平均分 方差 "x0dx0ax0dx0aecho "$count $max $min $ave $u " x0dx0ax0dx0aecho "標准方差=" x0dx0ax0dx0aecho "scale=5;sqrt($u)" | bcx0dx0ax0dx0a#算出標准方差x0dx0ax0dx0aecho " 60分以下 60--69 70--79 80--89 90--100"x0dx0ax0dx0aecho "人數" " $b $c $d $e $f"x0dx0ax0dx0aecho "比例" "$countb $countc $countd $counte $countf"
⑵ SHell腳本解釋:麻煩哪位把下面的代碼仔細注釋一下,感謝!
list=`ls -l|grep -v grep|grep -v 0|grep -v export.sh|sort -n|awk {'print $9'}`
| 是管道符,將前面命令的執行結果傳遞給後面的命令。
學會拆分開來看就不難理解,其實可以一步一步地執行看看結果,比如先執行 ls -l ,再執行ls -l|grep -v grep,再執行ls -l|grep -v grep|grep -v 0,看有什麼變化。
這句意思就是,將 ls -l 命令的結果中,去除包含grep、0以及export.sh的行,用sort排序後取出第9列內容(即文件名列表),保存到list變數中。後面的arg即為按順序從文件名列表中取出的每個文件名。
len=${#arg} #get string len
這一句後面已經有注釋了,獲取arg字元串長度。
tab=${arg:0:len-4} #get filename not include extend name
這句後面也有注釋了,獲取文件名中除擴展名外的部分。字面解釋,就是獲取第0個字元到第(長度-4)個字元之間的字元串(擴展名加.一共4個字元)。
echo "bcp ${tab} in /opt/sybase/sdb/ln_data/${arg} -Uname -Ppwd -Sserver -c -t'||' -r'&&\n' -b10 >>./err.txt 2>&1"
列印 echo 後面的語句。語句中的變數被展開。
我覺得這句有問題,最後的輸出重定向 >>./err.txt 2>&1 應該拿到雙引號外面來,而且如果僅保存錯誤信息到err.txt的話,應該寫成 2>>./err.txt
⑶ 每天三分鍾搞定linux shell腳本10 字元串相關的if判斷
字元串比較包括
注意 :這里的符號要 轉義 ,否則變成了重定向了。
運行結果:
注意 :上面的 等號左右兩側 , 中括弧內側 一定要有空格
運行結果:
以上的例子,說明 小寫字母排在字典的後面 (類似於ascii的大小)。
sort 可以對字元串排序,sort 命令會把小寫字母放在前面 。
運行結果:
注意上面的 中括弧內側 一定要有空格。
注意 :有時候想在字元串比較的時候使用 正則表達式 ,可以使用 雙方括弧 ,如:
運行如下:
注意:上面的 雙等號左右兩側,中括弧內側 一定要有空格