练习一
1、编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
 #!/bin/bash
  2 #---------------------------------------
  3 #Filename:    argsnum62.sh
  4 #Revision:    1.0
  5 #Language:    English
  6 #Author:      root
  7 #Date:        2017-11-24
  8 #Description: script write
  9 #-------------------------------------------
 10 
 11 [ $# -lt 1 ] && echo "You shound give a parameter at least!" && exit 10
 12 [ -e $1 ] &&  echo "The blankLine is `grep '^[[:space:]]*$' $1|wc -l`" || echo "No such f
    ile or directory!"

2、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满

diskNum=`df | grep "/dev/sd"|grep -o " [0-9]*% "|grep -o  "[0-9]*"|sort -nr|head -1`
 17 
 18 inodeNum=`df -i | grep "/dev/sd"|grep -o " [0-9]*% "|grep -o  "[0-9]*"|sort -nr|head -1`
 19 Sum=80
 20 [ "$diskNum" -ge "$Sum" ]&& echo -e "磁盘空间占用率超过$Sum\a `wall 'The disk space will 
    be full.' `"|| echo "磁盘利用率为:$diskNum,可以使用"
 21 
 22 [ "$inodeNum" -ge "$Sum" ]&& echo -e "inode占用率超过$Sum %\a `wall 'The disk space will 
    be full.' `"|| echo "inode利用率为:$inodeNum,可以使用"

练习二
1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
#!/bin/bash
#================================
#FileName     : systeminfo.sh
#Author       : Jhon
#Description  : 
#DateTime     : 2017-11-26
#Version      : V1.0
#=================================
hostname=`hostname`
ipv4=`ifconfig ens33 |grep "inet " |egrep "[0-9]{1,3}(\.[0-9]{1,3}){3}" -o |head -n 1
`
os_version=`cat /etc/redhat-release`
kernel_version=`uname -r`
cpu_info=$(lscpu |grep "Model name:" | tr -s " " | cut -d: -f2)
mem_size=`cat /proc/meminfo  |grep "MemTotal" |cut -c 10- | grep "[^[:space:]].*" -o`
disk_size=`df -h`

echo "system info is
===========================================
hostname=$hostname
ipv4=$ipv4
kernel_version=$kernel_version
cpu_info=$cpu_info
mem_size=$mem_size
disk_size=$disk_size"

2、编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中(关键代码)
cp   -a    /etc/   /root/etc$(date "+%F")   

3、编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序(关键代码)
ss -tan |grep "^ESTAB" |egrep "[0-9]{1,3}(\.[0-9]{1,3}){3}:[0-9]{1,6}[[:space:]]*$" -o |cut -d ":" -f 1 |sort |uniq -c | sort  -r -n -t " " -k1
练习三
1、编写脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和(关键代码)

uid_10=$(cat /etc/passwd |head -n 10 |tail -n 1 |cut -d ":" -f 3)
uid_20=$(cat /etc/passwd |head -n 20 |tail -n 1 |cut -d ":" -f 3)
sum_id=$[uid_10+uid_20]
echo $sum_id

2、编写脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和(关键代码)
file1_space_line=`cat $1  |grep "^[[:space:]]*$" |wc -l`
file2_space_line=`cat $2  |grep "^[[:space:]]*$" |wc -l`
sum_space_line=$[file1_space_line+file2_space_line]
echo $sum_space_line

3、编写脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件(关键代码)
let sumfiles=$[`ls -A -1 /etc |wc -l`]+$[`ls -A -1 /usr | wc -l`]+$[`ls -A -1 /var |wc -l`]
echo $sumfiles

练习四
1、编写脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
"argsnum64.sh" 2L, 180C                                                  
[ $# -lt 1 ] && echo "you must give one arg at lease!" && exit 4
[ -e $1 ] && echo "spacenums ----------   " $(grep '^[[:space:]]*$' $1|wc -l)|| echo "$1 is
 not file or directory"

2、编写脚本/root/bin/checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
diskNum=$(df | grep '/dev/sd*' | grep -o '[0-9]*%'  | cut -d "%" -f1 | sort -rn | head -n1)
inodeNum=$(df -i| grep '/dev/sd*' | grep -o '[0-9]*%'  | cut -d "%" -f1 | sort -rn | head -n1)
[ "$diskNum" -gt 10 ] && echo -e "磁盘空间利用率超过 10%\n" $(wall 'The disk space is full') || echo "磁盘利用率为: $diskNum,可以使用"
[ "$inodeNum" -gt 10 ] && echo -e "磁盘空间利用率超过 10%\n" $(wall 'The disk space is full') || echo  "inode利用率为: $inodeNum ,可以使用"

 类似的命令进行组合
disk = $((df -I  /dev/sd* ; df  -I  /dev/sd* ) | egrep  -o  "[0-9]+"  省略……..

1、 编写一个脚本创建文件时自动创建文件名、作者、日期、描述等注释信息
cat <<_EOF_ > $1
#!/bin/bash
#================================
#FileName     : $1
#Author       : Jhon
#Description  : 
#DateTime     : $(date "+%F")
#Version      : V1.0
#=================================
_EOF_
chmod +x $1
vim + $1 #打开文件定位到行尾

鸡兔同笼,已知鸡和兔数量,计算出兔和鸡分别有多少只?
鸡 x    x + y =head
兔  y   2x + 4y = foot
2x = foot – 4*(head - x)   整理  x = (4*head – foot)/2
 
read -p "please input head num : " head
read -p "please input foot num : " foot
ji=$[(4*head-foot)/2]
tu=$[head-ji]
echo " ji num :  $ji "
echo " tu num :  $tu "

提示用户输入yes或no进行确认

自己编写:
read -p "Do you agree ?yes or no " ANS 
yn=$(echo "$ANS" | tr "[:lower:]" "[:upper:]")
[ "$yn" == Y -o "$yn" == YES ] && echo "you input is YES" && exit 10  
[ "$yn" == N -o "$yn" == NO ] && echo "you input is NO" &&  exit 11 || echo "you input is 
wrong" && exit 14

注意正则表达式中用或关系分别需行首行尾锚定
参考编写:
ans=noo;[[ "$ans" =~ ^[Yy]([Ee][Ss])?$|^[Nn][Oo]?$ ]] && echo true
 
[[ "$ans" =~ ^[Yy]([Ee][Ss])?$ ]]
ans=noo;[[ "$ans" =~ ^[Nn][Oo]?$ ]] 

shell脚本编程基础_第1张图片