第一章 入门

第一章 入门

为什么要学习 Shell 编程

    1. Linux 运维工程师在进行服务器集群管理时,需要编写 Shell 程序来进行服务器管理。
  • 2)对于 JavaEE 和 Python 程序员来说,工作的需要,你的老大会要求你编写一些 Shell 脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
  • 3)对于大数据程序员来说,需要编写 Shell 程序来管理集群。

功能

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

入门

  • 脚本格式要求

      1. 脚本以#!/bin/bash 开头
      1. 脚本需要有可执行权限
      1. 脚本后缀名不要求是.sh​结尾,可以是.txt​,.png​,甚至是没有后缀名
  • 创建并编写脚本输出helloworld

      1. vim myshell.sh
    • 2. 编写脚本

      1. 执行脚本
      • 第一种方式

        • 1. 默认情况下,我们创建的脚本都不具有可执行权限
        • 2. 我们需要手动提升至可执行权限
        • 3. 通过绝对/相对路径直接执行
      • 第二种方式(不推荐)

        • 1. 即使没有可执行权限,我们也可知执行该脚本,但是不推荐
        • 2. 尝试执行
        • 3. 使用
      1. 后台执行脚本
      • 使用
    • nohup 和 & 的区别

  • shell 变量

    • Linux Shell 中的变量分为

      • 系统变量: $HOME、$PWD、$SHELL、$USER 等等(使用
        set​查看所有系统变量)

      • 用户自定义变量

        • 1)定义变量:变量名=值

          • 如果值是数字就不用双引号,如果值是字符串,双引号可用可不用
        • 2)撤销变量:unset 变量名

          1. 使用变量:$变量名
          1. 声明静态变量:readonly 变量名=值,注意:静态变量不能 unset,如果 unset 静态变量会报错
        • 案例

          • 代码
          • 结果
      • 环境变量

        • 声明环境变量的步骤

          • 1. 在
          • 2. 执行
          • 3.  在终端中直接查看环境变量的值
          • 4. 在脚本中直接使用改环境变量
    • 定义变量的规则

        1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
        1. 等号两侧不能有空格
        1. 变量名称一般习惯为大写:TOMCAT_HOME
    • 将命令的返回值赋给变量(重点)

      • 对于普通的字面量,我们可以直接通过variable=3​来赋值,如果想把 variable 的值赋值为执行命令的结果或者运算式的结果该怎么办吗?
      • 1)	A=
      • 2) A=$(ls -la) 等价于反引号
  • 多行注释

  • 位置参数变量

    • 概念

      • 当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如 : ./myshell.sh 100 200​ , 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息
    • 分类

      • undefined 代表命令本身,undefined 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
      • $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
      • $@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
      • $#(功能描述:这个变量代表命令行中所有参数的个数)
      • 举例
  • 预定义变量

    • 概念

      • 就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
    • 分类

      • $$(功能描述:当前进程的进程号(PID))$$
      • $! (功能描述:后台运行的最后一个进程的进程号(PID))
      • $? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了
      • 案例
  • 运算符

    • 概念

      • 在 shell 中进行各种运算操作
    • 语法

      • $((运算式))

      • ⭐️ 推荐⭐️$[运算式]

      • expr

        • expr m + n​:注意 expr 运算符间要有空格

        • /

        • %

          • 取余
      • 案例

  • 条件判断

    • 若条件成立则返回数字0(true),否则便返回其他随机数值(false)

    • 条件判断分类

      • 文件测试语句;

        • -d 测试文件是否为目录类型

          • 如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在:
        • -e 测试文件或者目录是否存在

          • 目录就是一种特殊的文件
        • -f 判断是否为一般文件

          • 如果返回值为0,则代表文件存在,且为一般文件
        • -r 测试当前用户是否有权限读取

        • -w 测试当前用户是否有权限写入

        • -x 测试当前用户是否有权限执行

      • 逻辑测试语句;

        • 与:&&

          • 表示它表示当前面的命令执行成功后才会执行它后面的命令,因为如果前面的命令执行失败,整个表达式就是错误的,所有有点类似java中短路运算

          • [ -e /dev/cdrom ] && echo "Exist"

            • 因此可以用来判断/dev/cdrom文件是否存在,若存在则输出Exist字样。
        • 或:||

          • 表示当前面的命令执行失败后才会执行它后面的命令,因为如果起那面命令执行成果,整个表达式就是成功,所以后面的不需要执行,也是短路运算
        • 非:!

        • 上述三个逻辑符号都要与后面的语句有空格

      • 整数值比较语句;

        • 因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突,所以要用别的字符代替
        • eq 是否等于equal
        • -ne 是否不等于not equal
        • -gt 是否大于grate than
        • -lt 是否小于less than
        • -le 是否等于或小于less equal
        • -ge 是否大于或等于grate equal
      • 字符串比较语句。

        • 用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值)
        • = 比较字符串内容是否相同
        • != 比较字符串内容是否不同
        • -z 判断字符串内容是否为空
      • 案例

    • 流程控制

      • 分支

        • if 分支:既可以判断范围,也可以判断值

          • 第一种写法(推荐)
          • 第二种写法
        • case 分支:只能判断值

      • 循环

        • for 循环

          • 语法格式1

            • 案例
          • 语法格式2

            • 案例
        • while 循环

          • 语法格式

            • 案例
  • read 读取控制台输入

    • 引入

      • 我们可以在启动脚本的时候读取用户的参数,但是无法在脚本运行的过程中读取用户的输入
    • 格式

      • read 选项 参数

        • 选项

          • -p:指定读取值时的提示符;
          • -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了
        • 参数

          • 把用户输入的数据赋值给参数处的变量
    • 案例

  • 函数

    • 系统函数

      • basename

        • 语法:basename [pathname] [suffix]
        • 功能:返回完整路径最后 / 的部分,常用于获取文件名
        • 案例
      • dirname

        • 语法:dirname [pathname]
        • 功能:从给定的包含绝对/相对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
        • 案例
    • 自定义函数

      • 格式
      • 案例
posted @ 2025-03-11 22:57  红豆绿豆abc  阅读(15)  评论(0)    收藏  举报