• 6-2 shell编程基础


    shell编程基础

    编程基础

    Linus:Talk is cheap, show me the code

    程序和编程风格

    程序:

    • 程序:算法+数据结构
    • 数据:是程序的核心
    • 算法:处理数据的方式
    • 数据结构:数据在计算机中的类型和组织方式

    程序编程风格:

    • 过程式:以指令为中心,数据服务于指令
    • 对象式:以数据为中心,指令服务于数据

    shell程序:提供了编程能力,解释执行

    程序的执行方式

    计算机:运行二进制指令
    编程语言:人与计算机之间交互的语言
    低级编程语言:

    • 机器:二进制的0和1的序列,称为机器指令。与自然语言差异太大,难懂、难写
    • 汇编:用一些助记符号替代机器指令,称为汇编语言,如:
      • ADD A,B 将寄存器A的数与寄存器B的数相加得到的数放到寄存器A中
      • 汇编语言写好的程序需要汇编程序转换成机器指令
      • 汇编语言稍微好理解,即机器指令对应的助记符,助记符更接近自然语言
        高级编程语言:
    • 编译:高级语言-->编译器-->机器代码-->执行:C,C++
    • 解释:高级语言-->执行-->解释器-->机器代码:shell,python,php,JavaScript,perl

    编程逻辑处理方式

    顺序执行
    选择执行
    1
    循环执行
    2

    编程基本结构

    shell编程:过程式、解释执行

    • 编程语言的基本结构:
      • 各种系统命令的组合
      • 数据存储:变量、数组
      • 表达式:a + b
      • 语句:if

    shell脚本基础

    shell脚本:

    • 包含一些命令或声明,并符合一定格式的文本文件

    格式要求:首行shebang机制

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

    shell脚本的用途有:

    • 自动化常用命令
    • 执行系统管理和故障排除
    • 创建简单的应用程序
    • 处理文本或文件

    创建shell脚本

    第一步:使用文本编辑器来创建文本文件

    • 第一行必须包括shell声明序列:#!
      • 示例:#!/bin/bash
    • 添加注释
      • 注释以#开头

    第二步:运行脚本

    • 给予执行权限,在命令行上指定脚本的绝对或相对路径
    • 直接运行解释器,将脚本作为解释器程序的参数运行

    脚本规范

    脚本代码开头约定

    1. 第一行一般为调用使用的语言
    2. 程序名,避免更改文件名为无法找到正确的文件
    3. 版本号
    4. 更改后的时间
    5. 作者相关信息
    6. 该程序的作用,及注意事项
    7. 最后是各版本的更新简要说明

    脚本的基本结构

    脚本的基本结构
    #!SHEBANG
    CONFIGURATION_VARIABLES
    FUNCTION_DEFINITIONS
    MAIN_CODE

    shell脚本示例

    #!/bin/bash
    # ------------------------------------------
    # Filename:                     hello.sh
    # Revision:                     1.0
    # Date:                         2019/10/08
    # Author:                       kjAlbert
    # Description:                  This is the script
    # Copyright:                    2019 kjAlbert
    # License:                      GPL
    # ------------------------------------------
    echo “hello world”
    

    脚本调试

    如果命令错误,报个错继续执行,语法错误会导致后续命令不再执行
    bash -n FILE 可以检查语法错误,但也只能检查语法错误
    bash -x FILE 可以显示一步一步的效果

    变量

    变量:命名的内存空间
    变量:变量类型

    • 作用:
      1. 数据存储方式
      2. 参与的运算
      3. 表示的数据范围
    • 类型:
      • 字符
      • 数值:整型、浮点型

    静态编译语言:使用变量前,先声明变量类型,之后类型不能改变,在编译时检查,如:java,c
    动态编译语言:不用事先声明,可随时改变类型,如:bash,Python
    强类型语言:不同类型数据操作,必须经过强制转换才同一类型才能运算,如java , c# ,python

    • 如:以下python代码
    print('magedu'+ 10)         #提示出错,不会自动转换类型
    print('magedu'+str(10))     #结果为magedu10,需要显示转换类型
    

    弱类型语言:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用

    • 如:bash 不支持浮点数,php,javascript

    3

    Shell中变量命名法则

    1. 不能使程序中的保留字:如:if, for
    2. 只能使用数字、字母及下划线,且不能以数字开头
    3. 见名知义
    4. 统一命名规则:驼峰命名法

    Shell中命名建议规则:

    1. 变量名大写
    2. 局部变量小写
    3. 函数名小写
    4. 用英文名字,并体现出实际作用

    变量种类

    根据变量的生效范围等标准划分下面变量类型

    • 局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
    • 环境变量:生效范围为当前shell进程及其子进程
    • 本地变量:生效范围为当前shell进程中某代码片断,通常指函数
    • 位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
    • 特殊变量:$?, $0, $*, $@, $#,$$

    局部变量

    变量赋值:name='value'
    可以使用引用value

    1. 可以是直接字串:name='root'
    2. 变量引用:name="$USER"
    3. 命令引用:name=COMMAND;name=$(COMMAND)

    变量引用:${name} 或者 $name

    • " " 弱引用,其中的变量引用会被替换为变量值
    • ' ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串

    显示已定义的所有变量:set
    删除变量:unset name

    环境变量

    变量声明、赋值:

    • export name=VALUE
    • declare -x name=VALUE

    变量引用:

    • $name, ${name}

    显示所有环境变量:

    • env
    • printenv
    • export
    • declare -x

    删除变量:

    • unset name

    bash内建的环境变量

    • PATH
    • SHELL
    • USER
    • UID
    • HOME
    • PWD
    • SHLVL
    • LANG
    • MAIL
    • HOSTNAME
    • HISTSIZE
    • _ 下划线

    引用变脸时需要紧跟数字时,用花括号把变量括起来就好了
    echo $BASHPID 显示当前进程pid

    环境变量:export 改动之后,不改变父进程的变量,再创建紫禁城就编程新的了
    不完全切换,环境变量不切换
    $_ 上一个命令的最后一个单词

    只读变量和位置变量

    只读变量:只能声明,但不能修改和删除

    • 声明只读变量:
      • readonly name
      • declare -r name
    • 查看只读变量:
      • readonly -p
        位置变量:在脚本代码中调用通过命令行传递给脚本的参数
    • $1, $2, ... 对应第1、第2等参数,shift [n]换位置
    • $0 命令本身
    • $* 传递给脚本的所有参数,全部参数合为一个字符串
    • $@ 传递给脚本的所有参数,每个参数为独立字符串
    • $# 传递给脚本的参数的个数
      注意:$@ $* 只在被双引号包起来的时候才会有差异
      set -- 清空所有位置变量

    退出状态

    进程使用退出状态来报告成功或失败

    • 0 代表成功,1-255代表失败
    • $? 变量保存最近的命令退出状态

    bash自定义退出状态码

    • exit [n]:自定义状态码,n表示数字
    • 注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit梦里后面的数字
    • 注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一跳命令的状态码
  • 相关阅读:
    leetcode74
    leetcode59
    leetcode1283
    0079. Word Search (M)
    0067. Add Binary (E)
    0203. Remove Linked List Elements (E)
    用async 解放你的大脑
    Python 类属性和方法
    Python 类装饰器
    Python 装饰器
  • 原文地址:https://www.cnblogs.com/kjalbert/p/11635833.html
Copyright © 2020-2023  润新知