• Shell编程


    一、Shell概述

    Shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。

    二、Shell解释器

    Liunx提供的Shell解析器有:

    在这里插入图片描述

    默认的Shell解析器是bash。

    三、Shell脚本入门

    1 脚本格式

    脚本以

    #!/bin/bash
    
    • 1

    开头,指定解析器。

    2 第一个Shell脚本:helloworld

    在这里插入图片描述

    #!/bin/bash
    echo "hello world!"
    
    • 1
    • 2

    在这里插入图片描述

    第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。

    3 多命令处理

    在/opt/testfile/test目录下创建一个szy.txt并在文件中写入"I IOVE YOU"字符。

    #!/bin/bash
    cd /opt/testfile/test
    touch szy.txt
    echo "I LOVE YOU" >> szy.txt
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    四、Shell中的变量

    1 常用的系统变量

    在这里插入图片描述

    2 自定义变量

    2.1 基本语法

    定义变量:变量=值
    撤销变量:unset变量
    声明静态变量:readonly变量,注意:不能unset

    在这里插入图片描述

    2.2 变量定义规则

    变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量命名建议大写。等号两侧不能有空格。在bash中,变量默认都是字符串类型,无法直接进行数值运算。变量的值如果有空格,需要使用双引号或单引号括起来。

    可把变量提升为全局变量供其他Shell程序使用。

    export A
    
    • 1

    3 特殊变量:$n

    n为数字,$ 0代表该脚本名称, $ 1到$ 9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}。

    #!/bin/bash
    echo "$0 $1 $2 $3"
    
    • 1
    • 2

    在这里插入图片描述

    4 特殊变量:$#

    $#获取所有输入参数个数,常用于循环。

    #!/bin/bash
    echo "$0 $1 $2 $3"
    echo $#
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    5 特殊变量:$*、 $@

    $*代表命令行中所有的参数,把所有参数看成一个整体。
    $@代表命令行中所有的参数,不过把每个参数区分对待。

    #!/bin/bash
    echo "$0 $1 $2 $3"
    echo $#
    echo $*
    echo $@
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    6 特殊变量:$?

    $?:最后一次执行命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确。

    在这里插入图片描述

    五、运算符

    1.$((运算式)) 或 $[运算式]
    2.expr +,-,*,/,%加减乘除取余,expr运算符间要有空格。

    在这里插入图片描述

    六、条件判断

    1 基本语法

    [ condition ](注意conditon前后要有空格),条件非空即为true,[ atguigu ]返回true,[ ]返回false。

    2 常用判断条件

    2.1 两个整数之间的比较

    = 字符串比较
    -lt 小于 (less than)
    -le 小于等于 (less equal)
    -eq 等于 (equal)
    -gt 大于 (greater than)
    -ge 大于等于 (greater equal)
    -ne 不等于 (not equal)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    2.2 按照文件权限进行判断

    -r 有读的权限 (read)
    -w 有写的权限 (write)
    -x 有执行的权限 (execute)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.3 按照文件类型进行判断

    -f 文件存在并且是一个常规的文件(file)
    -e 文件存在(existence)
    -d 文件存在并是一个目录(directory)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.4 多条件判断

    &&表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令执行失败后,才执行下一条命令。

    在这里插入图片描述

    七、流程控制

    1 if判断

    基本语法:

    if [ 条件判断式 ];then
    	程序
    fi
    
    • 1
    • 2
    • 3

    或者

    if [ 条件判断式 ]
    	then
    		程序
    fi
    
    • 1
    • 2
    • 3
    • 4

    中括号和条件表达式之间必须有空格,if后要有空格。

    在这里插入图片描述

    2 case语句

    基本语法:

    case $变量名 in
    "值1")
    如果变量的值等于值1,则执行程序1
    ;;
    "值2")
    如果变量的值等于值2,则执行程序2
    ;;
    *)
    如果变量的值都不是以上的值,则执行此程序
    ;;
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    3 for循环

    基本语法1:

    for((初始值循环;控制条件;变量变化))
    do
    	程序
    done
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    基本语法2:

    for 变量 in123 ...
    do
    	程序
    done
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    4 while循环

    基本语法:

    while [ 条件判断式 ]
    do
    	程序
    done
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    八、read读取控制台输入

    基本语法:

    read(选项)(参数)
    选项:
    	-p:指定读取值时的提示符
    	-t:指定读取值时等待的时间(秒)
    参数:
    	变量:指定读取值得变量名
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    九、函数

    1 系统函数

    1.1 basename基本语法

    basename命令会删掉所有的前缀包括最后一个(“/”)字符,然后将字符串显示出来。suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。

    basename [string/pathname][suffix]
    
    • 1

    在这里插入图片描述

    1.2 dirname基本语法

    从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)。

    dirname 文件绝对路径
    
    • 1

    在这里插入图片描述

    2 自定义函数

    基本语法:

    [ function ] funname[()]
    {
    	Action;
    	[return int;]
    }
    funname
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    经验技巧:
    必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其他语言一样先编译。
    函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果作为返回值,return后跟数值n(0-255)。

    在这里插入图片描述

    十、Shell工具

    1 cut

    cut的工作就是剪,具体的说就是在文件中负责剪数据用的。cut命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。基本用法:

    cut [选项参数] filename
    
    • 1
    选项参数功能
    -f列号,提取第几列
    -d分隔符,按照指定分割符分割列

    默认分隔符是制表符。

    在这里插入图片描述

    切割ifconfig后打印的IP地址:

    在这里插入图片描述

    2 sed

    sed是一种流编译器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。基本用法:

    sed[选项参数] 'command' filename
    
    • 1
    选项参数功能
    -e直接在指令列模式上进行sed的动作编辑
    命令功能描述
    a新增,a的后面可以接字串,在下一行出现
    b删除
    s查找并替换

    在这里插入图片描述

    3 awk

    一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。基本语法:

    awk[选项参数] 'pattern1{action1} pattern2{action2}...' filename
    
    • 1

    pattern:表示AWK在数据中查找的内容,就是匹配模式。
    action:在找到匹配内容时所执行的一系列命令。

    选项参数功能
    -F指定输入文件分隔符
    -v赋值一个用户定义变量

    (1)搜索passwd文件以root关键字开头的所有行,并输出该行的第7列

    passwd文件路径为/etc/passwd,cp一份。

    在这里插入图片描述

    (2)搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列,中间以","分割

    在这里插入图片描述

    (3)只显示/etc/passwd的第一列和第七列,以逗号分割,且在所有行前面添加列名user,shell在最后一行添加"wwxzuishuai,/bin/shizhiminggui"。

    在这里插入图片描述

    (4)将passwd文件中的用户id增加数值1并输出

    在这里插入图片描述

    awk的内置变量:

    变量说明
    FILENAME文件名
    NR已读的记录数
    NF浏览记录的域的个数(切割后,列的个数)

    (1)统计passwd文件名,每行的行号,每行的列数

    在这里插入图片描述

    (2)切割IP

    在这里插入图片描述

    (3)查询sed.txt中空行所在的行号

    在这里插入图片描述

    4 sort

    sort命令是在Linux里非常有用的,它将文件进行排序,并将排序结果标准输出。基本语法:

    sort(选项)(参数)
    
    • 1
    选项说明
    -n依照数值大小进行排序
    -r以相反的顺序来排序
    -t设置排序时所用的分隔字符
    -k指定需要排序的列

    参数:指定待排序的文件列表。
    在这里插入图片描述

  • 相关阅读:
    新开窗口 展示协议
    第一章 初识debug
    3.81 OrCAD软件绘制原理图时如何使用任意角度的走线?OrCAD软件怎么统一查看哪些元器件是没有PCB封装的?
    Java--基本语法
    Docker从认识到实践再到底层原理(五)|Docker镜像
    【算法集训 | 暑期刷题营】7.20题---贪心
    Git 学习(一)---- 常用命令
    一个会自动排空的扫雷游戏,不来看看吗?
    【Leetcode Sheet】Weekly Practice 9
    【斗破年番】蝎毕岩决战小医仙,魂殿铁护法出场,彩鳞再霸气护夫
  • 原文地址:https://blog.csdn.net/weixin_43912621/article/details/130889726