zoukankan      html  css  js  c++  java
  • 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梦里后面的数字
    • 注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一跳命令的状态码
  • 相关阅读:
    CF763C Timofey and Remoduling
    CF762E Radio Stations
    CF762D Maximum Path
    CF763B Timofey and Rectangles
    URAL1696 Salary for Robots
    uva10884 Persephone
    LA4273 Post Offices
    SCU3037 Painting the Balls
    poj3375 Network Connection
    Golang zip压缩文件读写操作
  • 原文地址:https://www.cnblogs.com/kjalbert/p/11635833.html
Copyright © 2011-2022 走看看