首页 > 其他分享 >学习笔记3(第十章)

学习笔记3(第十章)

时间:2023-09-24 20:55:07浏览次数:50  
标签:脚本 变量 SH 第十章 笔记 echo 学习 sh file

一、知识点归纳

1、本章的主要学习重点

在本章节中,我们将深入探讨sh脚本的各个方面。首先,我们会了解sh脚本是什么,以及它与C语言在结构和功能上的主要区别。接下来,我们会详细学习如何编写sh脚本,其中包括变量的定义和使用、不同类型的语句结构、命令的执行、常规的系统命令以及命令替换技巧。此外,本章还会对sh控制语句进行深入剖析,解释它们如何在脚本中起作用,以及如何正确使用它们。最后,我们将学习如何在sh中定义函数,并探讨如何使用参数来调用这些函数。

程序设计语言的核心要素和技能

当我们谈论程序设计语言时,不同的语言有其独特的特性和语法。但是,从广义上说,所有强大的编程语言都应该具备以下几种基本机制,以便我们在其中有效地组织和表示计算逻辑:

  1. 基本表达形式:这是编程语言的基础,它使我们能够描述和指定要操作的对象。
  2. 组合的方法:它允许我们从简单的基本部分开始,构建更复杂的组合结构。
  3. 抽象的方法:这使我们能够为复杂的组合对象命名,从而可以像操作基本对象一样操作它们。

具体来说,当我们在使用任何编程语言(包括shell脚本)时,通常会涉及以下几个核心方面:

  • 数据类型和变量的定义。
  • 运算符和表达式的使用。
  • 控制流,包括条件判断和循环结构。
  • 函数的定义和调用。

在shell脚本中,这些核心概念同样适用。我们可以定义不同类型的变量,使用运算符和表达式进行操作,利用控制流完成条件逻辑和循环,并通过函数来模块化代码,从而实现自动化操作和提高效率。

关于Shell和脚本

Shell 通常被称为操作系统的“外壳”。它是与操作系统交互的接口。通过Shell,我们可以输入各种命令来控制操作系统。例如,在Linux系统中,常用的Shell命令包括ls(列出目录内容)、cd(改变当前目录)和pwd(显示当前目录)。简而言之,Shell是一个命令行解释器,它根据用户输入的命令来启动、管理或停止应用程序,并对系统进行控制。

脚本 是一系列按顺序组织的命令,存储在一个文件中。脚本可以被认为是一种可执行文件,但与传统的可执行文件不同,脚本是通过解释器逐行解释和执行的,而不需要事先进行编译。因此,虽然脚本具有灵活性和便捷性的优点,但在执行速度上可能不如编译后的程序快。

SH脚本与C语言的对比

  • 执行方式:sh脚本是解释型的,这意味着它会逐行读取脚本内容并执行,而不需要事先编译。而C语言是编译型语言,它需要首先被编译成二进制格式,然后才能被执行。

  • 数据类型:在C语言中,每个变量都有一个明确的数据类型,如char、int、float等。但在sh脚本中,所有变量基本上都被视为字符串,这使得脚本语言在处理文本数据时更加灵活。

  • 程序入口:每个C程序必须有一个main()函数,它是程序的起点。而在sh脚本中,程序的起点是文件中的第一个可执行命令,无需特定的入口函数。

2、苏格拉底挑战

问题一:

问题一
问题一

问题二:

问题二
问题二

二、问题解决与思路

SH脚本基础入门

基础SH脚本

