Shell编程

Shell是什么

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

Shell脚本执行方式

脚本格式要求:
1)脚本以#!/bin/bash开头
2)脚本需要有可执行权限
脚本的常用执行方式:
方式1:(输入脚本的绝对路径或相对路径)
说明:首先要赋予helloworld.sh脚本的+x权限,再执行脚本
比如./hello.sh或者使用绝对路径/root/shcode/hello.sh
方式2:(sh+脚本)
说明:不用赋予脚本+x权限,直接执行即可。
比如sh hello.sh,也可以使用绝对路径。

例: 创建一个shell脚本,输出hello world!
vim hello.sh
#!bin/bash
echo "hello world!"

Shell的变量

基本介绍:
Linux Shell中的变量分为系统变量用户自定义变量
系统变量:<span data-formula="HOME、" aria-hidden="true">PWD、<span data-formula="SHELL、" aria-hidden="true">USER等等,比如:echo <span data-formula="HOME等等
显示当前shell中所有变量: set

shell 变量的定义
基本语法:
1)定义变量:变量名=值
2)撤销变量: unset变量
3)声明静态变量: readonly变量,注意:不能unset

定义变量的规则

  1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(×)
  2. 等号两侧不能有空格
  3. 变量名称一般习惯为大写,这是一个规范,遵守即可。

将命令的返回值赋给变量

  1. A=" aria-hidden="true">HOME等等
    显示当前shell中所有变量: set

shell 变量的定义
基本语法:
1)定义变量:变量名=值
2)撤销变量: unset变量
3)声明静态变量: readonly变量,注意:不能unset

定义变量的规则

  1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(×)
  2. 等号两侧不能有空格
  3. 变量名称一般习惯为大写,这是一个规范,遵守即可。

将命令的返回值赋给变量

  1. A=`date`反引号,运行里面的命令,并把结果返回给变量A
  2. A=<span data-formula="(date)等价于反引号

设置环境变量

基本语法:

  1. export 变量名=变量值
    (功能描述:将shell变量输出为环境变量/全局变量)
  2. source 配置文件
    (功能描述:让修改后的配置信息立即生效)
  3. echo " aria-hidden="true">变量名
    (功能描述:查询环境变量的值)

注意:在输出全局变量前,需要让其生效
source 配置文件
shell 脚本的多行注释:<<!内容!

位置参数变量

基本介绍:
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。
比如: ./myshell.sh 100 200,这个就是一个执行 shell的命令行,可以在myshell脚本中获取到参数信息。
基本语法:
<span data-formula="n
(功能描述:n为数字," aria-hidden="true">0代表命令本身,<span data-formula="1-" aria-hidden="true">9代表第一到第九个参数,十以上的参数需要用大括号包含,如<span data-formula="{10})

  1. " aria-hidden="true">*
    (功能描述:这个变量代表命令行中所有的参数,<span data-formula="*把所有的参数看成一个整体)
  2. " aria-hidden="true">@
    (功能描述:这个变量也代表命令行中所有的参数,不过<span data-formula="@把每个参数区分对待)
  3. " aria-hidden="true">#
    (功能描述:这个变量代表命令行中所有参数的个数)

预定义变量

基本介绍:
就是shell 设计者事先已经定义好的变量,可以直接在shell脚本中使用。
基本语法:

  1. ```blockformula_editor
    (功能描述:当前进程的进程号(PID) )
  2. <span data-formula="!
    (功能描述:后台运行的最后一个进程的进程号(PID))
  3. " aria-hidden="true">?
    (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行错误。)

运算符

基本介绍:
学习如何在shell中进行各种运算操作。
基本语法:

  1. “<span data-formula="((运算式))”或“" aria-hidden="true">[运算式]”或者 expr m + n //expression表达式
  2. 注意expr运算符间要有空格,如果希望将expr的结果赋给某个变量,使用 ```` `
  3. expr m - n
  4. expr *,/,% 乘,除,取余

条件判断

基本语法:
[ condition ](注意condition前后要有空格)
#非空返回true,可使用<span data-formula="?验证(0为true,>1为false)
判断语句

  1. = 字符串比较
  2. 两个整数的比较
    -lt 小于
    -le 小于等于 -eq 等于
    -gt 大于
    -ge 大于等于
    -ne 不等于
  3. 按照文件权限进行判断
    -r 有读的权限
    -w 有写的权限
    -x 有执行的权限
  4. 按照文件类型进行判断
    -f 文件存在并且是一个常规的文件
    -e 文件存在 -d 文件存在并是一个目录

流程控制

if判断
if [ 条件判断式 ]
then
代码
fi

或者多分支
if [ 条件判断式 ]
then
代码
elif[ 条件判断式 ]
then
代码
fi case语句
case " aria-hidden="true">变量名 in
"值1") // 如果变量的值等于值1,则执行程序1
"值2")
//如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
//如果变量的值都不是以上的值,则执行此程序
;;
esac

for循环

  1. for 变量 in 值1 值2 值3...
    do
    程序/代码
    done
  2. for ((初始值;循环控制条件;变量变化))
    do
    程序/代码
    done

while循环
while [ 条件判断式 ]
do
程序
done
注意:while和 [ 有空格,条件判断式和 [ 也有空格

read读取控制台输入

基本语法:
read(选项)(参数)
选项:
-p: 指定读取值时的提示符;
-t: 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待
参数:
变量:指定读取值的变量名

函数

shell编程和其它编程语言一样,有系统函数,也可以自定义函数。下面介绍常用的两个。

系统函数

  1. basename
    功能: 返回完整路径最后 / 的部分,常用于获取文件名。
    basename [string] [suffix]
    (功能描述: basename命令会删掉所有的前缀包括最后一个('/')字符,然后将字符串显示出来。
    选项:
    suffix为后缀,如果suffix被指定了,basename会将pathname或 string中的suffix去掉。
  2. dirname基本语法
    功能: 返回完整路径最后 / 的前面的部分,常用于返回路径部分。
    dirmame 文件绝对路径
    (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))

自定义函数
基本语法:
[ function ] funname[()]
{
Action;
[return int;]
}
调用直接写函数名:funname [值]

综合案例

1)每天凌晨 2:30备份数据库fyx01到/data/backup/db
2)备份开始和备份结束能够给出相应的提示信息
3)备份后的文件要求以备份时间为文件名,并打包成.tar.gz 的形式
4)在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除
5)画一个思路分析图


本文章使用limfx的vscode插件快速发布