0%

bash脚本编程思想和条件测试

  • 数据类型

    • 字符型
    • 数值型
  • 算术运算

    1
    +,-,*,/,**
    • let VAR=expression
    • VAR=$[expression]
    • VAR=$((expression))
    • VAR=$(expr argu1 argu2)
  • 增强型赋值

    • +=,-=,*=,/=,%=
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34

      - 要用let 描述, let i+=#

      - let VAR++

      - 条件测试

      - 判断需求是否满足,需要由测试机制来实现

      - 如何编写测试表达式以实现所需测试

      - 执行命令,并利用命令状态返回值来判断
      - 0成功
      - 1失败
      - 测试表达式
      - test expression
      - [ expression ]必须有空格
      - [[ expression ]]----关键字

      - 数值测试:数值比较

      - -eq : 是否等于 $num1 -eq $num2
      - -ne : 不等于
      - -gt :是否大于
      - -ge : 是否大于等于
      - -lt:是否小于
      - -le: 是否小于等于

      - 字符串设置:

      - ==:等值比较符号

      - ```
      >:是否大于,外边尽可能使用双括号
      - ``` <:是否小于
      1
      2
      3

      - ```
      != 是否不等于
      - -z"string":判断指定的字符串是否为空,空则为真 - -n"string":判断是否不为空。空为假 - =~:左侧能否被右边的pattern匹配,匹配左边的一部分字符 - Notes:和变量比两边加“ ”,防止空字符串
    • 文件测试

      • -a 或-e FILE,[-e FILE],是否存在
      • -b,是否存在且为块设备
      • -c,是否存在且为 字符设备文件
      • -d,目录文件
      • -f ,普通文件
      • -h ,符号连接文件
      • -p 命名管道文件
      • -S,套接字文件
      • 权限测试
        • -r,是否存在并且当前用户可读
        • -w,可写
        • -x,可执行
      • 特殊权限测试
        • -g,存在并且拥有suld权限
        • -u,是否存在且拥有sgld权限
        • -k,sticky权限
      • 内容测试
        • -s,是否为空,空为假
      • 时间戳测试
        • -N,上次读取后是否被修改过
      • 从属关系测试
        • -Q,当前文件是否是文件的属主
        • -G,当前用户胡是否为文件的属组
      • 双目测试
        • FILE1-ef FILE2 , FILE2和FILE2是否指向统一文件系统的相同Inode的硬链接
        • FILE1 -nt FILE2,FILE1是否新与FILE 2
        • FILE1 -ot FILE2,FILE1是否旧与FILE 2
      • 逻辑运算
        • && || !
        • [ EXPRESSION -a EXPRESSION ] 并且
        • [ expression -o expression ]
  • 脚本的状态返回值:最后执行的命令的返回值

    • 自定义状态返回值,exit[n],n自定义,返回n。shell遇到exit[n]立马终止

grep命令

三剑客

  • grep 文本过滤工具
  • sed sream editor,流编辑器,文本编辑工具
  • awk 文本报告生成器,格式化文本

正则表达式

表示控制或通配的功能的特殊字符

  • 基本正则表达式 BRE
  • 拓展正则表达式 ERE
  • Notes

grep:Global search ERgular expression and Print out the line(输出的是行)

  • 文本搜索工具,根据用户指定的“模式”,对目标文本进行匹配检查,打印匹配到的行

  • 模式:由正则表达式的元字符及文本字符所编写的过滤条件

  • 格式:

    • grep [options] Pattern [file]

    • grep [OPTIONS] -e PATTERN … [FILE…]

    • grep [OPTIONS] -f FILE … [FILE…]

    • OPTIONS:

      • –color=auto 文本着色
      • -I : Ignore 忽略大小写
      • -O:只显示匹配到的文本
      • -V :反向匹配
      • -E :支持拓展的正则表达式
      • -Q:–quiet 不输出任何信息
      • -A#,-B#,-C#,输出上下的行,A后,B前,C前后
    • 基本正则表达式的元字符

      • 字符匹配

        • . 匹配任意单个字符
        • [] 匹配指定范围内的任意单个字符
        • [^] 匹配范围外的任意单个字符
        • Notes(一个)
          • [:digit:]
          • [:lower:]
          • [:upper:]
          • [:alpha:]
          • [:alnum:] 包含数字的字母
          • [:punct:] 所有标点符号
          • [:space:] 空格
      • 匹配次数:用在指定次数的字符的后面,用于限制次数.默认贪婪模式

        • *:任意次

        • .*:任意长度的任意字符

        • ?:匹配前面的字符0次或1次

        • ?:匹配前面的字符1次或多次

        • \{m\}:匹配前面的字符m次
          
          1
          2
          3

          - ```
          \{m,n\}:至少m次,至多n次
        • ```
          {0,n}:至多n次

          1
          2
          3

          - ```shell
          \{m,\}:至少m次
      • 位置锁定

        • ^:行首锚定,用于模式的左边

        • $:行尾锚定,写在模式右边

        • ^pattern$:pattern开口,pattern结尾

          • ^$:不包含任意字符
          • ^[[:space:]]*$:可以有空格的行
        • 单词锚定,非特殊字符组成的连续字符,包括数字,都称为单词

          • \<或\b词首锚定,用于单词的模式的左侧
            
            1
            2
            3

            - ```
            \>或\b词尾锚定,用于单词的右侧
          • ```
            <pattern>精确匹配单词

            1
            2
            3
            4
            5
            6
            7



            - 分组以及引用

            - 分组符号

            ()分组符号(括号)

            1
            2
            3
            4
            5
            6
            7
            8
            9
            10

            - 引用,分组括号中的模式匹配到的内容会被正则表达式自动记录下内部变量中

            - \1,从左侧起,第一个括号匹配到的字符
            - \2
            - \3
            - 等等

            - ```
            grep "\(l..e\).*\1" lovers.ext 这样就可以保证同一行中前后出现的一样。

Linux下图形和命令行的切换

图形切换命令行
1
systemctl set-default multi-user.target
命令行切换图形
1
systemctl set-default graphical.target

sed命令详解

sed:字符流编辑器

工作流程:sed会读取文件里的行,然后缓存到sed模式空间,接着开始处理符合规则的行,不符合规则的行会输出到屏幕,符合规则的行也会输出到屏幕。在这个过程中,它只处理了缓存里的数据,没有修改原文件

使用格式

1
sed [options][sed内置命令字符] [输入文件]
  • 选项参数
    • -n 取消默认sed输出,常与内置命令p一起使用
    • -i 将修改结果写入文件
    • -e 多次编辑,不需要管道符
    • -r 支持正则表达
  • sed内置命令字符
    • a 对文本 进行追加
    • d 删除匹配行
    • i 在指定行前插入一行或者多行文本
    • p 打印匹配的内容,通常与-n一起使用
    • s/被替换/替换上的/g 把前面的换成后面的,g代表全局
  • sed匹配范围(在内置命令前写上)
    • 空地址 全文处理,什么都不写
    • 单地址 指定文件某一行,数字
    • /pattern/ 被模式匹配到的每一行
    • 范围区间
      • 10,20 十到二十行
      • 10,+5 第十行加上 向下5行
      • /pattern1/,/pattern2/
    • 步长
      • 1~2 表示从第一行开始步长为2的行

shell脚本逻辑判断和参数传递

向脚本传递参数

  • 位置参数,ls /etc ,/etc就是命令传递进去的参数
  • $1,$2,$3…${10},${11}
  • shift n ,轮替前n个参数,踢掉
  • 特殊变量
    • $0,脚本路径本身
    • $#,传递参数个数
    • $@,所有参数
    • $*,所有参数

执行顺序

  • 选择执行

    • 单分支
    1
    2
    3
    if 测试条件;then (then可以写在下面,不带;)
    代码分支
    fi
    • 双分支
    1
    2
    3
    4
    5
    if 测试条件;then
    分支1
    else
    分支2
    fi

shell脚本高级用法

循环执行

  • for

  • while

  • until

  • 循环控制语句

    • continue,提前结束本轮循环
    • break,结束循环
  • while特殊用法:遍历文件的行

    1
    2
    3
    4
    5
    while read VAR;do
    循环体;
    done < FILe

    依次读取文件的每一行,并且赋值到VAR
  • for循环的特殊用法;

    1
    2
    3
    for((控制变量初始化;条件判断表达式;变量修正语句));do
    循环体;
    done

控制语句

  • 多分支if,执行到一个结束就不执行了

    1
    2
    3
    4
    5
    6
    7
    8
    9
    if condtion1;then
    ...
    elif condition2;then
    ...
    elif condition3;then
    ...
    else
    ...
    fi
  • case语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    case $VAR in
    PAT1)
    分支1
    ;;
    PAT2)
    分支2
    ;;
    PAT3)
    分支3
    ;;
    *)
    分支4
    ;;
    esac

shell脚本编程实现

根据其编程过程中调用库还是调用外部的程序文件

  • shell脚本编程

    ​ 利用系统上的命令及编程组件进行编程

  • 完整编程

    ​ 利用库或编程组件进行编程

shell脚本编程:过程式编程,解释运行,依赖于外部程序文件运行

如何写shell脚本

  • 第一行顶格写shebang,解释器路径,用于指明解释执行当前脚本的解释器程序文件如

    • #!/bin/bash
    • #!/usr/bin/python
    • #!/usr/bin/perl

    Notes:

    ​ 所以xx.sh其实是一个文本文件,运行这个文件真正的过程是内核读取了文件前面的内容,并用bash去运行文本里的内容。所以当bash xx.sh时,xx.sh并不需要+x权限。

    ​ 脚本中的空白行和#开头的行都会被忽略,除了shebang.

  • 文本编辑器

    • 行编辑器:sed
    • 全屏幕编辑器:nano ,vi,vim
  • bash的配置文件

    • profile类:为交互式登录的shell提供配置,交互式:通过某终端输入账号密码登录打开的shell;通过su - username或 su -l username打开的终端;

      ​ 全局:对所有用户都生效;

      ​ /etc/profile

      ​ /etc/profile.d/*.sh

      ​ 局部:对单个用户生效

      ​ ~/.bash_profile

      ​ 功用:

      ​ 用于定义环境变脸

      ​ 运行命令或脚本

    • bashrc类:为非交互式登录的shell提供配置,非交互式:su username;在图形界面打开的终端;运行脚本的时候的子shell;

      ​ 全局:

      ​ /etc/bashrc

      ​ 用户个人:

      ​ ~/.bashrc

      ​ 功用:

      ​ 定义本地变量

      ​ 定义命令别名

      ​ 交互式登录shell进程:
      ​ /etc/profile—->>/etc/profile.d/*——->/.bash_proflie——>/.bashrc——>/etc/bashrc

      ​ 非交互的shell:

      ​ ~/.bashrc——>/etc/bashrc——>/etc/profile.d/*

  • 命令行定义的特性,在当前shell有效

  • 配置文件定义的特性,在下一次有效

    • 通过命令行重新定义一次
    • 重新加载一次配置文件
      • source
      • .

获取命令帮助

程序的组成部分

  • 二进制程序文件
  • 库文件
  • 配置文件
  • 帮助文件

命令语法通用格式

  • COMMAD OPTIONS ARGUMENTS,如ls -l /etc ,-l就是OPTIONS,/etc 就是arguments

    1
    2
    3
    4
    5
    6
    options 通常有两种表现形式
    短:-c ,-T等,一般可以合起来写
    长:--password等
    有些选项可以自带参数,如--name mysql

    arguements :表示命令对什么生效
  • 普通命令 /bin, /usr/bin, /usr/local/bin

  • 管理命令/sbin, /usr/sbin,/usr/local/sbin

  • 共享库:/lib, /usr/local/lib,/usr/local/lib

Notes

  • type命令 用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令

  • alias:别名。

  • keyword:关键字,Shell保留字。

  • function:函数,Shell函数。

  • builtin:内建命令,Shell内建命令。

  • file:文件,磁盘文件,外部命令。

  • unfound:没有找到。

获取命令的使用帮助

Notes:

  • 内部命令实际上是shell程序的一部分,其中包含的是一些比较简单的linux系统命令,这些命令由shell程序识别并在shell程序内部完成运行,通常在linux系统加载运行时shell就被加载并驻留在系统内存中。
  • 外部命令是linux系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调用内存

内部命令

  • help

外部命令

  • 自身的命令 –help

  • 手册manual

  • man 
        NAME:名字和简要说明
        SYNOPSIS:简要格式
            []:可省略
            <>:必须提供
            a|b:多选一
            ...:同类可出现多个
        DESCRIPTION:描述
        OPTIONS:选项
        COMMANDS:下级命令
        
    man以压缩文件的格式存储信息
    /usr/share/man
        man1,man2....章节
        1.用户命令
        2.系统调用
        3.C库调用
        4.设备文件以及特殊文件
        5.配置文件格式
        6.游戏使用帮助
        7.杂项
        8.管理工具和守护进行
    
  • info 命令

    ​ 获取在线文档

  • 自带的帮助文档

    ​ /usr/share/doc/APP-VERSION

    ​ 三个主要文件

    • README:程序相关信息
    • INSTALL:安装信息
    • CHANGES:版本迭代更新信息

arm64开发板上armbian换源报错E: 无法下载 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/dists/focal/restricted/binary-amd64/Packages 404 Not Found [IP: 101.6.15.130 443]

sources.list如图

image-20240127192504488

结果 sudo apt update 却遇上了报错

image-20240127192719981

分明使用的是ubuntu-ports,处理器架构也是arm64,apt 怎么会去获取amd64的软件包呢,多次换源无果,实在令人难解。

好在根据关键词多次搜索,终于发现原因所在。使用dpkg查看系统软件包架构发现

1
2
3
ajin@CRRC:~$ dpkg --print-foreign-architectures
armhf
amd64

这一指令可以显示已安装软件包中包含的其他体系架构,比如系统本身是64位的,而用户安装了一个32位的软件,则这个32位的体系结构就被称为”foreign-architectures”.

所以解决方法就是用dpkg来移除这个amd64的额外架构。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ajin@CRRC:~$ sudo dpkg --remove-architecture amd64
ajin@CRRC:~$ sudo apt update
命中:1 http://mirrors.tuna.tsinghua.edu.cn/armbian focal InRelease
命中:2 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal InRelease
命中:3 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal-updates InRelease
命中:4 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal-backports InRelease
命中:6 http://ppa.launchpad.net/openjdk-r/ppa/ubuntu focal InRelease
命中:7 http://ports.ubuntu.com/ubuntu-ports focal-security InRelease
命中:5 http://mirrors.ustc.edu.cn/armbian focal InRelease
命中:8 https://download.docker.com/linux/ubuntu focal InRelease
获取:9 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal/universe armhf Packages [10.9 MB]
获取:10 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal/restricted armhf Packages [10.8 kB]
获取:11 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal/main armhf Packages [1,227 kB]
获取:12 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal/multiverse armhf Packages [141 kB]
获取:13 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal-updates/multiverse armhf Packages [9,898 B]
获取:14 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal-updates/restricted armhf Packages [21.9 kB]
获取:15 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal-updates/main armhf Packages [1,835 kB]
获取:16 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal-updates/universe armhf Packages [1,172 kB]
获取:17 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal-backports/universe armhf Packages [27.8 kB]
获取:18 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports focal-backports/main armhf Packages [54.7 kB]
获取:19 http://ports.ubuntu.com/ubuntu-ports focal-security/universe armhf Packages [887 kB]
获取:20 http://ports.ubuntu.com/ubuntu-ports focal-security/multiverse armhf Packages [5,099 B]
获取:21 http://ports.ubuntu.com/ubuntu-ports focal-security/main armhf Packages [1,475 kB]
获取:22 http://ports.ubuntu.com/ubuntu-ports focal-security/restricted armhf Packages [21.6 kB]
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
有 286 个软件包可以升级。请执行 ‘apt list --upgradable’ 来查看它们。

之后果然没有报错了。

另外一种解决方法是在/etc/apt/sources.list中去指定自己需要的架构的软件包
1
deb [arch=arm64] https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse

双端备份APP

一个在局域网内工作的Linux和Android双端简易文件备份项目。Linux作为存储端,安卓作为客户端工作。在Linux上,主要的管理方式为web.

安卓端

  • 自动备份/查看照片
  • 自动备份指定的文件夹
  • 文件共享,用于传输指定文件
  • 远程下载

Linux端

  • 存储客户端照片视频并进行展示
  • 存储客户端文件并提供在线文件管理
  • 文件共享管理
  • 提供常见传输协议,如ftp,samba的gui设置
  • 提供磁盘管理