#!/bin/bash # 这句话表示用linux指定去解析文本内容
# 第一个shell小程序
echo hello world!
  • 第一行表示我们选择使用bash shell。Shell中'#'符号表示注释。Shell的第一行比较特殊,一般都会以'#!'开始来指定使用的shell类型。在linux中,除了bash shell以外,还有很多版本的shell,例如zsh、dash等等。但是bash shell仍然是我们使用最多的。

  • 第二行以'#'符号开始,表示本行是注释,运行的时候是不会运行本行的。

  • 第三行中的'echo'是Linux中的输出命令,该行的意思很明显就是输出'hello world!'。

  • 'chmod +x hello.sh' 的意思是赋予'hello.sh'的可执行权限。

  • 在linux中,后缀名几乎是可以任意的或者没有后缀名,一般将shell保存为'xxx.shell'是为了看起来更直观。

1.命令行参数

  • '$#' = 命令行参数1到n的数量;
  • '$*' = 所有命令行参数,包括$0;

此外,sh还有与命令执行相关的以下内置变量:

  • '$S' = 执行sh进程PID;
  • '$?' = 最后一个命令执行的退出状态(如果成功,则为0,否则为非0)。

2.SH变量

在sh中,什么是变量?

变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。

变量设置规则

  • 变量名称可以由字母、数字和下划线组成,但不能以数字开头。
  • 变量的默认类型都是字符串型。
  • 变量用等号连接值,等号左右两侧不能有空格。
  • 变量的值如果有空格,需要使用单引号或者双引号括起来。
  • 不能使用标点符号。

3.SH中的引号

SH有许多特殊字符。要想把它们用作普通字符,可以使用''或单引号来引用它们。

4.SH语句

SH语句包括所有Unix/Linux命令,以及可能的I/O重定向。此外,sh编程语言还支持控制sh程序执行的测试条件、循环、case等语句。

5.SH命令

内置命令

  • '.file':读取并执行文件。
  • 'break [n]':从最近的第n个嵌套循环中退出。
  • 'cd [dirname]':更换目录。
  • 'continue[n]':重启最近的第n个嵌套循环。
  • 'eval [arg...]':计算一次参数并让sh执行生成的命令。
  • 'exec [arg...]':通过这个sh执行命令,sh将会退出。
  • 'exit [n]':使sh退出,退出状态为n。
  • 'export [var…]':将变量导出到随后执行的命令.
  • 'read [var...]':从stdin 中读取一行并为变量赋值。
  • 'set [arg...]':在执行环境中设置变量。
  • 'shift':将位置参数23...重命名为 12...。
  • 'trap [arg] [n]':接收到信号n后执行参数。
  • 'umask [ddd]':将掩码设置为八进制数 ddd 的。
  • 'wait pid]': 等待进程 pid,如果没有给出pid,则等待所有活动子进程。

Linux命令

  • 'echo'命令:将参数字符串作为行回显到stdout。
  • 'expr'命令:间接更改sh变量的值。
  • '管道'命令:作为过滤器。
  • '实用'命令:
    axk:数据处理程序。
    cmp:比较两个文件。
    comm:选择两个排序文件共有的行。
    grep:匹配一系列文件的模式。
    diff:找出两个文件的差异。
    join:通过使用相同的键来连接记录以比较两个文件。
    sed:流或行编辑命令。
    sort:排序或合并文件。
    tail:打印某个文件的最后口行。
    tr:一对一宇符翻译。
    uniq:从文件中删除连续重复行。

6.SH命令替换

在SH中,'$A'会被替换成A值。同样,当sh遇到'cmd'或'(cmd)'时,它会先执行cmd,然后用执行的结果字符替换'$(cmd)'。

实验中出现的问题:

不在sudoers文件

问题1结果
问题1解决

三、实验过程截图、代码

sh控制语句

  • if语句
    - if条件语句
    c if [ 条件判断 ];then 程序 fi
    或者
        if [ 条件判断 ]
          then
            程序
        fi

