shell的提高练习(一)
一
(1)在使用linux编写shell脚本之前,我们得先查看下系统支持的shell,可以通过 cat /etc/shells,可以查看所支持的shell。并且通过echo $SHELL查看当前使用的是哪个shell。如下是本人当前系统支持的shell:

因为当前使用的是/bin/bash,那么在脚本文件头应该如下:
#!/bin/bash
(2)当编写完一个脚本,保存并命名为aa.sh。让这个脚本运行起来有如下的几种:
第一: /bin/bash aa.sh
第二: source aa.sh
第三: 更改 aa.sh 的权限得有可执行权限 chmod +x aa.sh ; 接着输入 ./ aa.sh,如下图所示:

二 脚本的提高练习题
(1)每隔两秒打印出系统的负载均衡
#!/bin/bash
while true
do
uptime
sleep 2
done
(2)求两个数之和
#!/bin/bash
a=50
b=20
c=$(($a+$b))
echo "$a+$b=$c"
(3)求1到100的和
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
sum=$(($sum+$i))
let i++
done
echo "1+2+3....+99+100=$sum"
(4) 将一目录下所有的文件的扩展名改为bak
#!/bin/bash
var2=.bak
for filename in `ls -a`
do
if [ -f $filename ];then
var=${filename%.*} #这里是过滤掉文件的后缀名 ” .txt “ 或者 “ .c“
mv $filename $var$var2
fi
done
注意:执行完这个脚本,会把当前运行的脚本的后缀名也改成了” .bak “
(5) 编译当前目录下的所有.c文件
#! /bin/bash
for myfile in `ls *.c`
do
var=${myfile%.*}
g++ "$myfile" -o "$var"
sleep 2 #休息2
done > compile 2>&1 #将错误的信息打印到compile文件中,并且错误提示不会出现在控制台
(6) 打印当前目录下,root可以使用可执行文件数,处理结果: root's bins:
注意:由于linux系统的可执行文件不能单独通过文件后缀名来表示,所以只能通过ls -l 来查看文件属性中是否有可执行的权限
#! /bin/bash
var=$( find ./ -type f | xargs ls -l | sed -n '/-..x/p' | wc -l) # sed -n ,要不然wc -l 的时候,结果会多出一倍出来
echo "root bins: $var"
(7) 打印当前sshd的端口和进程id,处理结果: sshd Port&&pid: 22 5412
#! /bin/bash
netstat -apn | grep sshd | sed -n 's/.*:::\([0-9]*\)\ .* \ \([0-9]*\)\/sshd/\1 \2/p'
(8)输出本机创建1000个目录所用的时间,处理结果:
real 0m3.367s
user 0m0.066s
sys 0m1.925s
代码如下:
#!/bin/bash
time( mkdir f{1..1000} )
(9)打印本机交换分区大小
#!/bin/bash
free -m | sed -n '/Swap/p' | awk '{ print $2}'
或者如下:
#!bin/bash
echo -n "Swap:"
free -m|grep "Swap"|awk '{print $2}'
(10)文本分析,取出/etc/password中shell出现的次数
第一种方法结果:
4 /bin/bash
1 /bin/sync
1 /sbin/halt
31 /sbin/nologin
1 /sbin/shutdown
第二种方法结果:
/bin/sync 1
/bin/bash 1
/sbin/nologin 30
/sbin/halt 1
/sbin/shutdown 1
代码如下:
#!/bin/bash
cat /etc/passwd | awk -F: '{if ($7!="") print $7}' | sort | uniq -c #sort是排序,uniq是统计重复的行
(11)写一个shell脚本来得到当前的日期,时间,用户名和当前工作目录。
#! /bin/bash
echo -n "当前的日期:"
date +%Y-%m-%d
echo -n "当前的时间:"
date +%H:%M:%S
echo -n "用户名:"
whoami
echo -n "当前工作目录:"
pwd
(12)编写shell脚本获取本机的网络地址。
#!/bin/bash
IP=`ifconfig eth0 | grep 'inet ' | sed 's/^.*addr://g' | sed 's/ Bcast.*$//g'`
NETMASK=`ifconfig eth0 | grep 'inet '| sed 's/^.*Mask://g'`
echo "$IP"
exit 0
(13)将当前文件目录下大于10K的文件拷贝到/tmp
#! /bin/bash
for filename in `find ./ -size +1k -type f -print` ;
do
mv "$filename" /tmp
done
echo "copy done"
ls -l /tmp
(14)文件移动拷贝,有m1.txt m2.txt m3.txt m4.txt,分别创建出对应的目录,m1 m2 m3 m4 并把文件移动到对应的目录下。
#!/bin/bash
touch m1.txt m2.txt m3.txt m4.txt
I=1
while [ $I -le 4 ]; do
mkdir m$I
mv m$I.txt m$I
I=$((I+1))
done
(15)显示当前用记登陆了多长的时间
#!/bin/bash
uptime | awk -F "," '{print $1}' |sed 's/^.*up//g'
(16)统计IP访问:要求分析apache访问日志,找出访问页面数量在前100位的IP数。日志大小在78M左右。以下是apache的访问日志节选
202.101.129.218 - - [26/Mar/2006:23:59:55 +0800] "GET /online/stat_inst.php?pid=d065 HTTP/1.1" 302 20-"-" "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)"
代码如下:
#! /bin/bash
# $1 为要测试的日志文件
awk '{print $1}' $1 | sort | uniq -c | sort -k1nr | head -n3
(17)设计一个Shell程序,在/userdata目录下建立50个目录,即user1~user50,并设置每个目录的权限,其中其他用户的权限为:读;文件所有者的权限 为:读、写、执行;文件所有者所在组的权限为:读、执行。
代码如下:
#!/bin/bash
echo "create /usrdata"
mkdir /usrdata
if [ $? -eq 0 ]; then
i=1
while [ $i -le 5 ]; do
mkdir -p /usrdata/user$i
chmod 754 /usrdata/user$i
let i++
done
else
echo "bye"
exit 1
fi
exit 0
(18)设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30个用户,用户名的形式为stdxx,其中xx从01到30,并设置密码为对应的stdxx。
代码如下:
#!/bin/bash
groupadd class1
for i in {9901..9930}; do
xx=`echo $i | sed 's/99//g'`
useradd -g class1 -s /bin/bash -d /home/std$xx -m std$xx
echo -e "std$xx\nstd$xx" | passwd std$xx
echo -e "user std$xx password is std$xx" >> /root/newuser.txt
done
#执行脚本时先切换到超级用户
(19)编写shell程序,实现自动删除30个账号的功能。账号名为std01至std30。
#!/bin/bash
for i in {9901..9930}; do
xx=`echo $i | sed 's/99//g'`
userdel -r std$xx
done
#执行脚本时先切换到超级用户
(20)设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名,为如下形式yymmdd_etc,yy为年,mm为月, dd为日。Shell程序fileback存放在/usr/bin目录下
#!/bin/bash
filename=`date +%y%m%d`_etc.tar.gz
cd /etc/
tar -zcvf $filename *
mv $filename /root/bak/
# vim /etc/crontab 加入
# * * 1 * * root ./23.sh &
# 加入定时管理模块
(21)对于一个用户日志文件,每行记录了一个用户查询串,长度为1-255字节,共几千万行,请排出查询最多的前100条。 日志可以自己构造。
日志的格式如下(对应的日志文件名为testdata.txt):

代码如下:
#! /bin/bash
# show top 10
file=$1
awk '{print $1}' testdata.txt | sort | uniq -c | sort -k1nr | head -n10 #$1表示测试的文件名
(22)编写自己的ubuntu环境安装脚本
代码如下:
#! /bin/bash
sudo apt-get update
sudo apt-get intall aptitude -y
sudo apt-get intall tree
sudo apt-get intall vim -y
sudo echo "sudo cp vimrc /etc/vim/vimrc"
sudo cp vimrc /etc/vim/vimrc
sudo apt-get intall stardict -y
sudo echo "sudo cp dic /usr/share/stardict -r"
sudo cp dic /usr/share/stardict -r
sudo apt-get intall g++ -y
sudo apt-get intall vaftpd -y
sudo apt-get intall lftp -y
sudo apt-get intall nfs-kernel-server -y

浙公网安备 33010602011771号