shell的提高练习(二)
一 shell的一些特殊的符号
如下的例子,文件cc.sh的内容如下:
#!/bin/bash
echo $0 #$0表示的是 ” ./cc.sh “
echo $1
echo $2
echo $3
echo $9
echo ${10}
echo ${11} # 这里必须要用上“ {}”,要不然显示的第11个参数是: “ $1”替换这里的“ 1 ”
以下是 echo $10 echo $11的执行结果:
二: shell的题目练习
(23) 求出100以内的质数
#!/bin/bash
i=2
while [ $i -le 100 ]
do
j=2
while [ $j -lt $i ]
do
tmp=$(($i%$j))
if [ $tmp -eq 0 ]
then
break
fi
let j++
done
if [ $i -eq $j ]
then
echo -n " $i "
fi
let i++
done
注:当求1000以内的话,发现shell的脚本运行就变得很慢的了
(24)用户清理,清除本机除了当前登陆用户以外的所有用户
#!/bin/bash
a=`echo $0 | sed 's/..\(...\).*/\1/'`
for i in `w|awk -v b=$a 'NR>2{if($NF !~ b) print $2}'`
do
echo $i
fuser -k /dev/$i
done
(25)关闭打开的多个终端
#!/bin/bash
var=`tty | sed 's/\/dev\///g'` #取出pts/1,当前的终端不关闭
con_shell=`echo $SHELL | sed 's/\/bin\///g'` #取出终端对应的shell,本机的为bash
for pid in `ps aux|grep $con_shell| awk -v a=$con_shell -v b=$var ' { if($NF == a && $7 != b) print $2}'`
do
kill -9 $pid
sleep 1 #休眠一秒
done
(26)查看TCP的连接状态
#!/bin/bash
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
(27) 查找较多time_wait连接
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20
(28)用户指定路径,输出文件大小最大的文件,递归子目录
解析:$IFS默认是空格,制表符和换行符;
IFS=$'\n' 使用$获取\n换行符的ASCII码作为IFS的值,因此分隔符就是换行符的了
代码如下:
#!/bin/bash
oldIFS=$IFS
IFS=$'\n'
for item in `du -a $1 |sort -nr `
do
getfilename=`echo $item|awk '{print $2} '`
if [ -f $getfilename ] # 判断是否为文件
then
echo "the max file name is :$getfilename"
break;
fi
done
IFS=$oldIFS
(29)遍历一个用户指定输入的文件,并输出这个文件有多少行
#!/bin/bash
num=0
oldIFS=$IFS
IFS=$'\n' #这个必须置为 换行符'\n',要不然循环里面遇到空格也会被认为是一行的,因为这个地方要加上
for item in `cat $1 `
do
let num++
done
echo "the file $1 have line numbers are :$num"
IFS=$oldIFS
(30)统计机器中网络各连接状态的个数
#!;/bin/bash
netstat -a | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
解析:$NF表示取每行中最后一个字段的值,
S为数组,里面的元素就是连接状态;
S={LISTEN,TIME_WAIT....}
S[LISTEN]默认为0,++S[LISTEN]用来记录出现LISTEN的个数

浙公网安备 33010602011771号