实践截图1

    - 实践:
        #!/bin/bash

        #统计根分区使用率
        rate=$(df -h | grep /dev/vda1 | awk '{print $5}' | cut -d "%" -f 1)

        if [ $rate -ge 20 ]
          then
        echo "error 10"
        fi

        if else条件语句

        if [ 条件判断 ]
          then
            条件成立时,执行此程序
          else
             条件不成立时,执行的另外一个程序
        fi
    - 实践:
        #!/bin/bash

        #备份mysql数据库

        #同步系统时间
        ntpdate asia.pool.ntp.org &>/dev/null
        #把当前系统时间按照“年月日”格式赋予变量date
        date=$( date+%y%m%d )
        #统计mysql的数据库大小,并把大小赋予size变量
        size=$( du -sh /var/lib/mysql )

        if [ -d /tmp/dbback ]
          then
            echo "Date: $date!" > /tmp/dbback/dbinfo.txt
            echo "Date size: $size" >> /tmp/dbback/dbinfo.txt
            cd /tmp/dbback
            tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
            rm -rf /tmp/dbback/dbinfo.txt
         else
            mkdir /tmp/dbback
            echo "Date: $date!" > /tmp/dbback/dbinfo.txt
            echo "Date size: $size" >> /tmp/dbback/dbinfo.txt
            cd /tmp/dbback
            tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
            rm -rf /tmp/dbback/dbinfo.txt 
        fi
    - 多分支if条件语句
         if [ 条件判断式1 ]
          then
            当条件判断式1成立时,执行程序1
         elif [ 条件判断式2 ]
            then
          当条件判断式2成立时,执行程序2
        ...省略更多条件
        else 
        当所有条件都不成立时,最后执行此程序
        fi
    - 实践:
        #!/bin/bash

        #接收键盘输入,并赋予变量file
        read -p "Please input a filename: " file

        #判断file变量是否为空
        if [ -z "$file" ]
          then
            echo "error,请输入文件名"
            exit 1
        #判断file的值是否存在
        elif [ ! -e "$file" ]
          then
            echo " 你的文件不存在"
            exit 2
        #判断file的值是否为普通文件
        elif [ -f "$file" ]
          then
            echo "文件是普通文件"
        #判断file的值是否为目录文件
        elif [ -d "$file" ]
          then
          echo "文件是目录文件"
        else
          echo "文件是其他类型的"  
        fi
- case语句
     case $变量名 in
      "值1")
          如果变量的值等值1,则执行程序1
          ;;
       "值2")
          如果变量的值等值2,则执行程序2
          ;;    
        ……省略其他分支
        *)
           如果变量的值都不是以上的值,则执行程序
           ;;
    esac
- 实践:
    #!/bin/bash
    #测试case语句

    echo "如果想去上班,请输入“1”"
    echo "如果不想上班,请输入“2”"
    echo "如果想居家办公,请输入“3”"

    read -t 30 -p "请输入你的选择:" choose

    case "$choose" in
            "1")
                    echo "想去上班!"
                    ;;
            "2")
                    echo "不想去上班!"
                    ;;
            "3")
                    echo "居家办公!"
                    ;;
            *)
                    echo "只能输入1或者2或者3"
                    ;;
    esac
- for循环

语法一

for 变量 in 值1 值2 值3...
  do
    程序
  done
  • 实践:
#!/bin/bash
#打印1??6的循环
for i in 1 2 3 4 5 6
        do
                echo $i
        done
  • 语法二:
for (( 初始值;循环控制条件;变量变化 ))
  do
    程序
  done
  • 实践:
#!/bin/bash
#使用for循环计算1-100的和
s=0
for (( i=1;i<=100;i=i+1 ))
        do
                s=$(( $s+$i ))
        done
                echo "$s"


#!/bin/bash
#批量添加指定数量的用户

read -t 30 -p "Please input user name:" name
read -t 30 -p "Please input the mumber of users:" num
read -t 30 -p "Please input the password of users:" pass

