文章目录
一、Shell脚本
1. Shell脚本的类别
主流Shell:bash(sh为bash的软链接)
- Bourne shell
- sh
- ksh
- bash
- C shell
二、Shell变量
1. 变量的类型
- 环境变量(全局变量):所有用户下都生效,大写
- 自定义环境变量
- 方法一:
- export OLDBOY=1
- 方法二:
- OLDGIRL=2
- export OLDGIRL
- 永久生效:
- 方法一:
- bash内置变量
- $UID
- $USER
- $SHELL
- $HOME
- 自定义环境变量
- 普通变量(局部变量):shell函数、脚本
- 变量赋值:
- 变量名=value
- 变量名=‘value’
- 变量名=“value”
- 变量赋值:
环境变量永久生效:(优先级递减)
-
- /etc/bashrc
-
- ~/.bashrc
-
- ~/.bash_profile
-
- /etc/profile
取消环境变量:
- unset 变量名
2. 符号作用
变量要用双引号括起来
符号 | 解释 |
---|---|
‘’ | 所见即所得 |
“” | 解析变量 |
无引号 | 同单引号 |
`` | 解析命令(或$#()) |
注意
export、(())场景中使用变量可以不加引号
三、Shell特殊重要变量
1. Shell特殊位置参数变量
位置变量 | 作用说明 |
---|---|
$0 | 表示执行的脚本名称 |
$n | 表示脚本的第n个参数值,注意${10} |
$# | 表示执行脚本传入参数的个数 |
$* | 表示执行脚本传入参数的列表,“$*” 等价于 “$1 $2 $3" |
$@ | 表示获取执行脚本传入的所有参数,“$@" 等价于 “$1” “$2” “$3” |
$? | 是显示最后命令的退出状态, 0 表示没有错误,其他表示有错误 |
$$ | 是脚本运行的当前进程ID号 |
$! | 获取上一个在后台工作进程ID号 |
2. 变量子串介绍
- OLDBOY=“I am oldboy”
- echo $OLDBOY:I am oldboy 解析变量
- echo ${OLDBOY}:I am oldboy 解析变量
- echo ${#OLDBOY}:11 打印变量长度
- echo ${OLDBOY:2}: am oldboy 变量内容的截断到结尾
- echo ${OLDBOY:2:2}: am 变量内容的截断
- ${OLDBOY#am}: 从开头删除最短匹配的am子串
- ${OLDBOY##am}: 从开头删除最长匹配的am子串
- ${OLDBOY:am}: 从结尾删除最短匹配的am子串
- ${OLDBOY::am}: 从结尾删除最长匹配的am子串
- ${OLDBOY/am/is}: 使用is替换第一个匹配的am
- ${OLDBOY//am/is}: 使用is替换所有匹配的am
四、变量数值计算
1. 算数运算法
Shell 算术运算符一览表
算术运算符 | 说明/含义 |
---|---|
+、- | 加法(或正号)、减法(或负号) |
*、/、% | 乘法、除法、取余(取模) |
** | 幂运算 |
++、– | 自增和自减,可以放在变量的前面也可以放在变量的后面 |
!、&&、|| | 逻辑非(取反)、逻辑与(and)、逻辑或(or) |
<、<=、>、>= | 比较符号(小于、小于等于、大于、大于等于) |
==、!=、= | 比较符号(相等、不相等;对于字符串,= 也可以表示相当于) |
<<、>> | 向左移位、向右移位 |
~、 | 、 &、^ |
=、+=、-=、*=、/=、%= | 赋值运算符,例如 a+=1 相当于 a=a+1,a-=1 相当于 a=a-1 |
2. 运算操作与运算命令
运算操作与运算命令 | 含义 |
---|---|
(()) | 用于整数运算 |
let | 用于整数运算 |
expr | 用于整数运算,还有很多其他额功能 |
bc | 计算器程序(小数运算) |
$[] | 用于整数运算 |
awk | 用于整数、小数运算 |
declare | 定义变量值和属性,-i定义整形变量 |
案例 1.let
a=1
let a=a+1
echo $a
案例 2.expr
a = 10
expr $a +1
#11
案例 3.$[]
a =11
echo $[$a+1]
五、变量输入read命令
1. read命令
- read
- -p 设置提示信息
- -t 设置输入等待时间,单位为秒
2. 变量赋值的三种方式
- 1)定义式
- a=1
- 2)read读入式
- read -t 10 -p "请输入两个数字: n m
- 3)脚本传参
- $1 = 100
案例 1.read读入两个数字进行运算
cat read.sh
read -p "请输入两个整数:" a b
echo "a-b=$(($a-$b))"
echo "a-b=$(($a+$b))"
echo "a-b=$(($a*$b))"
echo "a-b=$(($a/$b))"
echo "a-b=$(($a**$b))"
echo "a-b=$(($a%$b))"
sh read.sh
请输入两个数:10 5
案例 2.$n读入两个数字进行运算
cat read.sh
a=$1
b=$2
echo "a-b=$(($a-$b))"
echo "a-b=$(($a+$b))"
echo "a-b=$(($a*$b))"
echo "a-b=$(($a/$b))"
echo "a-b=$(($a**$b))"
echo "a-b=$(($a%$b))"
sh read.sh 10 5
六、Shell脚本的条件测试与比较
1. 脚本的条件测试
条件测试语法 | 说明 |
---|---|
test <测试表达式> | test和<测试表达式>之间要有空格 |
[ <测试表达式> ] | 等价于test命令,[]的边界与内容之间至少需要一个空格 |
[[ <测试表达式> ]] | [[]]的边界与内容之间至少需要一个空格 |
((<测试表达式>)) | 不需要空格 |
2.文件测试操作符号
操作符号 | 说明 |
---|---|
-d | 文件存在且为目录则为真 |
-f | 文件存在且为普通文件则为真 |
-e | 无论文件还是目录存在则为真 |
-r | 文件可读则为真 |
-s | 文件大小不为0则为真 |
-x | 文件可执行这位真 |
案例1.文件是否存在
test -f oldby.txt
[ -f oldbot.txt ] && echo 1||echo 0
3.字符串测试操作符号
字符串测试操作符号 | 说明 |
---|---|
-n “字符串” | 字符串长度不为0则为真 |
-f “字符串” | 字符转长度为0则为真 |
“字符串1” = “字符串2” | 串1等于串2,则为真 |
“字符串1” != “字符串2” | 串1不等于串2,则为真 |
案例1.字符串长度是否不为0
[ -n "oldboy" ] && echo 1||echo 0
[ -z "oldboy" ] && echo 1||echo 0
案例2.判断传入的参数是否均为整数
read -p "请输入两个整数" a b
expr $a + $b + 99 &>/dev/null
[ $?-ne 0] && {
echo "其中有一个输入不为数字"
exit
}
案例3.判断传入的参数是否符合要求
[ $#-ne 2] && {
echo "请输入两个数字"
exit
}
4.整数二元比较操作符介绍
在[]以及test中使用的比较符号 | 在(())和[[]]中使用的比较符号 | 说明 |
---|---|---|
-eq | ==或= | 相等 |
-ne | != | 不相等 |
-gt | > | 大于 |
-ge | >= | 大于等于 |
-lt | < | 小于 |
-le | <= | 小于等于 |
注意:=~ 匹配
案例1.判断二元比较
[ 1-ne 1] && echo 1 | |echo 0
[ 1 > 1] && echo 1 | |echo 0 不成立
[ 1 \> 1] && echo 1 | |echo 0
[[ 1 > 1]] && echo 1 | |echo 0 成立
5.逻辑操作符介绍
在[]和test中使用的操作符 | 在[[]]和(())中使用的操作符 | 说明 |
---|---|---|
-a | && | and |
-o | || | or |
! | ! | not |
案例1.and
[ -f /etc/hosts -a 1 -eq 1] && echo 1 | |echo 0
案例2.!
[ ! -d "$path" ] && mkdir $path -p #若目录不存在,则创建目录
七、if结构条件句
1. if条件句
1)if单分支语句
第一种语法:
if <条件表达式>
then
命令
fi
第二种语法:
if <条件表达式>;then
命令
fi
2)if双分支语句
第一种语法:
if <条件表达式>
then
命令1
else
命令2
fi
第二种语法:
if <条件表达式1>
then
命令1
elif<条件表达式2>
命令2
else
命令3
fi
2.监控服务是否异常
- 端口监控
- 在服务器本地:netstat、ss、lsof
- 远程监控服务器本地端口telnet、nmap、nc
- 对服务进程或进程数监控
- ps -ef|grep nginx|wc -l
- ps -ef|grep mysql|wc -l
案例1.监控nginx服务
#!/bin/sh
PORT=`netstat -lntup|grep nginx|wc -l`
if [ $PORT -ne 1]
then
echo "Nginx is down"|tee /tmp/mem.log
else
echo "Nginx is up"|tee /tmp/mem.log
fi
#!/bin/sh
PORT=`lsof -i :80|wc -l`
if [ $PORT -lt 1]
then
echo "Nginx is down"|tee /tmp/mem.log
else
echo "Nginx is up"|tee /tmp/mem.log
fi
八、shell函数
1. shell函数语法
#1)标准写法
function 函数名(){
指令集
return n
}
#2)简化
function 函数名{
指令集
return n
}
#3)简化
函数名(){
指令集
return n
}
2. shell函数执行
函数名
函数名 参数1 参数2
九、while循环和until循环
1. while循环语句
while<条件表达式>
do
指令
done
while<条件表达式>;do
指令
done
2. until循环语句
until<条件表达式>
do
指令
done
while<条件表达式>;do
指令
done
十、for循环
第一种:变量取值型
#1)标准
for 变量名 in 变量取值列表
do
指令
done
#2)简化
for 变量名 in 变量取值列表;do
指令
done
第二种:c语言型
for((exp1;exp2;exp3))
do
指令
done
while<条件表达式>
do
指令
done
while<条件表达式>;do
指令
done
2. until循环语句
until<条件表达式>
do
指令
done
while<条件表达式>;do
指令
done
[外链图片转存中…(img-uVyJoiZR-1711772927351)]
[外链图片转存中…(img-1k9jCBBJ-1711772927351)]
十、for循环
第一种:变量取值型
#1)标准
for 变量名 in 变量取值列表
do
指令
done
#2)简化
for 变量名 in 变量取值列表;do
指令
done
第二种:c语言型
for((exp1;exp2;exp3))
do
指令
done