1.Shell脚本概念
Shell 脚本是一种用于自动化执行一系列命令和操作的脚本文件。它使用的是 Shell 解释器(如 Bash、Korn Shell、Zsh 等)来解释和执行其中的命令。Shell 脚本通常用于编写简单的任务和工作流程,可以帮助我们进行系统管理、批量处理、自动化部署等任务。
以.sh后缀名结尾的文件来表示该文件是一个Shell脚本。
Shell脚本就是将命令写入文本中,文本可以被执行。
2.Shell脚本参数
$0:表示当前脚本的名称。
$*:表示脚本的所有参数。
$#:表示脚本的参数的个数。
$n:表示脚本的第n个参数,n=1,2,3…
$? :程序执行完后的结果,返回值0表示执行成功。
3.Shell脚本参数判断
-d:测试文件是否为目录类型,是目录返回0,不是目录返回非0值。
-e:测试文件是否存在。
-f:判断是否为一般文件。
-r:判断当前用户对该文件是否有读取权限。
-w:判断当前用户对该文件是否有写入权限。
-x:判断当前用户对该文件是否有执行权限。
4.逻辑测试语句
逻辑运算符:
&&(必须保证两边都为真,条件才会成立,只要有一个为假条件都不会成立,即只有当左侧命令执行成功时,右侧的命令才会被执行。)
||(两边有一个为真就为真,两边都为真也为真,两边为假才为假。)
!
5.整数值测试语句
整数的比较运输符
-eq:是否等于
-ne:是否不等于
-gt:是否大于
-lt:是否小于
-le:是否等于或小于
-ge:是否等于或大于
6.定义变量
Freemem=`free -m | grep Mem | awk '{print $4}'`
echo $Freemem # 输出变量
例如:如果这个值小于1024的时候,会输出内容不足的提示信息。
[ $Freemem -lt 1024 ] && echo "内存不足"
7.字符串比较语句
字符串比较:
=:比较字符串内容是否相同。
!=:比较字符串内容是否不同。
-z:判断字符串内容是否为空,如果为空返回0表示真,如果不为空返回1。
判断当前系统是否支持中文。
[ $LANG = zh_CN.UTF-8 ] && echo "支持中文" || echo "不支持中文"
8.Shell流程控制语句
流程控制语句
if
then
else
fi
if 例如:判断home目录下是否存在test目录,如果不存在则创建一个。
#!/bin/bash
DIR="/home/test"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
if else 例如:判断给定的IP是否正常
说明:
“-c 3” 选项表示发送 3 个 ICMP 请求消息,并等待每个请求的响应。
“-i 0.2” 选项表示设置每个 ICMP 请求的时间间隔为 0.2 秒(即每 200 毫秒发送一个请求)。
“-W 3” 选项表示设置等待响应的超时时间为 3 秒。
#!/bin/bash
if [ -z $1 ]
then
echo "作者:小薛"
echo "该命令检测服务器IP是否正常"
echo "直接在命令后面加参数IP就可以执行"
else
ping -c 3 -i 0.2 -W 3 $1 &>/dev/null
if [ $? -eq 0 ]
then
echo "$1该IP是正常的"
else
echo "$1该IP无法ping通"
fi
fi
if…elif…else 例如:判断学员考试分数如何
说明:
“-p” 选项用于在用户输入之前显示一个提示信息。
“read” 是一个 Bash 内置命令,用于从标准输入中读取用户输入并将其赋值给一个变量。
“fenshu” 是用于存储用户输入值的变量名。
#!/bin/bash
read -p "请输入分数(1-100):" fenshu
if [ $fenshu -ge 85 ] && [ $fenshu -le 100 ];then
echo "该学生成绩为优秀"
elif [ $fenshu -ge 70 ] && [ $fenshu -le 84 ];then
echo "该学生成绩为合格"
else
echo "该学生成绩为不合格"
fi
9.Shell脚本循环
批量添加用户
说明:–stdin:选项告诉passwd命令从标准输入(stdin)读取密码,而不是要求用户手动输入密码。
#!/bin/bash
read -p "请输入密码:" PASSWORD
for USERNAME in `cat user.txt`
do
id $USERNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$USERNAME用户已存在!"
else
useradd $USERNAME &> /dev/null
echo "$PASSWORD" | passwd --stdin $USERNAME &> /dev/null
echo "$USERNAME用户创建成功"
fi
done
批量删除用户
#!/bin/bash
for USERNAME in `cat user.txt`
do
id $USERNAME &> /dev/null
if [ $? -eq 0 ]
then
userdel -r $USERNAME &>/dev/null
echo "$USERNAME用户已删除"
else
echo "$USERNAME用户不存在!"
fi
done
批量ping IP 地址
说明:“$()” 是 Bash 中的命令替换语法,它表示将命令的输出结果作为一个整体嵌入到命令行中。
#!/bin/bash
HOSTLIST=$(cat /root/iplist.txt)
for IP in $HOSTLIST
do
ping -c 3 -i 0.2 -W 3 $IP &>/dev/null
if [ $? -eq 0 ]
then
echo "$IP该IP是正常的"
else
echo "$IP该IP无法ping通"
fi
done
检测同一局域网,多台主机存活情况
方式一:
#!/bin/bash
read -p "请输入网络位:" NETWORK
for ((IP=1;IP<=100;IP++))
do
ping -c 3 -i 0.2 -W 3 $NETWORK.$IP &> /dev/null
if [ $? -eq 0 ]
then
echo "$NETWORK.$IP该IP可以ping通"
else
echo "$NETWORK.$IP该IP无法ping通!!!!!!!"
fi
done
方式二:
说明:“seq” 是一个用于生成序列的命令。“1” 是序列的起始值。“254” 是序列的结束值。
#!/bin/bash
read -p "请输入网络位:" NETWORK
for IP in `seq 1 254`
do
ping -c 3 -i 0.2 -W 3 $NETWORK.$IP &> /dev/null
if [ $? -eq 0 ]
then
echo "$NETWORK.$IP该IP可以ping通"
else
echo "$NETWORK.$IP该IP无法ping通!!!!!!!"
fi
done
while循环
基本格式如下:
while 条件
do
命令序列
done
例如:猜测商品价格
说明:$RANDOM是linux中的内置变量,可以随机生成0-32767之间的整数数字。
“expr” 是一个用于执行基本数学运算或字符串操作的命令。
#!/bin/bash
echo "该商品价格在0~1000之间,输入价格来猜一猜"
TIMES=0
PRICE=$(expr $RANDOM % 1000 )
while true
do
read -p "请输入价格:" INT
let TIMES++
if [ $INT -eq $PRICE ]
then
echo "恭喜您猜对了该商品的及格,价格为$INT"
echo "您猜了$TIMES次"
exit
elif [ $INT -gt $PRICE ];then
echo "您所输入的价格高了"
else
echo "您所输入的价格低了"
fi
done
case条件测试语句
基本格式如下:
case 变量值 in
模式1
命令序列1
模式2
命令序列2
....
默认命令序列
esac
例如:判断输入的是字母,数字,还是特殊符号
#!/bin/bash
read -p "请输入一个字符:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "这是字母"
;;
[0-9])
echo "这是数字"
;;
*)
echo "这是特殊符号"
esac