shell脚本编程学习第十天
J、传入至少三个数字参数到脚本file,并计算出最大,最小,平均值。需要判断传入的数字是否足够,否则输出警告信息。平均值保留两位小数。
如执行./file 3 4 6 5,输出结果如下:
max number is:6
min number is:3
average is:4.50
方法1:
#!/bash/bin
if [[ $# -le 2 ]];then
echo " paramters must be at least 3"
exit 1
fi
max=$1
min=$1
sum=$1
count=$#
shift
while [ $# -gt 0 ]
do
((sum+=$1))
if [[ $1 -gt $max ]];then
max=$1
fi
if [[ $1 -le $min ]];then
min=$1
fi
shift
done
ave=`echo "scale=2;$sum/$count"| bc`
echo "max = $max"
echo "min = $min"
echo "ave = $ave"
参数的特殊处理:
$# : 返回参数的个数
$* : 返回所有参数, 以 “$1 $2 … $n” 的形式输出参数;
$@: 返回所有参数,以 “$1” “$2” … " $n" 的形式输出参数;
$?: 函数返回值0成功,非0 失败;
$0 : 返回函数名字。
shift: 命令左移,后面可以加参数 shift 3,参数默认是1(shift 1),移动后,$1 实际上是 $ 2。每执行一次,变量的个数($#)减。
exit: exit 0 表示正常退出; exit 1 表示异常退出。
bc: 精度计算,scale=N 设置保留N位小数。
方法二:
#!/bin/bash
if [[ $# -le 2 ]];then
echo " paramters must be at least 3"
exit 1
fi
echo "$@" | awk ' //这里的单引号,不要起另一行
BEGIN{ RS=" " } // 这个大括号不要起下一行,要在begin后面
{
sum+=$0
}
NR==1 {
max=$1
min=$1
next
}
$1>max { max=$1 }
$1<min { min=$1 }
END{ // 这个大括号不要起下一行,要在end后面
printf "max number is:%s\n",max
printf "min number is:%s\n",min
printf "average is:%.2f\n",sum/NR
}'
**awk:**继续学习点。
awk ’ BEGIN{ statements } statements2 END{ statements } '(只能用单引号)
工作方式
- 执行begin中语句块;
- 从文件或stdin中读入一行,然后执行statements2,重复这个过程,直到文件全部被读取完毕;
- 执行end语句块;
NR:表示记录的数量,在执行过程中对应当前的行号;(行)
NF:表示字段数量,在执行过程中对应当前的字段数;(列)
RS:记录分隔符,默认情况下是\n,可以自定义分隔符; (-F是字段分隔符,读取每一行时默认按照空格分割字段变量,我理解他俩的区别是RS将一行分为好几行,F是将一行分为好几部分)。
$0:这个变量包含执行过程中当前行的文本内容;
print:打印时会自动换行;
next:显示下一条消息;