16.shell练习题
- (1) 什么是解释性语言?什么是编译型语言?
解释性语言依赖于解释器,每次执行都需要经过解释器解析然后形成机器可执行的代码 运行速度较慢
编译型语言在执行之前需要编译成机器可识别的文件然后再交给机器去执行,只需要一次编译就可以到处运行 运行速度较快 - (2).写一个脚本输入任意数组或则数字例如 2 3 4 5 6 7 8 9,输出最大值、最小值、平均值
[root@haibao class26-shell]# cat -n num01.sh
1 #!/bin/bash
2
3 max=$1
4 min=$1
5 arr=$@
6 sum=0
7 for i in $arr
8 do
9 if [ $i -gt $max ]
10 then
11 max=$i
12 fi
13 if [ $i -lt $min ]
14 then
15 min=$i
16 fi
17 sum=$[sum+i]
18 done
19 echo "最大值是$max"
20 echo "最小值是$min"
21 echo "平均值是$[$sum/$#]"
22 echo "带小数的平均值是$(echo "scale=2; $sum/$#" | bc)"
[root@haibao class26-shell]# bash num01.sh 12 34 9
最大值是34
最小值是9
平均值是18
带小数的平均值是18.33
数组方式
#!/bin/bash
arr=$1
arr1=()
num=0
for i in ${arr[*]}
do
arr1[$num]=$i
num=$[num+1]
done
echo ${arr1[*]}
max=${arr1[0]}
min=${arr1[0]}
for i in ${arr1[@]}
do
echo $i
if [ $i -gt $max ]
then
max=$i
fi
if [ $i -lt $min ]
then
min=$i
fi
sum=$[$sum+$i]
done
echo "最大值为$max"
echo "最小值为$min"
echo "平均值为$[$sum/${#arr1[@]}]"
[root@haibao class26-shell]# bash num02.sh "${arr1[*]}"
6 4 6 25 44
6
4
6
25
44
最大值为44
最小值为4
平均值为17
[root@haibao class26-shell]# vim num02.sh
[root@haibao class26-shell]# echo ${arr1[*]}
6 4 6 25 44
- (3).写一个脚本输入任意数组或则数字例如 2 4 3 5 9 7 8 6,按照从小到大排序后输出
#!/bin/bash
#DESC:写一个脚本输入任意数组或则数字例如 2 4 3 5 9 7 8 6,按照从小到大排序后输出
#NAME=work3.sh
#...
arr=()
i=0
for value in "$@"
do
arr[$i]=$value
i=$[ $i+1 ]
done
echo ${arr[*]}
for ((i=0;i<${#arr[@]};i++))
do
for ((j=$i;j<${#arr[@]};j++))
do
tmp=${arr[$i]}
if [ ${arr[$j]} -lt $tmp ]
then
arr[$i]=${arr[$j]}
arr[$j]=$tmp
fi
done
done
echo ${arr[@]}
- (4).完成/root/shell_test/文件夹下完成一个脚本
1).判断aaa.txt文件是否存在,存在则往文件中写入bbb,如果不存在,创建aaa.txt文件,往文件中写入bbb
2).每一分钟执行一次脚本
#!/bin/bash
:<<EOF
完成/root/shell_test/文件夹下完成一个脚本 (今天)
1.判断aaa.txt文件是否存在,存在则往文件中写入bbb,如果不存在,创建aaa.txt文
件,往文件中写入bbb
2.每一分钟执行一次脚本
EOF
if [ -e aaa.txt ]
then
echo "bbb" >> aaa.txt
else
touch aaa.txt
echo "bbb" >> aaa.txt
fi
定时任务
* * * * * /bin/bash /root/class26-shell/file01.sh 在centos6 中可以执行 centos7不行
- (5).判断/root/class21/inittab.txt文件是否大于100行,如果大于,则显示”inittab is a big"
#!/bin/bash
:<<EOF
(4).判断/root/class21/inittab.txt文件是否大于100行,如果大于,则显示”inittab is a big" (今天)
EOF
filename=$1
num=`cat $filename | wc -l`
if [ $num -gt 100 ]
then
echo "innitab is a big "
else
echo "file is small"
fi
- (6).写出一个脚本程序,给定一个文件,比如:/root/class21/inittab.txt
a、判断这个文件中是否有空白行?
b、如果有,则显示其空白行的总行数,否则显示没有空白行
1 #!/bin/bash
2
3 :<<EOF
4 写出一个脚本程序,给定一个文件,比如:/root/class21/inittab.txt
5 a、判断这个文件中是否有空白行? b、如果有,则显示其空白行的总行数,否则显示没有空白行
6 EOF
7 filename=$1
8 num=`grep "^$" $filename | wc -l`
9 if [ $num -gt 0 ]
10 then
11 echo "有空行,空行数为$num"
12 else
13 echo "没有空行"
14 fi
num=`awk -v sum=0 '/^$/{sum+=1}END{print sum}' 文件名称`
num=`awk '/^$/{print NR}' num01.sh | wc -l`
- (7).给定一个文件,如果是普通文件,就显示出来,如果是目录文件,也显示出来,否则就显示“无法识别”
#!/bin/bash
:<<EOF
给定一个文件,如果是普通文件,就显示出来,如果是目录文件,也显示出来,否则就显示“无法识别”
EOF
filename=$1
if [ -f $filename ]
then
echo "是一个文件"
elif [ -d $filename ]
then
echo "是一个目录"
else
echo "无法识别"
fi
- (8).写一个脚本,给脚本传递3个参数 两个数字,一个运算符,根据运算符计算出结果,例如 2 3 - 2-3=1 (使用case语句)
#/bin/bash
:<<EOF
写一个脚本,给脚本传递3个参数 两个数字,一个运算符,根据运算符计算出结果,例如 2 3 - 2-3=1 (使用case语句)
EOF
num1=$1
num2=$2
fuhao=$3
case $fuhao in
"+")
echo $[num1+num2]
;;
"-")
echo $[num1-num2]
;;
"\*")
echo $[num1*num2]
;;
"/")
echo $[num1/num2]
;;
*)
echo "啥也不是"
;;
esac
- (9).使用脚本完成批量创建用户创建(100个用户例如 ljh1~ljh100 )今天完成
#!/bin/bash
:<<EOF
使用脚本完成批量创建用户创建(100个用户例如 ljh1~ljh100 )
EOF
for((i=1;i<=2;i++))
do
useradd "zsb$i"
name=zsb$i
echo "123456" | passwd --stdin $name ##这里是给用户赋初识密码
num=$[num+1]
done
- (10).创建脚本检查软件包是否安装 (今天完成)
#!/bin/bash
:<<EOF
创建脚本检查软件包是否安装
EOF
app=$1
ischeck=`rpm -qa | grep $app`
if [ $ischeck ]
then
echo "已经安装"
else
echo "没有安装"
fi
- (11).编写脚本打印99乘法表
#!/bin/bash
num=9
for((i=1;i<=$num;i++))
do
for((j=1;j<=$i;j++))
do
printf "$j*$i=$[i*j]\t"
done
echo
done
- (12).编写函数实现取出ip地址 (今天完成)
#!/bin/bash
function getId()
{
echo `ifconfig | grep Bcast |cut -d : -f 2 |cut -d " " -f 1`
echo `ifconfig | grep Bcast | awk -F ":" '{print $2}' | awk -F " " '{print $1}'`
}
getId
- (13)定期清理/data/YY-MM-DD.tar.gz的文件 (今天完成)
- 描述:在系统的/data/目录下,仅工作日周一至周五每天会自动生成文件YY-MM-DD.tar.gz(压缩文件名会以时间命名因此压缩文件不会重复)
- 要求:希望只保留最近2天的文件 无论过几个节假日/data仍然会有前两个工作日的备份文件
ls -t /data | awk '{NR>2}' | xargs rm -rvf