if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
        then
        y=$(echo $num | sed 's/[0-9]*$'//g)
                if [ -z "$y" ]
                then
                for (( i=1;i<=$num;i=i+1 ))
                 do
                        /usr/sbin/useradd $name$i &>/dev/null
                        echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/null
                 done
                fi
fi

标签:脚本,变量,SH,第十章,笔记,echo,学习,sh,file
From: https://www.cnblogs.com/20211125mjz/p/17726637.html

相关文章

  • 20211316郭佳昊 《信息安全系统设计与实现(上)》第三周学习笔记
    一、任务要求[1]知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题核心是要求GPT:请你以苏格拉底的方式对我进行提问然后GPT就会......
  • 《信息安全系统设计与实现》第三周学习笔记
      一门程序设计语言有哪些必备的要素和技能:语法:掌握该语言的基本语法和规则,包括变量、数据类型、运算符、控制结构等。数据结构:了解该语言中常用的数据结构,如数组、链表、栈、队列、树、图等,以及它们的实现方法和性能分析。算法:了解常见的算法和设计模式,包括排序、搜索、......
  • 信息安全系统设计与实现学习笔记3
    信息安全系统设计与实现学习笔记3一、知识点归纳以及自己最有收获的内容知识点归纳程序设计语言的要素和技能包括语法、语义和语用。这在shell脚本中体现在各类命令中。语言基本成分包括数据成分、运算成分和控制成分。第10章sh编程sh脚本是包含sh语句的文本文件,由sh解释......
  • Nginx第四天学习笔记
    Nginx第四天学习笔记在经过了前几天的学习后,我们对Nginx已经有了一个基本的了解。今天我们将更深入地探讨Nginx的配置和优化。一、配置Nginx的配置文件位于/etc/nginx/nginx.conf。这个文件包含了Nginx服务器的主要配置信息,包括端口、域名、SSL证书等。以下是一个简单的配置示例:per......
  • 学习笔记(3)
    一、任务详情自学教材第10章,提交学习笔记(10分)大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?二、知识点归纳10.1sh脚本sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。sh脚本通......
  • 深度学习入门——卷积神经网络CNN基本原理+实战
    beginning今天给小伙伴们介绍一个高级的分类方法——卷积神经网络CNN,并学习用CNN实现图像的分类。作为深度学习的基础,CNN可太重要了呐,在图像分类、目标检测、目标跟踪、语义分割、实例分割等领域随处可见它的身影。废话不多说啦,如果你也对CNN感兴趣的话,赶紧跟我一起愉快的看下去叭......
  • 第三周Linux教材第十章学习笔记——sh编程
    第十章——sh编程sh脚本1.sh脚本是一种为shell编写的脚本程序。这个程序用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能。第一行必须为#!/bin/sh2.命令行使用chmod+x <filename>编译后才能用./filename来运行。3.......
  • 大学新人小白,学习编程第一步‘’坚持‘’
    当下的各种编程语言盛行,鱼龙混杂,有C++,Python,java。虽然大多数人在初高中时有了解过小猫cat,Python学习等,之所以大学选择C语言或许应该离不开它是”千万家之本“。对于一位未来正打算从事相关行业的小白来说,学之根本尤为重要。学习第一步,”坚持“一堂课的开始一般是枯燥的,因为你并未......
  • 深度学习入门——卷积神经网络CNN基本原理+实战
    beginning今天给小伙伴们介绍一个高级的分类方法——卷积神经网络CNN,并学习用CNN实现图像的分类。作为深度学习的基础,CNN可太重要了呐,在图像分类、目标检测、目标跟踪、语义分割、实例分割等领域随处可见它的身影。废话不多说啦,如果你也对CNN感兴趣的话,赶紧跟我一起愉快的看下去叭......
  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记3
    20211306密码系统设计与实现课程学习笔记3学习任务详情自学教材第10章,提交学习笔记大家学习过Python,C,Java等语言,总结一下一门程序设计语言有哪些必备的要素和技能?这些要素和技能在shell脚本中是如果呈现出来的?知识点归纳以及自己最有收获的内容,选择至少2个知识点利用......