C高级(Day25)

news2024/10/9 8:55:41

一、学习内容

  1. Shell脚本

    1. shell中的变量

      1. shell中变量的定义
        1. shell中的变量是没有数据类型的,,默认是字符串
        2. shell中的变量默认是全局变量
        3. 格式
          1. 变量名 错误,计算机认为变量名是一个指令

          2. 变量名= 正确,定义变量 ,值为空

          3. 变量名=值 正确,定义变量并赋值

          4. 注意变量名:符合命名规范

      2. shell中变量的定义以及初始化
        1. 注意:=号的左右两端不允许有空格
        2. 格式
          1. 变量名=初始值

          2. 变量名='初始值'

          3. 变量名="初始值"

          4. 初始化的值不能有空格

            1. var = hello 错误

          5. 初始化的值有空格

            1. var=hello world 错误 var='hello world' 正确

          6. 使用变量进行初始化

            1.     a=hello
                  b=world
                  var=a  ---->var的值是a 而不是hello
                  var=$a --->var的值是hello
                  var=${a}
                  var=$a $b    错误
                  var='$a $b'  等价于  var的值是$a $b 不可以展开变量的值
                  var="$a $b"  hello world  可以展开变量的值

      3. shell中变量值的引用
        1. 引用变量的值
          1. 格式1
            1. $变量名

          2. 格式2
            1. ${变量名}

      4. 位置变量
        1. 位置变量:类似于C语言中的argc和argv, 接受终端输入的字符串 多用于函数传参

      5. 预定义变量
        1. 概念:系统已经定义好的变量,直接使用即可

        2. $* 终端输入的所有字符串,不包括文件名,它们中间使用空格隔开

        3. $# 输入字符串的个数

        4. $@ 终端输入的所有字符串,不包括文件名,它们中间使用空格隔开

        5. $? 接收上一个指令的状态 0成功指令 非0失败

        6. $$ 获取当前终端的进程号

      6. 命令置换
        1. 概念:把一个指令的输出赋值给变量
        2. 格式
          1. 变量名=$(指令)

          2. 变量名=`指令`

      7. shell的特殊符号
        1. readonly 只读
          1. 格式: readonly 变量名=初始值 不可变

        2. unset 取消变量,不可以取消只读类型的变量
          1. 格式: unset 变量名

        3. local 局部变量
          1. 格式: local 变量名=初始值

    2. shell中的输入输出

      1. 输出 echo
        1. 格式
          1. 输出字符串

            1. echo 字符串

            2. echo '字符串'

            3. echo "字符串"

          2. 使用echo输出变量

            1.  a=100
                 b=200
                 echo a=$a b=$b    ----->a=100 b=200
                 echo 'a=$a b=$b'  ----->a=$a b=$b
                 echo "a=$a b=$b"  ----->a=100 b=200

      2. 输入 read
        1. 输入一个或者多个变量
          1. read 变量名1 变量名2 ... 多个数据的输入使用空格或者tab隔开,使用enter结束

        2. read -p "提示语句" 变量名
          1. read -p "please input .." a

        3. read -n 个数 变量 输入多少个 自动结束
          1. read -n 3 a

        4. read -t 秒数 几秒不输入自动结束
        5. read -s 变量 加密输入
        6. read -a 数组名
    3. shell的字符串

      1. 默认shell中的变量初始化的值就是字符串 2.var=hello 【shell中的字符串就是个普通变量,不是字符数组】
        1. 计算字符串的长度
          1. 格式: ${#变量}

        2. 字符串连接
          1. a=hello b=world a=$a$b --->字符串的连接

        3. 字符串剪切
          1. 从左往右(从前往后),截取从0开始计算到后面的所有字符串

            1. 格式1:${变量名:n} 从左往右,0开始。从n截取到最后

            2. 格式2:${变量名:n:m} 从左往右,0开始。从n截取m个

          2. 从右往左,截取从1开始

            1. 格式1:${变量名:0-n} 从右往左,1开始。从n截取到最后

            2. 格式2:${变量名:0-n:m} 从右往左,1开始。从n截m个

          3. 使用 # ## % %% 截取字符串 string 表示分隔符

            1. 格式1: ${变量名#*string}

              1. str=www.baidu.com a=${str#*.} 一个#表示,从左往右,截取第一个以.分隔符后面的所有字符串 baidu.com

            2. 格式2: ${变量名##*string}

              1. str=www.baidu.com b=${str##*.} 两个个#表示,从左往右,截取最后一个以.分隔符后面的所有字符串 com

            3. 格式3: ${变量名%string*}

              1. str=www.baidu.com c=${str%.*} 一个%表示,从右往左,截取第一个以.分隔符的前面所有的字符串 www.baidu

            4. 格式4: ${变量名%%string*}

              1. str=www.baidu.com d=${str%%.*}两个%表示,从右往左,截取最后一个以.分隔符的前面所有的字符串 www

    4. shell中的数组

      1. shell中只有一维数组,不存在二维数组、三维。。数组 2.shell中数组里的元素都是字符串
        1. 数组的定义以及初始化
          1. 数组的标志:在初始化时需要使用()赋值

            1. 定义数组并初始化

              1. arr=(1 2 3 4 5) ---->而不是{} arr=([0]=1 [1]=2 [2]=3 [3]=4 [4]=5)

              2. shell中的数组支持稀疏数组,

              3. 单个初始化 ,不需要定义数组

              4. 数组追加初始化

              5. 数组的拼接

                1. c=(${a[*]} ${b[*]}) c=(${a[@]} ${b[@]})

        2. 数组的引用 (元素的值)
          1. ${arr[index]} 单个元素的引用 数组的元素值 必须使用${}

          2. ${arr[*]} 引用数组中所有的元素

          3. ${arr[@]} 引用数组中所有的元素

          4. ${#arr[index]} 单个元素的字符个数

          5. ${#arr[*]} 数组的元素个数

          6. ${#arr[@]} 数组的元素个数

    5. shell的运算符

      1. 1.shell不擅长算术运算,擅长对字符串和文件的相关操作 2.shell中的运算符 (()) ---->算术、关系、逻辑、条件 $[] ---->算术、关系、逻辑、条件 let ---->算术、关系、逻辑、条件 expr ---->算术、逻辑、字符串、关系
        1. (())
          1. 功能: 对整数做运算、算术、关系、条件、逻辑 (()) 是运算符 不是指令

            1. 格式

              1. ((变量=表达式))

              2. 变量=$((表达式))

            2. 注意事项

              1. 空格可有可无

              2. 使用变量的值时,$可有可无

              3. (()) 可以实现任意复杂的表达式:算术、关系、逻辑、条件

              4. 可以实现自增或自减的运算

              5. 可以实现幂运算

        2. $[]
          1. 功能:对整数做运算,算术、关系、条件、逻辑 $[] 是运算符 不是指令

            1. 格式

              1. 变量=$[表达式]

            2. 注意事项

              1. 空格可有可无

              2. 使用变量的值时,$可有可无

              3. $[] 可以实现任意复杂的表达式:算术、关系、逻辑、条件

              4. 可以实现自增或自减的运算

              5. 可以实现幂运算

        3. let
          1. 功能:对整数做运算,算术、关系、条件、逻辑 let是一个指令

            1. 格式

              1. let 变量=表达式 let c=a+b 不可以写空格

              2. let "变量=表达式"

            2. 注意事项

              1. 空格可有可无

              2. 使用变量的值时, $可有可无

              3. let 可以实现任意复杂的表达式:算术、关系、逻辑、条件

              4. 可以实现自增或自减的运算

              5. 可以实现幂运算

        4. expr
          1. expr是一个指令 expr必须空格

            1. 格式

              1. expr 表达式

              2. 引用格式

                1. 变量=`expr 表达式`

                2. 变量=$(expr 表达式)

            2. 注意事项

              1. 空格必须存在

              2. 使用变量时,$必须存在,建议添加""

              3. expr可以实现算术、关系、逻辑、字符串 关系可能出错,需要添加转义字符 eg: \> \!=

              4. 不可以实现自增或自减运算

              5. 不可以实现幂运算

            3. 逻辑运算

              1. 逻辑或

                1. ARG1 | ARG2

                  1. 如果ARG1为真(不为0 空), ARG2为真, 返回的结果是ARG1
                    如果ARG1为真(不为0 空), ARG2假, 返回的结果是ARG1
                    如果ARG1为假, ARG2为真(不为0 空), 返回的结果是ARG2
                    如果ARG1为假, ARG2假, 返回的结果是0

              2. 逻辑与

                1. ARG1 & ARG2

                  1. 如果ARG1为真(不为0 空), ARG2为真, 返回的结果是ARG1
                    如果ARG1为真(不为0 空), ARG2为假, 返回的结果是0
                    如果ARG1为假, ARG2为真, 返回的结果是0 如果ARG1为假, ARG2假, 返回的结果是0

            4. 关系运算

              1. 如果条件成立则返回1,否则返回0

                1. ARG1 < ARG2

                2. ARG1 <= ARG2

                3. ARG1 = ARG2

                4. ARG1 != ARG2

                5. ARG1 >= ARG2

                6. ARG1 > ARG2

            5. 算术运算

              1. ARG1 + ARG2

              2. ARG1 - ARG2

              3. ARG1 * ARG2

              4. ARG1 / ARG2

              5. ARG1 % ARG2

            6. 字符串运算

              1. 匹配字符串,返回匹配字符的个数

                1. match STRING REGEXP

                  1.  eg:
                                str=hello
                                str1=he
                                value=`expr match $str $str1` ------>2

              2. 实现字符串截取 从第一个位置开始第几个 截取多少个

                1. substr STRING POS LENGTH

                  1. eg:
                               str=www.hqyj.com
                               格式:value=`expr substr $str 5 4`   ----->hqyj 

              3. 获取字符在字符串中出现的位置从1开始,失败返回0

                1. index STRING CHARS

                  1.  eg:
                            char=e
                            str=hello
                            格式: value=`expr index $str $char`    -----返回的位置是2           

              4. 计算字符串长度

                1. length STRING

                  1. eg:
                            str=www.hqyj.com    ${#str}
                            格式: value=`expr length $str`  ------>12

    6. shell的选择结构

      1. 单、双、多分支
        1. 单分支选择结构
          1. if 表达式
                then
                    sell语句
                fi
                执行过程:如果表达式为真,则执行shell语句,否则跳过

        2. 双分支选择结构
          1. if 表达式
                then
                   sell语句1
                else
                   sell语句2
                fi
                执行过程:如果表达式为真,则执行shell语句1,否则执行shell语句2

        3. 多分支选择结构
          1.   if 表达式1
                then
                    sell语句1
                elif 表达式2
                then
                    sell语句2
                .....
                else
                    sell语句n
                fi
                执行过程:如果  表达式1为真,则执行shell语句1,结束多分支。如果表达式1为假,则执行表达式2,
                如果表达式2为真,则执行shell语句2,结束多分支。如果为假向下继续

      2. test指令
        1. 1】test是一个指令,必须加空格
          2】test使用变量的值时,必须加$,使用变量时建议加" "
          3】test指令等价于[]

          1. 格式
            1.   if test 表达式
                  then
                      shell语句
                  fi

            2.  if [ 表达式 ]    ---->因为[]等价于test,而test是一个指令,指令必须有空格
                then
                      shell语句
                fi  

          2. test 的关系运算 e: = g: > l: < -eq:== -ge: >= -gt: > -le:<= -lt:< -ne:!=
            1. 判断整数INTEGER1和INTEGER2是否相等

              1. INTEGER1 -ge INTEGER2

            2. 判断整数INTEGER1大于INTEGER2

              1. INTEGER1 -gt INTEGER2

            3. 判断整数INTEGER1小于等于INTEGER2

              1. INTEGER1 -le INTEGER2

            4. 判断整数INTEGER1小于INTEGER2

              1. INTEGER1 -lt INTEGER2

            5. 判断整数INTEGER1不等于INTEGER2

              1. INTEGER1 -ne INTEGER2

          3. test的逻辑运算
            1. 格式

              1. [ 表达式1 -a 表达式2 ]

              2. [ 表达式1 ] && [ 表达式2 ]

            2. 判断表达式为真

              1. ( EXPRESSION )

                1. 判断a不等于0
                  if(a!=0) if [ $a ]

            3. 判断表达式为假

              1. ! EXPRESSION

                1. 判断a等于0
                  if(a==0) if [ !$a ]

            4. 逻辑与:遇假则假,全真为真

              1. EXPRESSION1 -a EXPRESSION2

                1. if(ch>='0'&&ch<='9')
                             if [ $ch -ge '0' -a $ch -le '9' ]                     
                             if [ $ch -ge '0' ] && [ $ch -le '9' ] 

            5. 逻辑或:全假为假,遇真则真

              1. EXPRESSION1 -o EXPRESSION2

  2. 脑图

二、作业

1、分支结构结合test指令完成一下编程

1>判断闰年

代码解答:
#!/bin/bash


read -p "请输入一个年份:" year
if [ $((year%4)) -eq 0 -a $((year%100)) -ne 0 -o $((year%400)) -eq 0 ]
then
	echo yes
else
	echo no
fi
成果展现:

2>输入一个数判断是否为偶数

代码解答:
#!/bin/bash


read -p "请输入一个数字:" a
if [ $((a%2)) -eq 0 ]
then
	echo yes
fi
成果展现:

 

3>使用test指令实现等级判断 90--100A 60--89B 0-59C 其他错误

代码解答:
#!/bin/bash

read -p "请输入成绩:" score

if [ $score -ge 90 ] && [ $score -le 100 ]; then
    echo A
elif [ $score -ge 60 ] && [ $score -lt 90 ]; then
    echo B
elif [ $score -ge 0 ] && [ $score -lt 60 ]; then
    echo C
else
    echo "输入错误,请输入0到100之间的成绩"
fi
成果展现:

三、总结

学习内容概述

1. Shell脚本基础:

基本语法:

包括脚本的编写格式、注释的使用、变量的定义与使用。

基本命令:

常用的Shell命令如`echo`、`read`、`test`等,以及如何进行字符串操作、文件操作。

2. 条件控制:

if-else语句:

如何在Shell中使用`if`语句进行条件判断,包括单条件、多条件判断,`test`命令的使用。

case语句:

多条件判断的简化形式,处理多个匹配模式的情况。

3. 循环结构:

for循环:用于遍历列表或数组。
while和until循环:基于条件的循环执行,了解它们的不同应用场景。
循环控制语句:

`break`和`continue`的用法,控制循环的执行。

学习难点

1. 字符串和文件处理:

Shell脚本中处理字符串和文件时需要熟练使用各种命令,如`cut`、`sed`、`awk`等,这些命令的用法灵活多样,初学时容易混淆。

2. 条件判断与运算:

Shell脚本中的条件判断与其他编程语言有一定差异,特别是在数值运算和字符串比较时,`test`命令的符号使用容易引起困惑。

3. 输入输出重定向:

处理多个文件和命令的输入输出时,需要注意重定向符号的正确使用,避免数据丢失或格式错误。

注意事项

1. 脚本执行权限:

编写完成后,务必为脚本赋予执行权限(使用`chmod +x`),否则无法直接运行脚本。

2. 变量命名和作用域:

Shell脚本中变量的命名和作用域需要注意,全局变量和局部变量的管理不当可能导致数据冲突或不可预期的结果。

3. 调试脚本:

编写复杂的脚本时,建议在每个关键步骤进行输出,或者使用`set -x`进行逐步调试,方便查找逻辑问题。

4. 参数传递和返回值:

编写函数时要清楚如何传递参数,并了解返回值的局限性(只能返回整数),需要通过全局变量或回显来处理复杂数据。

 未来学习重点

1. 文件与文本处理工具:

深入学习`sed`、`awk`、`grep`等命令,掌握它们在数据过滤、格式化和分析中的强大功能。

2. Shell脚本中的高级编程:

学习如何通过Shell脚本自动化管理系统任务,例如定时任务的创建、日志文件的分析、批量文件处理等。

3. 与其他工具的结合:

探索Shell脚本与其他编程工具的结合,如Python、Perl,用于编写更复杂的系统管理脚本或自动化工具。

4. 性能优化:

随着脚本复杂度的增加,研究如何提高脚本执行效率,包括命令优化、减少不必要的资源消耗等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2198606.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Springboot+Vue的公寓出租系统 (含源码数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 这个系…

成都睿明智科技有限公司靠谱吗怎么样?

在这个短视频与直播带货风起云涌的时代&#xff0c;抖音电商凭借其庞大的用户基数和高效的流量转化能力&#xff0c;成为了众多商家争相入驻的新蓝海。而在这场电商盛宴中&#xff0c;专业的服务商如成都睿明智科技有限公司&#xff0c;更是成为了连接品牌与消费者的桥梁。那么…

Win10 安装 Redis 数据库

一、Redis 数据库介绍 Redis 是一个开源的高性能键值对&#xff08;key-value&#xff09;的非关系型数据库。它通常用作数据结构服务器&#xff0c;支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff09;、列表&a…

同城O2O系统源码与跑腿配送平台的架构设计与开发方案详解

今天&#xff0c;笔者将与您一同深入探讨同城O2O系统的源码及跑腿配送平台的架构设计与开发方案&#xff0c;助力开发者和企业在这一领域的实践与探索。 一、O2O系统概述 在同城O2O模式中&#xff0c;用户可以通过手机应用或网页平台下单&#xff0c;而配送员则根据订单信息迅…

redis高级(面试题一)

目录 一、Redis持久化机制有哪些&#xff1f;有什么区别&#xff1f; 1、RDB(redis database) 2、AOF 3、区别 二、redis的主从集群有什么用&#xff1f; 1、什么是redis的主从集群 2、为什么要使用redis主从集群&#xff08;也就是有什么用&#xff09; 三、redis的哨兵…

ORA-19815 db_recovery_file_dest_size 100%

1、alert日志报错 ORA-19815 db_recovery_file_dest_size 100% 恢复区空间使用满 2、rm删除后操作系统空间使用&#xff0c;但V$RECOVERY_FILE_DEST记录的空间使用率仍然是满的 3、rman delete expired 归档日志后恢复正常 4、当然可以通过增大db_recovery_file_dest_size来临时…

算法笔记(十四)——多源 BFS

文章目录 <font colorred>01 矩阵<font colorred>飞地的数量/font>地图中的最高点地图分析 多源 BFS 单源最短路问题&#xff1a;一个起点到一个终点的最短路&#xff1b; 解决步骤&#xff1a; 把起点放进队列里一层一层往外扩 相关文章&#xff1a;算法笔记&a…

0基础跟德姆(dom)一起学AI 机器学习04-逻辑回归

逻辑回归简介 应用场景 逻辑回归是解决二分类问题的利器 数学知识 sigmoid函数 概率 极大似然估计 核心思想&#xff1a; 设模型中含有待估参数w&#xff0c;可以取很多值。已经知道了样本观测值&#xff0c;从w的一切可能值中&#xff08;选出一个使该观察值出现的概率为…

C++拾趣——绘制Console中DropdownMenu

大纲 居中显示窗口清屏并重设光标绘制窗口绘制窗口顶部绘制下拉行绘制下拉框选项绘制按钮行绘制窗口底部 修改终端默认行为对方向键的特殊处理过程控制Tab键的处理Enter键的处理上下左右方向键的处理 完整代码代码地址 这次我们要绘制下拉菜单&#xff0c;如下图。 居中显示窗口…

C语言 | Leetcode C语言题解之第466题统计重复个数

题目&#xff1a; 题解&#xff1a; #include <stdlib.h> #include <stdio.h> #include <stdbool.h> #include <string.h> #include <math.h> #include <limits.h>#define MMAX(a, b) ((a) > (b)? (a) : (b)) #define MMIN(a,…

xianshan分支预测器BPU

xianshan分支预测器BPU 1 RISC-V分支预测1.0 分支预测基本类型1.0.1 条件分支指令1.0.2 无条件分支指令 1.1 方向预测1.1.1 饱和计数器法1.1.1.1 Questions 1.1.2 分支历史法--程序局部性原理1.1.2.1 Questions 1.2 目标地址预测1.2.1 分支目标缓存--BTB 1.3 预测指令类型1.3.1…

【小白向】机器人入门之ROS系统的学习(Ubuntu24.04+ROS2)

目录 一.复杂的机器人系统 二.ROS机器人系统 1.简介 1.节点 2.话题 2.安装 3.测试 4.可视化 RQT&#xff1a; RVIZ&#xff1a; 显示属性&#xff1a; 显示状态&#xff1a; 一.复杂的机器人系统 依照我们现在的技术来看&#xff0c;机器人系统仍是极其复杂的&#xff0c;往…

深入了解音频剪辑在线工具的特色与优势

在数字时代&#xff0c;音频内容已成为连接人心的重要桥梁。如果你也有同样的兴趣爱好&#xff0c;那不妨看看我今天要介绍的音频剪辑在线相关的工具们吧。 1.福昕音频剪辑 链接直达>>https://www.foxitsoftware.cn/audio-clip/ 福昕音频剪辑工具&#xff0c;专为音乐…

【H2O2|全栈】关于CSS(11)flex——更加优雅的布局

目录 CSS3入门 前言 准备工作 布局优化 如何使用flex布局 容器与成员 概念 轴线 容器的属性 成员的属性 预告和回顾 后话 CSS3入门 前言 本系列博客主要介绍CSS有关知识点&#xff0c;当前章节讲述CSS3相关内容。 本章节讲述flex布局的相关知识。 部分内容仅代…

数据结构 ——— 单链表oj题:环形链表

目录 题目要求 手搓简易环状单链表 代码实现 问题1&#xff1a;slow 指针和 fast 指针一定会相遇吗 问题2&#xff1a;slow 每次走一步&#xff0c;fast 每次走 n 步是否还能判断链表带环&#xff1f;&#xff08;n > 2&#xff09; 题目要求 有一个单链表的头节点 …

【翻译】在 Python 应用程序中使用Qt Designer的UI文件

原文地址&#xff1a;Using a Designer UI File in Your Qt for Python Application 直接上图&#xff0c;上代码 将UI文件转为Python To demonstrate, we use the Qt Widgets animation easing example. 为了演示&#xff0c;我们使用 Qt Widgets 动画简化示例。 这个应用程…

快递查询软件:实现单号识别与批量物流查询的高效工具

随着网络购物的普及&#xff0c;快递物流行业迎来了前所未有的发展机遇&#xff0c;同时也面临着巨大的挑战。跟踪物流信息成为一个难题&#xff0c;因此&#xff0c;快递查询软件的核心功能之一便是单号识别。传统的快递单号输入方式繁琐且易出错在此背景下&#xff0c;快递查…

游戏盒子推广全攻略:从用户洞察到策略实施

在移动互联网时代&#xff0c;游戏盒子的推广已经成为众多游戏代理商和开发者的重要课题。面对激烈的市场竞争&#xff0c;如何高效吸引并留住玩家&#xff0c;成为游戏盒子推广的关键。本文将结合Xinstall这一专业App推广工具&#xff0c;探讨游戏盒子推广的有效策略。 一、市…

详细分析Java8中的StringJoiner | 对比StringBuilder(附Demo)

目录 前言1. 差异对比2. 基本知识3. 源码分析4. Demo 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 差异对比 展…

多种方式确定Linux是CentOS还是Ubuntu

目录 前言正文 前言 对应的基本知识比较少&#xff0c;以下只是记录总结 由于目前使用的是centos&#xff0c;后续找到linux会对应补充 正文 要确定Linux系统是CentOS还是Ubuntu&#xff0c;可以通过以下几种方式进行分析 一、查看发行版信息文件&#xff1a; CentOS&…