编辑linux时可用的shell代码段

shell的脚本语句:

数值测试:
       -gt 是否大于
       -ge 是否大于等于
       -eq 是否等于
       -ne 是否不等于
       -lt 是否小于
       -le 是否小于等于

字符串测试:
        == 是否等于
        > ascii码是否大于ascii码
        < 是否小于
        != 是否不等于
        =~ 左侧字符串是否能够被右侧的PATTERN所匹配


存在性测试
     -a FILE:同-e
     -e FILE: 文件存在性测试,存在为真,否则为假存在性及类别测试
     -b FILE:是否存在且为块设备文件
     -c FILE:是否存在且为字符设备文件
     -d FILE:是否存在且为目录文件
      -f FILE:是否存在且为普通文件
      -h FILE 或 -L FILE:存在且为符号链接文件
      -p FILE:是否存在且为命名管道文件
      -S FILE:是否存在且为套接字文件


文件权限测试:
       -r FILE:是否存在且可读
       -w FILE: 是否存在且可写
       -x FILE: 是否存在且可执行文件特殊权限测试:
       -u FILE:是否存在且拥有suid权限
       -g FILE:是否存在且拥有sgid权限
       -k FILE:是否存在且拥有sticky权限


文件大小测试:
       -s FILE: 是否存在且非空文件是否打开:
       -t fd: fd 文件描述符是否在某终端已经打开
       -N FILE:文件自从上一次被读取之后是否被修改过
       -O FILE:当前有效用户是否为文件属主
       -G FILE:当前有效用户是否为文件属组


组合测试条件
第一种方式:
        COMMAND1 && COMMAND2 并且
        COMMAND1 || COMMAND2 或者
第二种方式:
         EXPRESSION1 -a EXPRESSION2 并且
         EXPRESSION1 -o EXPRESSION2 或者
         ! EXPRESSION


条件选择if 语句

  文件/文件夹(目录)判断

[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d DIR ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。

 

字符串判断

[ -z STRING ]     如果STRING的长度为零则为真 ,即判断是否为空,空即是真;
[ -n STRING ]     如果STRING的长度非零则为真 ,即判断是否为非空,非空即是真;
[ STRING1 = STRING2 ]     如果两个字符串相同则为真 ;
[ STRING1 != STRING2 ]    如果字符串不相同则为真 ;
[ STRING1 ]     如果字符串不为空则为真,与-n类似

 

数值判断

INT1 -eq INT2 INT1和INT2两数相等为真 ,=
INT1 -ne INT2 INT1和INT2两数不等为真 ,<>
INT1 -gt  INT2 INT1大于INT1为真 ,>
INT1 -ge  INT2 INT1大于等于INT2为真,>=
INT1 -lt   INT2 INT1小于INT2为真 ,<</div>
INT1 -le  INT2 INT1小于等于INT2为真,<=

 

 

复杂逻辑判断
-a    与
-o    或
 !     非

 

单分支

     if 判断条件;then
          条件为真的分支代码
     fi

 

双分支

   if 判断条件; then
        条件为真的分支代码
   else
        条件为假的分支代码
   fi

 

多分支

    if 判断条件1; then
           条件为真的分支代码
    elif 判断条件2; then
           条件为真的分支代码
    elif 判断条件3; then
           条件为真的分支代码
    else
           以上条件都为假的分支代码
    fi

 

 

条件判断

    case 变量引用 in
    PAT1)
             分支1
             ;;
    PAT2)
             分支2
             ;;
      ...
    *)
             默认分支
              ;;
     esac

  

  

案例1:要求获取操作系统、主机名、cpu、内存、磁盘信息

# cat systeminfo.sh

#! /bin/bash

# ------------------------------------------
# Filename: systeminfo.sh
# Revision: 3.0
# Date: 2021/12/30
# Author: chenhao
# Email: 5098438@qq.com
# Website: https://www.cnblogs.com/jdbinfo
# Description:
# ------------------------------------------
# Copyright: 2021 chenhao
# License: GPL

