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 命令会把小写字母放在前面 。
运行结果:
注意上面的 中括号内侧 一定要有空格。
注意 :有时候想在字符串比较的时候使用 正则表达式 ,可以使用 双方括号 ,如:
运行如下:
注意:上面的 双等号左右两侧,中括号内侧 一定要有空格