编辑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

浙公网安备 33010602011771号