shell脚本语言(详细总结)

一、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”

环境变量永久生效:(优先级递减)

    1. /etc/bashrc
    1. ~/.bashrc
    1. ~/.bash_profile
    1. /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

在这里插入图片描述

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值