banbeng=$(cat /etc/redhat-release)
zhujiming=$(hostname)
ipaddr=$(ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:
")
cpu=$(cat /proc/cpuinfo |grep "cores"|uniq |awk -F : '{print $2}'|sed 's/^[ \t]*//g')
physi=$(grep 'physical id' /proc/cpuinfo | sort | uniq | wc -l)
proce=$(cat /proc/cpuinfo |grep 'processor'|wc -l)
systembb=$(uname -m)
cpucore=$(grep 'model name' /proc/cpuinfo |uniq |awk -F : '{print $2}' |sed 's/^[ \t]*//g' |
sed 's/ \+/ /g')
meminfo=$(free -h|grep Mem|tr -s ' ' : |cut -d : -f2)
DISK=`df|tr -s ' ' %|cut -d% -f5|sort -nr|head -1`
fuwuqi=$(dmidecode|grep "System Information" -A9|egrep "Manufacturer|Product|Serial")
memslot=$(dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range |wc -l)
memslotmax=$(dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range|awk -F : '{prin
t $2}'|uniq)

echo "***********************************************************************************"
echo " 操作系统版本:$banbeng"
echo " 主机名:$zhujiming"
echo " ip地址:$ipaddr"
echo " CPU数量:$physi"
echo " cpu核心数:$cpu"
echo " cpu线程数:$proce"
echo " 操作系统位数:$systembb"
echo " cpu名称:$cpucore"
echo " 内存大小:$meminfo"
echo " 内存占用槽位:$memslot"
echo " 内存槽位内存大小: $memslotmax"
echo " 磁盘最大使用率:占百分之$DISK"
echo " 服务器信息:$fuwuqi "
echo "***********************************************************************************"

 

案例二:利用ping命令

# cat ping.sh

#!/bin/bash
#
#********************************************************************
#Author: chenhao
#QQ: 5098438
#Date: 2021-12-23
#FileName: ping.sh
#URL: http://www.cnblogs.com/jdbinfo
#Description: The test script
#Copyright (C): 2019 All rights reserved
#********************************************************************
read -p "请输入ip地址: " IP
ping -c1 -w1 $IP &> /dev/null && echo "$IP 正在运行"|| echo "$IP 网络不可达";exit
echo "脚本完成"

  

 案例三:点名器

# cat dianmingqi.sh 

#! /bin/bash
# ------------------------------------------
# Filename: dianmngqi.sh
# Revision: 3.0
# Date: 2021/12/30
# Author: chenhao
# Email: 5098438@qq.com
# Website: https://www.cnblogs.com/jdbinfo
# Description: 
# ------------------------------------------
# Copyright: 2021 chenhao
# License: GPL

line=`cat user.txt |wc -l`
num=$[RANDOM%$line+1]
sed -n "${num}p" user.txt 

# cat user.txt

zhangsan
lisi
wangwu
xiaoliu

  

 案例四:身高和体重的查询

# cat if_bmi.sh

#!/bin/bash
#
#********************************************************************
#Author: chenhao
#QQ: 5098438
#Date: 2021-12-31
#FileName: if_bmi.sh
#URL: http://www.cnblogs.com/jdbinfo
#4.1.2 条件判断case语句
#格式:
#case支持glob风格的通配符:
#范例:
#Description: The test script
#Copyright (C): 2019 All rights reserved
#********************************************************************
read -p "请输入身高(m为单位): " HIGH
if [[ ! "$HIGH" =~ ^[0-2].?[0-9]{,2}$ ]];then echo "输入错误的身高"; exit 1; fi
read -p "请输入体重(kg为单位): " WEIGHT
if [[ ! "$WEIGHT" =~ ^[0-9]{1,3}$ ]];then echo "输入错误的体重"; exit 1; fi
BMI=`echo $WEIGHT/$HIGH^2|bc`
if [ $BMI -le 18 ];then
echo "你太瘦了,多吃点"
elif [ $BMI -lt 24 ];then
echo "身材很棒!"
else
echo "你太胖了,注意节食,加强运动"
fi

  

 案例五:备份文件(拷贝/etc/目录下的文件到/root/etc$data下 )

# cat cpdata.sh

#! /bin/bash
# ------------------------------------------
# Filename: cpdata.sh
# Revision: 3.0
# Date: 2021/12/30
# Author: chenhao
# Email: 5098438@qq.com
# Website: https://www.cnblogs.com/jdbinfo
# Description: 
# ------------------------------------------
# Copyright: 2021 chenhao
# License: GPL
DATE=$(date "+%Y%m%d")
NEW=/root/etc$DATE
mkdir $NEW
echo -e "\033[1;32mStarting backup...\033[0m"
cp -R /etc/* ${NEW}/a 

 

案例六:鸡兔同笼

# vi chook_rabbit.sh

#!/bin/bash
#
#********************************************************************
#Author: chenhao
#QQ: 5098438
#Date: 2021-12-23
#FileName: chook_rabbit.sh
#URL: http://www.cnblogs.com/jdbinfo
#Description: 鸡兔同笼的算法
#Copyright (C): 2019 All rights reserved
#********************************************************************

read -p "请输入头的数量: " HEAD
read -p "请输入脚的数量: " FOOT
RABBIT=$[FOOT/2-HEAD]
CHOOK=$[HEAD-RABBIT]
echo "兔子: " $RABBIT
echo "鸡: " $CHOOKa

 

案例七:时间设置服务器脚本

# vi chrony.sh

#! /bin/bash
HOST_NAME=`hostname`                      # 用于判断的当前主机名
name=mirrors.jdbinfo.com                  # 时间服务器的主机名
network_segment_IP=192.168.10.0/24        #允许那个网段主机同步
iname="server $name iburst"
#chrony
yum install -y chrony
if [[ $name == $HOST_NAME ]];then
        sed -i '3,6s/^/#/g' /etc/chrony.conf
        sed -i '7s/^/server ntp.aliyun.com iburst/g' /etc/chrony.conf
        echo "allow $network_segment_IP" >> /etc/chrony.conf
        echo "local stratum 10" >> /etc/chrony.conf
else
        sed -i '3,6s/^/#/g' /etc/chrony.conf
        sed -i "7s/^/${iname}/g" /etc/chrony.conf
fi

 

案例八:sshd的优化

# 优化sshd服务器脚本
#! /bin/bash
sed -i -e 's/#UseDNS yes/UseDNS no/g' -e 's/GSSAPIAuthentication yes/GSSAPIAuthentication no/g' /etc/ssh/sshd_config
systemctl restart sshd
systemctl enable sshd

  

案例九:实现秘钥共享

# cat sshkey.sh

#!/bin/bash
# ------------------------------------------
# Filename: sshkey.sh
# Revision: 3.0
# Date: 2021/12/30
# Author: chenhao
# Email: 5098438@qq.com
# Website: https://www.cnblogs.com/jdbinfo
# Description: 
# ------------------------------------------
# Copyright: 2021 chenhao
# License: GPL
#    create key pair
Ip_arr="111 112 113 114 115 116 117 118"
Ip_up=192.168.10.
Pass_c=centos
Pub_file=/root/.ssh/id_rsa.pub
rm -fr /root/.ssh/id_dsa*
echo -e "\033[1;32mStarting ...\033[0m"
ssh-keygen -t rsa -f /root/.ssh/id_rsa -P "" -q
# fenfa key file
for ip in $Ip_arr
do
echo -e "\033[1;32m------------Batch the file to the host $Ip_up$ip---------------$END"
sshpass -p $Pass_c ssh-copy-id -i $Pub_file -o StrictHostKeyChecking=no $Ip_up$ip
echo -e "-------------------------------------------------------------------------\n"
donea
posted @ 2021-07-16 10:11  雨夜清风  Views(78)  Comments(0)    收藏  举报