简书初体验之作业习题
作业
练习:
1、编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
#!/bin/bash
set -ue
. /date/sh/color.sh
$GREEN'*******************************************************************'$END
$GREEN HOSTNAME:`hostname`$END
$GREEN IP:`ifconfig ens33|egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"|head -1`$END
$GREEN OS:`cat /etc/centos-release`
$GREEN kernet:`uname -a`
$GREEN CPU:`cat /proc/cpuinfo |egrep -o "model name.*"|head -1|cut -d: -f2`
$GREEN Free:`free -h|egrep -o "Mem.*"|tr -s " " :|cut -d: -f2 `
$GREEN Disk Free:`lsblk|egrep sda|head -1|tr -s " " :|cut -d: -f5` $GREEN'*******************************************************************'$END
2、编写脚本 backup.sh,可实现每日将/etc/目录备份到/backup/etcYYYY-mm-dd中
#!/bin/bash
set -ue
DES=/backup/etc_`date +%F-%T`/
SOU=/etc/
cp -av $SOU $DES > /dev/null #'cp -av' 递归复制,并保留文件的所有属性,且显示复制过程
3、编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值
df -h |egrep "^/dev/"|sort -nr|tr -s " " :|cut -d: -f1,5|head -1
4、编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
netstat -nat|tr -s " " \| |cut -d\| -f5|egrep -o "([0-9]{1,3}\.){3}[0-9]{1,3}"|sort -nr|uniq -c|head -1
练习
1、编写脚本 argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
$#: #传入脚本的参数个数;
$0: #脚本自身的名称;
$1: #传入脚本的第一个参数;
$2: #传入脚本的第二个参数;
$@: #传入脚本的所有参数;
$*: #传入脚本的所有参数;
$$: #脚本执行的进程id;
$?: #上一条命令执行后的状态,结果为0表示执行正常,结果为1表示执行异常;
#其中$@与$*正常情况下一样,当在脚本中将$*加上双引号作为“$*”引用时,此时将输入的所有参数当做一个整体字符串对待。比如输入参数有a b c三个参数,则“$*”表示“a b c”一个字符串。
#!/bin/bash
if [ $# -lt 1 ];then # $#表示这个脚本的参数个数
echo "至少应该给一个参数"
exit
elif [ -f $1 ];then
grep "^$" $1 | wc -l
else # else 表示如果以上条件都为假的时候,执行下面的命令
echo "请输入有效文件路径"
exit
2、编写脚本 hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”3、编写脚本 checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
#!/bin/bash
. /date/sh/color.sh
read -p "请输入要测试的IPV4地址:" IP
if [[ ! $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]];then
echo -e "$RED请输入正确的IP地址$END"
exit 1
fi
if ping -c1 -w2 $IP &> /dev/null;then
$GREEN"IP address is UP"$END
else echo -e $RED"IP address IS Down"$END
fi
#!/bin/bash
set -ue
. /date/sh/color.sh
SPACE=`df|egrep -o [0-9]+%|tr -d %|sort -nr|head -1`
INODE=`df -i|egrep -o [0-9]+%|tr -d %|sort -nr|head -1` #[0-9]+ 表示0-9的数字组合至少要出现1个以上
WARNING=0
[ "$SPACE" -gt $WARNING -o $INODE -gt $WARNING ] && echo "Disk_used:$SPACE, Inode_used:$INODE, will be full"|mail -s "disk warning" root
You have new mail in /var/spool/mail/root
4、编写脚本 per.sh,判断当前用户对指定参数文件,是否不可读并且不可写
#!/bin/bash
FILE=$1
[ ! -r $FILE -a ! -w $FILE ] && echo "不可读且不可写"
5、编写脚本 excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
#!/bin/bash
set -ue
read -p "请输入参数文件:" FILE
[ -f $FILE ] && [[ "$FILE" == *.sh ]] && chmod +x $FILE || echo "这不是脚本文件"
6、编写脚本 nologin.sh和 login.sh,实现禁止和允许普通用户登录系统
echo "System maintenance, no landing" > nologin #在/etc 执行该命令可以禁止普通用户登陆,但是root不受影响
练习
1、让所有用户的PATH环境变量的值多出一个路径,例如:/usr/local/apache/bin
vim ~/.bash_profile
2、用户 root 登录时,将命令指示符变成红色,并自动启用如下别名: rm=‘rm –i’
编写root对应账户下得.bashrc
3、任意用户登录系统时,显示红色字体的警示提醒信息“Hi,dangerous!”
vim /etc/issue #输入你想显示的内容
4、编写生成脚本基本格式的脚本,包括作者,联系方式,版本,时间,描述等
练习
1、编写脚本 createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之。并设置初始密码为123456,显示添加的用户的id号等信息,在此新用户第一次登录时,会提示用户立即改密码,如果没有参数,就提示:请输入用户名
#!/bin/bash
read -p "please input Newusername:" NAME
if [ -z "$NAME" ];then
echo "not empty"
exit 1
elif id $NAME &> /dev/null;then
echo "User exist!"
elif useradd -p abc123456 $NAME;then
chage -d 0 $NAME
echo "Create a new user:$NAME,UID:`id $NAME`"
fi
#!/bin/bash
set -ue
read -p "Please input username:" NAME
if [ -z $NAME ];then
echo "User name is empty"
exit 1
elif id $NAME &> /dev/null;then
echo "user exist"
exit 2
elif useradd -p abc123456 $NAME;then
echo "success"
fi
2、编写脚本 yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
知识点
#[[ ]]
用法,建议,当使用正则表达式或通配符使用,一般情况使用 [ ]
==
左侧字符串是否和右侧的PATTERN相同
注意:此表达式用于[[ ]]
中,PATTERN为通配符
=~
左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
注意: 此表达式用于[[ ]]
中;扩展的正则表达式
#!/bin/bash #编写脚本 yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
set -ue
read -p "请输入yes or no:" ANSWER
if [[ $ANSWER =~ ^[yY][Ee][Ss]$ ]];then
echo "You input is: yes"
elif [[ $ANSWER =~ ^[Nn][Oo] ]];then
echo "You input is: no"
else
echo "input erro"
fi
----------------------------------------------
#!/bin/bash
read -p "Do you agree(yes/no)? " INPUT
case $INPUT in
[yY]|[Yy][Ee][Ss])
echo "You input is YES"
;;
[Nn]|[Nn][Oo])
echo "You input is NO"
;;
*)
echo "Input fales,please input yes or no!"
esac
----------------------------------------------
#!/bin/bash
read -p "Do you agree(yes/no)? " INPUT
INPUT=`echo $INPUT | tr 'A-Z' 'a-z'`
case $INPUT in
y|yes)
echo "You input is YES"
;;
n|no)
echo "You input is NO"
;;
*)
echo "Input fales,please input yes or no!"
esac
3、编写脚本 fifiletype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)4、编写脚本 checkint.sh,判断用户输入的参数是否为正整数
#!/bin/bash
set -ue
read -p "Please enter the file path:" FILE_PATH
[ -z $FILE_PATH ] && (echo "The file path is empty";exit 1)
TYPE=`ls -l $FILE_PATH|cut -c 1`
case $TYPE in
-)
echo "File type is general file"
;;
b)
echo "File type is block file"
;;
d)
echo "File type is directory file"
;;
l)
echo "File type is link file"
;;
p)
echo "File type is pipeline file"
;;
s)
echo "File type is socket file"
;;
c)
echo "File type is character file"
;;
esac
---------------------------------------------------------------------------
#判断一个数字是否为整数
#!/bin/bash
read -p "Please input a string:" STRING
[ -z $STRING ] && { echo "Please input string";exit 1; }
[[ $STRING =~ ^[0-9]+$ ]] || { echo "please input digit";exit 2; }
if [ $STRING -gt 0 ];then
echo "The digit is int"
fi
5、编写脚本 reset.sh,实现系统安装后的初始化环境,包括:1、别名 2、环境变量,如PS1等 3、安装常用软件包,如:tree 5、实现固定的IP的设置,6、vim的设置等