shell脚本语言的基本用法
编写脚本 systeminfo.sh,显示当前主机系统信息,包括:主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
[22:23:52 root@centos7 shellscript]# cat systeminfo.sh
#!/bin/bash
RED="\033[1;31m"
GREEN="echo -e \033[1;32m"
END="\033[0m"
$GREEN---------------------------------System info----------------------------------
echo -e "主机名: $RED `hostname`$END"
echo -e "IPV4地址: $RED `ifconfig |grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'|head -1`$END"
echo -e "操作系统版本: $RED `cat /etc/redhat-release`$END"
echo -e "内核版本: $RED `uname -r`$END"
echo -e "CPU型号: $RED `lscpu|grep -E "Model name"|tr -s ' '|cut -d: -f2`$END"
echo -e "内存大小: $RED `free -h|grep -E "Mem"|tr -s " " :|cut -d: -f2`$END"
echo -e "硬盘大小: $RED `lsblk|grep -Ew "sda"|tr -s " "|cut -d" " -f4`$END"
$GREEN------------------------------------------------------------------------------
[22:24:00 root@centos7 shellscript]# sh systeminfo.sh
---------------------------------System info----------------------------------
主机名: centos7.magedu.com
IPV4地址: 10.0.0.154
操作系统版本: CentOS Linux release 7.9.2009 (Core)
内核版本: 3.10.0-1160.el7.x86_64
CPU型号: Intel(R) Core(TM) i5-9600KF CPU @ 3.70GHz
内存大小: 1.8G
硬盘大小: 200G
------------------------------------------------------------------------------
[22:24:02 root@centos7 shellscript]#
编写脚本 backup.sh,可实现每日将 /etc/ 目录备份到 /backup/etcYYYY-mm-dd中
[00:33:00 root@localhost data]# cat -A backup.sh
#!/bin/bash$
echo -e "\033[1;32mstarting backup...\e[0m"$
sleep 2$
cp -a /etc/ /data/etc`date +%F`/$
echo -e "^[[1;33mbackup finished...^[[0m"$
[00:33:13 root@localhost data]#
编写脚本 disk.sh,显示当前硬盘分区中空间利用率最大的值
[00:43:03 root@localhost data]# cat disk.sh
#!/bin/bash
#===================显示当前硬盘分区中空间利用率最大的值======================
echo "maximum space utilization: `df|grep -Eo "[0-9]+%"|sort -nr|head -1`"
[00:42:57 root@localhost data]# bash disk.sh
maximum space utilization: 12%
编写脚本 links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序
[01:32:54 root@localhost data]# cat links.sh
#!/bin/bash
#====================连接本机的IPV4地址和连接数================================
echo "`ss -nt|egrep -o '([0-9]+.)+[[:space:]]+$'|egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}'|uniq -c|sort -nr`"
[01:33:05 root@localhost data]# bash links.sh
3 10.0.0.1
1 10.0.0.151
[01:33:11 root@localhost data]#
组合测试条件
编写脚本 argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数
[15:21:42 root@localhost data]# cat argsnum.sh
#!/bin/bash
echo "progrom is starting"
[ $# -lt 1 ] && { echo "至少应该输入一个参数"; exit; } || echo "empty line num is `grep -E "^[[:space:]]*$" $1|wc -l`"
echo "progrom is end"
[15:22:01 root@localhost data]#
编写脚本 hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”
[15:28:22 root@localhost data]# cat hostping.sh
#!/bin/bash
ping -c1 -w1 $1 > /dev/null && echo "该IP地址可访问" || echo "该IP地址不可访问"
编写脚本 checkdisk.sh,检查磁盘分区空间和inode使用率,如果超过80%,就发广播警告空间将满
[16:34:43 root@localhost data]# cat checkdish.sh
#!/bin/bash
WARNING=80
SPACE_USED=`df|grep -Eo "[0-9]+%"|grep -Eo [0-9]+|sort -nr|head -1`
INODE_USED=`df -i|grep -Eo "[0-9]+%"|grep -Eo [0-9]+|sort -nr|head -1`
[ $SPACE_USED -ge $WARNING -o $INODE_USED -ge $WARNING ] && echo "空间将满,请注意。"|| echo "使劲造"
编写脚本 per.sh,判断当前用户对指定参数文件,是否不可读并且不可写
[17:39:39 root@localhost data]# cat per.sh
#!/bin/bash
[ ! -r $1 -a ! -w $1 ] && echo "你对文件${1}没有读写的权限"|| echo "你对文件${1}至少有读写权限之一"
编写脚本 excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件
[17:48:30 root@localhost data]# cat excute.sh
#!/bin/bash
[[ $1 == *.sh ]] && chmod +x $1 || echo "非脚本文件"
编写脚本 nologin.sh和 login.sh,实现禁止和允许普通用户登录系统
[20:52:04 root@centos7 shell]# cat nologin.sh
#!/bin/bash
[ $# -eq 0 ] && { echo "At least one parameter must be entered";exit; }
id $1 &> /dev/null || { echo "no such user"; exit; }
[ $(id -u $1) -ge 1000 ] && { usermod -s /sbin/nologin $1 &> /dev/null;echo "You are not allowed to login"; } || echo "system user"
[09:25:35 root@localhost shell]# cat login.sh
#!/bin/bash
[ $# -eq 0 ] && { echo "One parameter must be entered";exit; }
id $1 &> /dev/null || { echo "no such user"; exit; }
[ $(id -u $1) -ge 1000 ] && { usermod -s /bin/bash $1 &> /dev/null;echo "You are allowed to login now"; } || echo "system user"
编写脚本 createuser.sh,实现如下功能:使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之。并设置初始密码为123456,显示添加的用户的id号等信息,在此新用户第一次登录时,会提示用户立即改密码,如果没有参数,就提示:请输入用户名.
[15:27:51 root@localhost shell]# cat createuser2.sh
#!/bin/bash
#判断参数输入
if [ $# -ne 1 ];then
echo "请输入一个用户名:"
exit
fi
if id $1 &> /dev/null;then
echo "this user $1 already exist"
exit
else
useradd $1 &> /dev/null
echo '123456'| passwd --stdin $1 &> /dev/null
passwd -e $1 &> /dev/null
id $1
fi
[15:36:15 root@localhost shell]# cat createuser.sh
#!/bin/bash
#判断是否输入参数
[ $# -eq 0 ] && { echo "请输入一个用户名作为参数";exit; }
#判断用户是否存在
id $1 &> /dev/null && { echo "用户名已存在。";exit; } || { useradd $1;echo -e '123456\n123456'|passwd $1 &> /dev/null;passwd -e $1 &> /dev/null;id $1; }
编写脚本 yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息
[15:36:22 root@localhost shell]# cat yesorno.sh
#!/bin/bash
read -p "pls input yes or no: " ANSWER
ANSWER=$(echo $ANSWER | tr 'A-Z' 'a-z')
[ "$ANSWER" = "yes" -o "$ANSWER" = "y" ] && echo "yes" || echo "No"
[15:38:06 root@localhost shell]# cat case_yesorno.sh
#!/bin/bash
read -p "Do you agree? (yes or no): " INPUT
INPUT=`echo $INPUT | tr 'A-Z' 'a-z'`
case $INPUT in
y|yes)
echo "you agree with it."
;;
n|no)
echo "you don't agree with it"
;;
*)
echo "Input false, please input yes or no"
esac
[15:38:19 root@localhost shell]# cat case_yesorno2.sh
#!/bin/bash
read -p "Do you agree?(yes or no): " INPUT
case $INPUT in
[Yy]|[Ys][Ee][Ss])
echo "you agree with it"
;;
[Nn]|[Nn][Oo])
echo "you don't agree with it"
;;
*)
echo "Input failse, pls input yes or no"
esac
编写脚本 filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)
[16:21:54 root@localhost shell]# cat filetype.sh
#!/bin/bash
#判断文件类型
if [ $# -ne 1 ];then
echo "请输入一个文件"
exit
fi
if [ -f $1 ];then
echo "$1 is a normal file"
elif [ -d $1 ];then
echo "$1 is a directory"
elif [ -L $1 ];then
echo "$1 is a symbolic like file"
elif [ -p $1 ];then
echo "$1 is a pipeline file"
elif [ -S $1 ];then
echo "$1 is a socket file"
else
echo "$1 filetype is unknow"
fi
编写脚本 checkint.sh,判断用户输入的参数是否为正整数
[17:02:49 root@localhost shell]# cat checkint.sh
#!/bin/bash
#判断用户输入1个数值
if [ $# -ne 1 ];then
echo "请输入一个数值"
exit
fi
if [[ $1 =~ [^.]+ ]] && [ $1 -gt 0 ] &> /dev/null;then
echo "$1是正整数"
else
echo "$1不是正整数"
fi
编写脚本 reset.sh,实现系统安装后的初始化环境,包括:1、别名 2、环境变量,如PS1等 3、安装常用软件包,如:tree 5、实现固定的IP的设置,6、vim的设置等
for循环
判断/var/目录下所有文件的类型
15:50:20 root@localhost shell]# cat for_var.sh
#!/bin/bash
DIR=/var
cd $DIR || { echo "无法进入$DIR目录";exit 1; }
for FILE in *; do
if [ -b $FILE ];then
echo "$FILE type is block special"
elif [ -c $FILE ];then
echo "$FILE type is character special"
elif [ -L $FILE ];then
echo "$FILE type is symbolic link"
elif [ -p $FILE ];then
echo "$FILE type is pipeline"
elif [ -S $FILE ];then
echo "$FILE type is socket file"
elif [ -d $FILE ];then
echo "$FILE type is directory"
else
echo "$FILE type unknow"
fi
done
添加10个用户user1-user10,密码为8位随机字符
[16:38:38 root@localhost shell]# cat for_user.sh
#!/bin/bash
#使用for循环创建10个用户
#
for i in `seq 10`;do
if id user$i &> /dev/null;then
echo "user${i}已存在,跳过创建步骤。"
else
useradd user$i
PWD=$(cat /dev/urandom|tr -dc [[:alnum:]][[:print:]]|head -c8)
echo user$i:$PWD|chpasswd &> /dev/null
echo user$i:$PWD >> /data/new_user.log
fi
done
/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
[16:54:27 root@localhost shell]# cat for_rc3.sh
#!/bin/bash
DIR=/etc/rc.d/rc3.d
cd $DIR || { echo "${DIR}: no such file or directory";exit 1; }
for FILE in *;do
if [[ "$FILE" =~ ^K.* ]];then
echo "$FILE stop"
elif [[ "$FILE" =~ ^S.* ]];then
echo "$FILE start"
else
echo "others"
fi
done
编写脚本,提示输入正整数n的值,计算1+2+…+n的总和;
[17:06:41 root@localhost shell]# cat for_sum.sh
#!/bin/bash
sum=0
read -p "请输入一个正整数:" NUM
for i in `seq $NUM`;do
let sum+=i
done
echo sum=$sum
计算100以内所有能被3整除的整数之和
[08:56:29 root@localhost shell]# cat for_sum2.sh
#!/bin/bash
#100以内能被3整除的整数之和
sum=0
for((i=1;i<=100;i++));do
let var=i%3
[ $var -eq 0 ] && let sum+=$i
done
echo $sum
编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态
#!/bin/bash
read -p '请输入网段地址,例如:192.168.0' NET
for IP in {1..254};do
ping -c1 -w1 $NET.$IP &> /dev/null && echo -e "\e[1;$[RANDOM%7+31]m$NET.$IP is up\e[0m" || echo -e "\e[1;$[RANDOM%7+31]m$NET.$IP is down"
done
打印九九乘法表
#!/bin/bash
#打印99乘法表
for((i=1;i<=9;i++));do
for((j=1;j<=i;j++));do
echo -en "$j*$i=$[i*j]\t"
done
echo
done
在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html
#!/bin/bash
#创建10个html文件
DIR=/testdir
for i in {1..10};do
touch ${DIR}/$i$(cat /dev/urandom |tr -dc [[:alpha:]]|head -c8).htm
done
打印等腰三角形
#!/bin/bash
LEN=16
#MID=$((LEN/2))
#echo $LEN $MID
for((ROW=1;ROW<=${LEN};ROW++));do
for((i=$[LEN-ROW];i>=1;i--));do
echo -n " "
done
for((j=1;j<=ROW;j++));do
echo -n "* "
done
echo
done
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,只剩下一个桃子了。求第一天共摘了多少?
[15:41:34 root@localhost shell]# cat for_peach.sh
#!/bin/bash
sum=1
for ((i=10;i>1;i--));do
let sum=(sum+1)*2
done
echo "总计有桃子:${sum}个"
[15:41:33 root@localhost shell]# bash for_peach.sh
总计有桃子:1534个