Shell 编程

121 阅读3分钟

定义

把在shell中执行的单个命令,按照一定的逻辑和规则组装到一个文件中,后面执行的时候就可以直接执行这个文件。这个文件称为shell脚本。约定以.sh作为文件后缀

shell文件编写

#!/bin/bash   shell脚本第一行,固定写法。此处的#不是注释
#first comond 除了上面的#不是注释外,其他地方的#都是注释
echo hello shell

shell脚本执行

01 bash shell脚本
   bash -x shell脚本 单步执行shell脚本
    bash对应的是/bin/bash
02 sh shell脚本
    sh对应的是/bin/sh/ -> /bin/bash 所以sh和bash是一样的
注:bash和sh执行的时候不需要设置shell脚本执行权限,这样只是把shell脚本作为参数传给bash和sh命令
03 ./shell脚本 需要使用chown配置执行权限
04 shell脚本 需要使用chown配置执行权限,会去PATH环境变量路径查找shell脚本

shell语法

变量

变量定义
  • 变量不需要声明,也不用指定类型
  • 变量由数字、字母、下划线构成,不能以数字开头
  • 通过=号赋值,等号前后不能有空格
变量类型
  • 本地变量
格式:VAR_NAME=VALUE
应用场景:在shell脚本中定义一些临时变量时使用,对当前shell进程的子shell进程及其他shell进程无效
  • 环境变量
格式:export VAR_NAME=VALUE
应用场景:用于设置临时环境变量,对子shell进程有效,对其他shell进程无效

注意:设置永久环境变量,需要添加到配置文件/etc/profile中,然后执行source /etc/profile 可立刻生效

  • 位置变量
格式:sh location.sh args1 args2 args3
使用:
    vi location.sh
    etho $0    #打印location.sh
    etho $1    #打印args1
    etho $2    #打印args2
    etho $3    #打印args3
    
说明:位置变量相当于java中main函数的args参数,可以在shell脚本中动态获取外部参数
  • 特殊变量
01 $?
说明:返回上一条命令执行的状态码,状态码在0~255之前。0表示成功,其他状态码都是失败
应用场景:在shell脚本中根据上一条命令的执行结果,来执行不同的逻辑

02 $#
说明:返回shell脚本中所有位置参数的个数
使用场景:用于校验位置参数是否符合要求
变量和引号的特殊使用
  • '' : 单引号不解析变量,如echo 'name,执行结果:name',执行结果:name
  • "" : 双引号解析变量,如echo "$name",执行结果:hhc
  • `` : 反引号把当前变量的值作为命令再次执行,反引号的另外一种写法:((VAR_NAME)

image.png

案例
'"$name"' vs "'$name'"

image.png

循环

for循环
格式1:
    for((i=0; i<10; i++))
    do
    循环体...
    done

格式二:
    for i in 1 2 3
    do
    循环体...
    done
while循环
格式:
    while 测试条件
    do
    循环体...
    done

测试条件
    格式:test EXPR 或者[ EXPR ]中括号和表达式之间的空格不能少
    整型测试: -gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)、-eq(等于)、-ne(不等于)
    字符串测试:=(等号)、!=(不等于)

使用场景:适用于循环次数未知,或不便于使用for直接生成较大列表时

if判断

单分支
格式:
    if 测试条件
    then
        满足条件....
    fi
双分支
格式:
    if 测试条件
    then
        满足条件...
    else
        不满足条件...
    fi
多分支
格式
    if 测试条件1
    then
        满足条件...
    elif 测试条件2
        then
            满足条件
        else
            不满足条件
    fi

shell 扩展

实现shell脚本后台执行

nohup sh shell脚本.sh &

标准输出

说明:表示命令或程序输出的正常信息,使用阿拉伯数字1表示
案例:
    pwd 1>1.txt 表示把pwd这个程序的标准输出重定向到1.txt文件中,其中1表示pwd程序的标准输出

标准错误输出

说明:表示命令或程序输出的错误信息,使用阿拉伯数字2表示
案例:
    pwd 2>2.txt 表示把pwd这个程序的标准错误输出重定向到2.txt文件中,其中2表示pwd程序的标准错误输出

重定向(> 和 >>)

> 和 >>两个重定向的区别:
    当使用两个重定向把前一个命令的输出重定向到一个文件时。>重定向会覆盖重定向指定的文件,而>>会在指定的文件后追加内容

crontab定时器

image.png

查看crontab服务状态:systemctl status crond
启动/停止crontab服务: systemctl start/stop crond
添加crontab服务: vi /etc/crontab
查看crontab执行日志:vi /var/log/cron