1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核 版本,CPU型号,内存大小,硬盘大小
#!/bin/bash
echo -e "\e[31mHostname: `hostname`\e[0m"
echo -e "\e[32mIP: `hostname -I`\e[0m"
echo -e "\e[33mOS Version: `cat /etc/os-release |grep "PRETTY"|cut -d'=' -f2`\e[0m"
echo -e "\e[34mKernel Version: `uname -r`\e[0m"
echo -e "\e[35mCPU:`lscpu | grep "Model name"|tr -s ' '|cut -d: -f2`\e[0m"
echo -e "\e[36mMemory Size:`lsmem | grep 'online memory'|tr -s ' '|cut -d: -f2`\e[0m"
echo -e "\e[37mDisk Size:`fdisk -l|head -1|cut -d',' -f1|cut -d: -f2`\e[0m"
2、编写脚本 backup.sh,可实现每日将/etc/目录备份到/backup/etcYYYY-mm-dd中
#!/bin/bash
DIR1="/etc"
DIR2="/backup/etc`date +%F`"
echo -e "\e[31mStarting backup...\e[0m"
if [ -e `dirname $DIR2` ];then
sleep 3
cp -av $DIR1 $DIR2
else
mkdir `dirname $DIR2`
sleep 3
cp -av $DIR1 $DIR2
fi
echo -e "\e[31mBackup Finished...\e[0m"
3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率大的值
#!/bin/bash
echo -e "\e[34mDisk of max percentage is `df -h|tr -s ' ' :|grep '/dev/sd'|cut -d: -f5|sort -nr|head -1`.\e[0m"
4、编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排 序
#!/bin/bash
echo -e "\e[35mConnections:\e[0m`netstat -tan|grep "ESTABLISHED"|tr -s ' ' :|cut -d: -f6|sort -nr|uniq -c`"
5、编写脚本 argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给 一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
#!/bin/bash
read -p "请至少输入一个文件路径(作为参数):" ARG
if [ $# -lt 0 ];then
echo "至少应该给一个参数"
exit
else
grep '^$' $ARG |wc -l
fi
6、编写脚本 hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提 示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
#!/bin/bash
read -p "请输入一个主机的IPv4地址:" IPADDR
ping -c 1 -W 1 $IPADDR &> /dev/null
if [ $? -eq 0 ];then
echo -e "\e[31m此IP地址可访问\e[0m"
else
echo -e "\e[31m此IP地址不可访问\e[0m"
fi
7、编写脚本 checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
#!/bin/bash
WARNING=80
SPACE_USED=`df -h|tr -s ' ' %|cut -d% -f5|sort -nr|head -1`
INODE_USED=`df -hi |tr -s ' ' %|cut -d% -f5| sort -nr|head -1`
if [ $SPACE_USED -gt $WARNING ] && [ $INODE_USED -gt $WARNING ];then
mail -s DiskWarning root
else
echo "空间还很充裕"
fi
8、编写脚本 per.sh,判断当前用户对指定参数文件,是否不可读并且不可写
#!/bin/bash
read -p "请输入一个文件名:" FILENAME
[ ! -r $FILENAME -a -w $FILENAME ]
if [ $? -eq 0 ];then
echo -e "\e[31m此用户对该文件不可读并且不可写\e[0m"
else
echo -e "\e[34m此用户对该文件可读或者可写\e[0m"
fi
9、编写脚本 excute.sh ,判断参数文件是否为sh后的普通文件,如果是,添加所有人可执行权限, 否则提示用户非脚本文件
#!/bin/bash
read -p "请输入一个文件:" FILENAME
[[ "$FILENAME" =~ \.sh$ ]] && chmod +x $FILENAME || echo -e "\e[35m此文件为非脚本文件\e[0m"
10、编写脚本 nologin.sh和 login.sh,实现禁止和允许普通用户登录系统
#!/bin/bash
FILE=/data/nologin
[ ! -f FILE ] && touch /data/nologin && { echo "已禁止普通用户登陆系统"; exit ; } || { echo "已禁止普通用户"; exit ; }
#!/bin/bash
FILE=/data/nologin
[ -f FILE ] && rm -rf /data/nologin && { echo "已禁止普通用户登陆系统"; exit ; } || { echo "已禁止普通用户"; exit ; }
11、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin
echo "export PATH=/usr/local/apache/bin:$PATH" >> /etc/profile
. /etc/profile
echo $PATH
12、用户 root 登录时,将命令指示符变成红色,并自动启用如下别名: rm=‘rm –i’ cdnet=‘cd /etc/sysconfig/network-scripts/’ editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eth0’ editnet=‘vim /etc/sysconfig/network-scripts/ifcfg-eno16777736 或 ifcfg-ens33 ’ (如果系统是 CentOS7) vim ~/.bashrc
在行尾追加新内容:
PS1="\[\e[1;31m\][\[\e[0m\]\[\e[1;31m\]\u\[\e[31m\]@\h\[\e[1;31m\] \W\[\e[1;31m\]]\[\e[0m\]\\$ "
alias rm='rm -i'
alias cdnet='cd /etc/sysconfig/network-scripts/'
alias editnet='vim /etc/sysconfig/network-scripts/ifcfg-eth0'
13、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!” echo -e "\e[1;31mHi,dangerous! \e[0m" > /etc/motd
14、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等
vim ~/.vimrc
添加内容:
set ignorecase
set cursorline
set autoindent
autocmd BufNewFile *.sh exec ":.call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1,"#!/bin/bash")
call setline(2,"#***********************************************")
call setline(3,"#Author: Kingdom_Xu")
call setline(4,"#Mail: [email protected]")
call setline(4,"#Version: 1.0")
call setline(5,"#Date: ".strftime("%Y-%m-%d"))
call setline(6,"#FileName: ".expand("%"))
call setline(7,"#Description: The test script")
call setline(8,"#***********************************************")
call setline(9,"")
endif
endfunc
autocmd BufNewFile * normal G
15、编写用户的环境初始化脚本reset.sh,包括别名,登录提示符,vim的设置,环境变量等
#!/bin/bash
#创建一个别名cdnet
#登录提示符为绿色
#使用vim自动显示行号
#设置登录后显示欢迎标语
cat <> ~/.bashrc
alias cdnet='cd /etc/sysconfig/network-scripts'
PS1="\[\e[1;32m\][\[\e[0m\]\[\e[1;32m\]\u\[\e[32m\]@\h\[\e[1;32m\] \W\[\e[1;32m\]]\[\e[0m\]\\$ "
EOF
cat <> ~/.vimrc
set nu
EOF
echo "echo Hello" >> /etc/bashrc
16、编写脚本 createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就 显示其存在,否则添加之;显示添加的用户的id号等信息
#!/bin/bash``
read -p "请输入一个用户名:" NAME
id $NAME &> /dev/null
if [ `echo $?` -eq 0 ];then
echo "此用户已经存在"
else
useradd $NAME
id $NAME
fi
17、编写脚本 yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
#!/bin/bash
read -p "Do you agree(yes|no):" ANS
case $ANS in
[yY]|[yY][eE][sS])
echo "Your answer is YES."
;;
[nN]|[nN][oO])
echo "Your answer is NO."
;;
*)
echo "Please answer is yes or no."
esac
18、编写脚本 filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类 型)
#!/bin/bash
read -p "请输入一个文件名:" FILE
if [ -f $FILE ];then
echo "普通文件"
elif [ -d $FILE ];then
echo "目录"
elif [ -L $FILE ];then
echo “链接文件”
else
echo "其他文件类型"
fi
19、编写脚本 checkint.sh,判断用户输入的参数是否为正整数
#!/bin/bash
read -p "请输入一个整数:" INT
if [ $INT -ge 0 ];then
echo "$INT是正整数"
else
echo "$INT不是正整数"
fi
练习:用for实现
1、判断/var/目录下所有文件的类型
#!/bin/bash
for i in $file;do
if [ -f /var/$i ];then
echo "普通文件"
elif [ -d /var/$i ];then
echo "目录"
elif [ -L /var/$i ];then
echo "链接文件"
else
echo "其他文件"
fi
done
2、添加10个用户user1-user10,密码为8位随机字符
#!/bin/bash
for i in {1..10};do
id user$i &> /dev/null
if [ $? -eq 0 ];then
echo "user$i已经存在"
else
useradd user$i
echo "user$i" | passwd --stdin user$i &> /dev/null
echo "user$i创建成功"
fi
done
3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为 文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
#!/bin/bash
DIR=`ls /etc/rc.d/rc3.d/`
for I in file;do
find /etc/rc.d/rc3.d/S* -exec mv {} "{} start" \; &> /dev/null
find /etc/rc.d/rc3.d/K* -exec mv {} "{} stop" \; &> /dev/null
done
4、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和
#!/bin/bash
read -p "请输入正整数n的值:" N
for ((i=1,sum=0;i<=N;i++));do
let sum+=i
done
echo "The sum is $sum"
5、计算100以内所有能被3整除的整数之和
#!/bin/bash
for ((i=1,sum=0;i<=100;i++));do
let c=$i%3
if [ $c -eq 0 ];then
let sum+=i
fi
done
echo "The sum is $sum."
6、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态
#!/bin/bash
net=192.168.0
for i in `seq 254`;do
ping -c 1 -W 1 $net.$i &> /dev/null
if [ $? -eq 0 ];then
echo -e "\e[32m$net.$i is up.\e[0m"
else
echo -e "\e[31m$net.$i is dowm.\e[0m"
fi
done
7、打印九九乘法表
#!/bin/bash
for ((i=1;i<=9;i++));do
for ((j=$i;j<=9;j++));do
echo -e "${i}x${j}=$[i*j]\t\c"
done
done
8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如: 1AbCdeFgH.html
#!/bin/bash
DIR=/testdir
for i in `seq 10`;do
[ ! -d $DIR ] && mkdir -pv $DIR &> /dev/null
N=`openssl rand -base64 10|sed -nr "s/[^[:alpha:]]//pg"|head -c 8`
touch $DIR/$i$N.html
done
9、打印等腰三角形
read -p "please input triangle line: " line
for ((j=1;j<=$line;j++));do
COL_LOG='\e[1;5;'
COL_AND='\e[0m'
for ((a=1;a<=line-j;a++));do
echo -e " \c"
done
sum=echo 2*$j-1|bc
for ((i=1;i<=${sum};i++));do
RAND="$[$RANDOM%7+31]m"
echo -e "${COL_LOG}${RAND}* \c"
done
echo -e "${COL_AND}"
done
10、猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子 吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只 剩下一个桃子了。求第一天共摘了多少?
#!/bin/bash
sum=1
for ((n=1;n<10;n++));do
sum=$[2*$[$sum+1]]
done
echo "所摘桃子数: $sum"``
练习:用while实现
1、编写脚本,求100以内所有正奇数之和
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ];do
let sum+=i
let i+=2
done
echo "100以内所有正奇数之和为$sum"
2、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和 离线主机各多少
#!/bin/bash
net=192.168.1
i=1
up=0
down=0
while [ $i -le 254 ];do
ping -c 1 -W 1 $net.$i &> /dev/null
if [ $? -eq 0 ];then
echo -e "\e[32m$net.$i is up.\e[0m"
let up++
else
echo -e "\e[31m$net.$i is down.\e[0m"
let down++
fi
let i++
done
echo -e "\e[32mUp is $up.\e[0m"
echo -e "\e[31mDown is $down.\e[0m"
3、编写脚本,打印九九乘法表
#!/bin/bash
i=1
while [ $i -le 9 ];do
j=1
while [ $j -le $i ];do
echo -e "${i}x${j}=$[i*j]\t\c"
let j++
done
let i++
done
4、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的大值和小值
i=1
while true;do
NUM=$RANDOM
if [ "$i" -eq "1" ];then
MAX=$NUM
MIN=$NUM
else
if [ "$MAX" -lt "${num[$i]}" ];then
MAX=${num[$i]}
elif [ "$MIN" -gt "${num[$i]}" ];then
MIN=${num[$i]}
else
true
fi
fi
let i++
done
echo "num is : ${num[@]}"
echo "最大值MAX:$MAX 最小值MIN:$MIN"
5、编写脚本,实现打印国际象棋棋盘
#!/bin/bash
i=1
D_COLOR='\033[1;41m'
S_COLOR='\033[1;47m'
AND_COLOR='\033[0m'
while [ $i -le 8 ];do
if [ "$[$i%2]" -eq "0" ];then
j=1
while [ $j -le 8 ];do
if [ "$[$j%2]" -eq "0" ];then
echo -e "${S_COLOR} ${AND_COLOR}\c"
else
echo -e "${D_COLOR} ${AND_COLOR}\c"
fi
let j++
done
else
j=1
while [ $j -le 8 ];do
if [ "$[$j%2]" -eq "0" ];then
echo -e "${D_COLOR} ${AND_COLOR}\c"
else
echo -e "${S_COLOR} ${AND_COLOR}\c"
fi
let j++
done
fi
echo ""
let i++
done
6、后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、 ad865d2f63是通过对随机数变量RANDOM随机执行命令: echo $RANDOM|md5sum|cut –c1-10 后的结果,请破解这些字符串对应的RANDOM值
#!/bin/bash
RAN=1
cat test.txt | while read CHESS;do
{ while true;do
MD=echo $RAN|md5sum|cut -c1-10
if [[ "$MD" == "$CHESS" ]];then
echo $RAN
break
else
let RAN++
fi
done }&
wait
done
函数练习:
-
编写函数,实现OS的版本判断
#!/bin/bash versions() { NUM=`cut -d' ' -f4 /etc/centos-release|cut -d'.' -f1` if [ $NUM -eq 8 ];then echo -e "\e[1;31mThe system's version is 8.\e[0m" elif [ $NUM -eq 7 ];then echo -e "\e[1;32mThe system's version is 7.\e[0m" else echo -e "\e[1;33mThe system's version is 6.\e[0m" fi } versions
-
编写函数,实现取出当前系统eth0的IP地址
#!/bin/bash getip() { NUM=`cut -d' ' -f4 /etc/centos-release|cut -d'.' -f1` if [ $NUM -eq 8 ];then IP=`ifconfig eth0|sed -n '2p'|tr -s ' ' :|cut -d: -f3` echo -e "\e[1;31mThe system's version is 8.\neth0: $IP\e[0m" elif [ $NUM -eq 7 ];then IP=`ifconfig eth0|sed -n '2p'|tr -s ' ' :|cut -d: -f3` echo -e "\e[1;32mThe system's version is 7.\neth0: $IP\e[0m" else IP=`ifconfig eth0|sed -n '2p'|tr -s ' ' :|cut -d: -f4` echo -e "\e[1;33mThe system's version is 6.\neth0: $IP\e[0m" fi } getip
-
编写函数,实现打印绿色OK和红色FAILED
#!/bin/bash colors() { echo -e "\e[1;32mOK\e[0m" echo -e "\e[1;31mFAILED\e[0m" } colors
-
编写函数,实现判断是否无位置参数,如无参数,提示错误
#!/bin/bash args() { if [ $# -eq 0 ];then echo -e "\e[1;31mError,no argument.\e[0m" else echo -e "\e[1;32mHave $# argument.\e[0m" fi } . args.sh args 3 hello hi args
-
编写函数,实现两个数字做为参数,返回最大值
#!/bin/bash compare() { read -p "Please inpunt two digits:" NUM1 NUM2 if [ $NUM1 -le $NUM2 ];then echo -e "\e[1;33mThe max is $NUM2.\e[0m" fi } compare
- 编写服务脚本/root/bin/testsrv.sh,完成如下要求
(1) 脚本可接受参数:start, stop, restart, status
(2) 如果参数非此四者之一,提示使用格式后报错退出
(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”
考虑:如果事先已经启动过一次,该如何处理?
(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”
考虑:如果事先已然停止过了,该如何处理?
(5) 如是restart,则先stop, 再start
考虑:如果本来没有start,如何处理?
(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAME is
running...”,如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is
stopped...”
(7)在所有模式下禁止启动该服务,可用chkconfig 和 service命令管理
说明:SCRIPT_NAME为当前脚本名
#!/bin/bash
. /etc/rc.d/init.d/functions
FILE=/var/lock/subsys/testsrv
func1() {
[ ! -e $FILE ] && mkdir -p $FILE && echo -e "\e[1;34m启动成功\e[0m"
}
func2() {
[ -e $FILE ] && rm -rf $FILE && echo -e "\e[1;35m停止完成\e[0m"
}
func3() {
[ -e $FILE ] && echo -e "\e[1;36m$FILE is running...\e[0m" || echo -e "\e[1;37m$FILE is stopped...\e[0m"
}
case $1 in
'start')
sleep 2
func1
;;
'stop')
sleep 2
func2
;;
'restart')
sleep 2
func2
sleep 2
func1
;;
'status')
sleep 2
func3
;;
*)
echo -e "\e[1;35mUsage: `basename $0` [start|stop|restart|status]\e[0m"
exit 1
esac
chkconfig --add testsrv &> /dev/null
chkconfig testsrv off &> /dev/null
- 编写脚本/root/bin/copycmd.sh
(1) 提示用户输入一个可执行命令名称
(2) 获取此命令所依赖到的所有库文件列表
(3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
如:/bin/bash ==> /mnt/sysroot/bin/bash
/usr/bin/passwd ==> /mnt/sysroot/usr/bin/passwd
(4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下: 如:/lib64/ld-linux-x86-
64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2
(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述
功能;直到用户输入quit退出