SHELL脚本编程

shell脚本语言的基本用法

  1. 编写脚本 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]# 
  1. 编写脚本 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]# 
  1. 编写脚本 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%
  1. 编写脚本 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]# 

组合测试条件

  1. 编写脚本 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]# 
  1. 编写脚本 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地址不可访问"
  1. 编写脚本 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 "使劲造"
  1. 编写脚本 per.sh,判断当前用户对指定参数文件,是否不可读并且不可写

[17:39:39 root@localhost data]# cat per.sh 
#!/bin/bash
[ ! -r $1 -a ! -w $1 ] && echo "你对文件${1}没有读写的权限"|| echo "你对文件${1}至少有读写权限之一"
  1. 编写脚本 excute.sh ,判断参数文件是否为sh后缀的普通文件,如果是,添加所有人可执行权限,否则提示用户非脚本文件

[17:48:30 root@localhost data]# cat excute.sh 
#!/bin/bash
[[ $1 == *.sh ]] && chmod +x $1 || echo "非脚本文件"
  1. 编写脚本 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"
  1. 编写脚本 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; }
  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
  1. 编写脚本 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
  1. 编写脚本 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
  1. 编写脚本 reset.sh,实现系统安装后的初始化环境,包括:1、别名 2、环境变量,如PS1等 3、安装常用软件包,如:tree 5、实现固定的IP的设置,6、vim的设置等

for循环

  1. 判断/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
  1. 添加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
  1. /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
  1. 编写脚本,提示输入正整数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
  1. 计算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
  1. 编写脚本,提示请输入网络地址,如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
  1. 打印九九乘法表

#!/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
  1. 在/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
  1. 打印等腰三角形

#!/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
  1. 猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第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个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值