1、获取随机字符串或数字
方法一:
[root@centos ~
]
function print_random
() {
for i
in {1
..10
};
do
echo -e
"$i \t $RANDOM"
done
}
print_random
[root@centos ~
]
方法二:date随机数法
[root@centos ~
]
a
=`date +%s%N`
echo $a
[root@centos ~
]
方法三:通过内部系统变量
[root@centos ~
]
5173
[root@centos ~
]
9792
2、定义一个颜色输出字符串函数
[root@centos ~
]
color
(){
if [ $1 == "red" ]
then
echo -e
"\033[31m$2\033[0m"
elif [ $1 == "green" ]
then
echo -e
"\033[32m$2\033[0m"
elif [ $1 == "blue" ]
then
echo -e
"\033[36m$2\033[0m"
fi
}
color green
"绿色"
color red
"红色"
[root@centos ~
]
绿色
红色
关于shell脚本字体颜色拓展
3、批量创建用户
read -p
"please input passwd:" PASSWD
for UNAME
in `cat file4`
do
id $UNAME &> /dev/null
if [ $? -eq 0
]
then
echo "the $UNAME already exist"
else
useradd $UNAME &> /dev/null
echo $PASSWD | passwd --stdin
$UNAME &> /dev/null
if [ $? -eq 0
]
then
echo "$UNAME create sucessful"
else
echo "$UNAME create failed"
fi
fi
done
4、检查软件包是否安装
rpm -ivh your-package
rpmrpm --force -ivh your-package``.rpm
[root@localhost ~
]
[root@localhost ~
]
[root@localhost ~
]
#!/bin/bash
read -p
"input your rpm packet name:" i
x
=`rpm -qa | grep $i`
if [ $? -eq 0
]
then
echo "the packet already exist"
else
`yum install $i`
fi
5、检查服务状态
方法一: 服务状态判断: 根据命令的返回值$?做判断
#!/bin/bash
`ps -ef |grep httpd |grep -v grep` &>/dev/null
if [ $? -eq 0
]
then
echo "httpd is up ..."
else
echo "httpd is down ..."
fi
方法二:
netstat -tulanp
|grep 80,ps -ef
|grep httpd ;wc -l
6、检查主机存活状态
while true
do
curl 127.0.0.1
&>/dev/null
if [ $? -eq 0
]
then
echo " ok..."
else
echo "not ok ..."
fi
sleep 1
done
7、监控CPU、内存和硬盘利用率
#!/bin/bash
while true
do
echo "1.查看磁盘分区
2.CPU负载
3.剩余内存
4.退出"
read -p
"请输入你要执行的操作:>>>" num
PART
(){
echo "hostname:$HOSTNAME"
echo "system: `cat /etc/redhat-release`"
array1
=(`lsblk -l |awk '/sd[a-z][0-9]/{print $1}'`)
array2
=(`lsblk -l |awk '/sd[a-z][0-9]/{print $4}'`)
array3
=(`lsblk -l |awk '/sd[a-z][0-9]/{print $6}'`)
array4
=(`lsblk -l |awk '/sd[a-z][0-9]/{print $7}'`)
num
=`echo $((${#array1[@]}-1))`
for i
in `seq 0 $num`
do
cat <<EOF
---------${array1[$i]}-----------
path: ${array1[$i]}
size: ${array2[$i]}
file_os: ${array3[$i]}
mount_on:${array4[$i]}
EOF
done
}
case $num in
1
)
PART
;;
2
)
echo "loading..."
;;
3
)
echo "mem...."
;;
4
)
exit 0
;;
*
)
print
"please input true list..."
esac
done
8、批量主机磁盘利用率监控
[root@centos ~
]
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
sda1 8:1 0 200M 0 part /boot
sda2 8:2 0 10G 0 part /
sda3 8:3 0 2G 0 part
[SWAP
]
sr0 11:0 1 3.7G 0 rom /media
[root@centos ~
]
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 9.8G 952M 8.3G 11% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 30M 150M 17% /boot
/dev/sr0 3.7G 3.7G 0 100% /media
df -h:查看硬盘信息 sed ‘1d’:删除第一行 awk ‘{print $5}’:打印第5列 sed ‘s/%//g’ :将%替换成空,g是全局的意思。 sed -n 1p:显示修改(-n选项)的第一行 a1-4是检查磁盘分区信息
a1
=$(df -h|sed '1d'|awk '{print $5}'|sed 's/%//g'|sed -n 1p)
a2
=$(df -h|sed '1d'|awk '{print $5}'|sed 's/%//g'|sed -n 2p)
a3
=$(df -h|sed '1d'|awk '{print $5}'|sed 's/%//g'|sed -n 3p)
a4
=$(df -h|sed '1d'|awk '{print $5}'|sed 's/%//g'|sed -n 4p)
b1-4是把分区名过滤出来
b1
=$(df -h|sed 1d|awk '{print $1}'|sed -n 1p)
b2
=$(df -h|sed 1d|awk '{print $1}'|sed -n 2p)
b3
=$(df -h|sed 1d|awk '{print $1}'|sed -n 3p)
b4
=$(df -h|sed 1d|awk '{print $1}'|sed -n 4p)
当前日期(年-月-日 时:分:秒) DAY=$(date +%F\ %T)
if [ $a1 -gt 89
];then
echo "$DAY $b1 would be near 80% !" >> /var/log/check_HD.log
if [ $a2 -gt 89
];then
echo "$DAY $b21 would be near 80% !" >> /var/log/check_HD.log
if [ $a3 -gt 89
];then
echo "$DAY $b3 would be near 80% !" >> /var/log/check_HD.log
if [ $a4 -gt 89
];then
echo "$DAY $b4 would be near 80% !" >> /var/log/check_HD.log
fi
fi
fi
fi
9、检查网站可用性
#!/bin/bash
function usage
(){
echo $
"usage:$0 url"
exit 1
}
function check_url
() {
wget --spider -q -o /dev/null --tries
=1 -T 5
$1
if [ $? -eq 0
]
then
echo "$1 is yes."
exit 0
else
echo "$1 is fail."
exit 1
fi
}
10、用source 执行脚本和用bash 执行 Shell 脚本的区别是什么?
bash执行脚本,在脚本执行完毕退出后,脚本定义的资源将被回收
source执行的脚本,脚本定义的资源将会加载到其父进程
11、定义变量内容,不加引号、单引号、双引号、反引号有什么区别?
[root@localhost test
]
[root@localhost test
]
linux
[root@localhost test
]
[root@localhost test
]
linux is
[root@localhost test
]
[root@localhost test
]
$a is
[root@localhost test
]
[root@localhost test
]
Mon Jul 6 15:56:32 CST 2020
不加引号:用于一些简单字符数字的定义,与双引号类似
单引号:强引,不管里面是否有变量或者其他表达都是原样子输出
双引号:如果其定义变量的时候使用双引号,则里面的变量或者函数会通过解析,解析完成后再输出,而不是把双引号中的变量名以及命令原样子输出
反引号:一般用于引用命令,执行的时候命令会被执行
12、编写shell脚本,计算1~100的和
sum
=0
for i
in {1
..100
}
do
let sum
=sum+
$i
done
echo $sum
13、编写shell脚本,输入一个数字n并计算1~n的和
read -p
"please input a number:" n
sum
=0
for i
in $(seq 1 $n)
do
let sum
=$(($sum+$i))
done
echo $sum
14、编写shell脚本,批量建立用户user_00、user_01…user_99
for i
in {00
..99
}
do
useradd user_
$i
echo 111111
|passwd --stdin user_
$i
done
15、编写shell脚本,实现两个变量之间的加减乘除运算
read -p
"please input one number:" m
read -p
"please input another number:" n
let a
=$(($m+$n))
let b
=$(($m-$n))
let c
=$(($m*$n))
let d
=$(($m/$n))
echo "相加:$a"
echo "相减:$b"
echo "相乘:$c"
echo "相除:$d"
16、利用bash for循环打印下面这句话中字母数不大于6的单词
I am clsn Welcome to my blog http://blog.znix.top
a
="I am clsn Welcome to my blog http://blog.znix.top"
echo $a |awk -F
"[^a-zA-Z]" '{for (i=1;i<=NF;i++){if (0<length($i) && length($i)<6){print $i}}}'
17、请用shell或Python编写一个正(或长)方形,接收用户输入的数字
read -p
"please input the length:" b
read -p
"please input the width:" a
for i
in `seq 1 $a`
do
for j
in `seq 1 $b`
do
echo -n
"*"
done
echo ""
done
18、写一个Shell脚本解决DOS攻击生产案例
while true
do
netstat -tan
|grep SYS_RECV
|awk -F
"[ :]+" '{array[$6]++}END{for (i in array) print i,array[i]}' >netstat.txt
while read line
do
echo $line
n
=`echo $line |awk '{print $2}'`
m
=`echo $line |awk '{print $1}'`
if (($n>5))
then
iptables -t filter -I INPUT -s
$m -j REJECT
fi
echo $n
done < netstat.txt
sleep 2
done
19、用shell处理以下内容
1、按单词出现频率降序排序! 2、按字母出现频率降序排序! the squid project provides a number ofresources to assist users design implement and support squid installations.Please browse the documentation and support sections for more infomation byoldboy training
word
="the squid project provides a number ofresources to assist users design implement and support squid installations.Please browse the documentation and support sections for more infomation byoldboy training"
awk '{for (i=1;i<=length($0);i++){if (substr($0,i,1)~/[a-z]/) array[substr($0,i,1)]++}} END{for (i in array) print i,array[i]}' word
|sort -nrk2
20、九九乘法表
for i
in `seq 1 9`
do
for j
in `seq 1 $i`
do
echo -ne
"$i*$j=$(($i*$j))\t"
done
echo ""
done