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

编程逻辑处理方式

顺序执行

选择执行



循环执行

编程基本结构

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

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梦里后面的数字
  • 注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一跳命令的状态码

6-2 shell编程基础的更多相关文章

  1. 【转】Shell编程基础篇-下

    [转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...

  2. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  3. shell编程基础(转载)

    Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...

  4. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  5. Linux学习之二十一-shell编程基础

    Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...

  6. 7-1 shell编程基础之二

    shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...

  7. shell编程基础进阶

    为什么学习shell编程 shell脚本语言是实现linux/unix 系统管理机自动化运维所必备的重要工具,linux/unix系统的底层及基础应用软件的核心大部分涉及shell脚本的内容.每一个合 ...

  8. 基于Linux系统的Shell编程-基础篇

    1. Shell基础介绍 1.1 Shell编程的意义 为什么使用shell编程 节约时间 1.2 显示脚本执行过程 前面有+表示执行过的命令的 前面没有东西,表示输出到屏幕上的内容. [root@C ...

  9. Shell 编程基础之变量和环境变量

    一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...

随机推荐

  1. jquery实现静态页面include

    最近在写一套前端页面,发现每个页面都复制一遍公共头.尾,十分不方便.于是就想能否也像PHP模板引擎一样,使用include引入公共文件,这便是接下来这段代码的意义.我们先来总结一下需求: 1.可以像使 ...

  2. Web.xml 定制URL

    直接上xml里的代码: <!--声明有哪些Servlet--> <servlet> <servlet-name>Book</servlet-name> ...

  3. 学习shell(二)

    条件分支:  (条件表达式的中括号里面 空格不可以省略) = ] then echo '2 = 2'; else echo '2 != 2'; fi # 上面的代码不使用缩进, 并不会出错, 但不应该 ...

  4. 阿sa

    # jieba库概述 .jieba是优秀的中文分词第三方库.需要额外安装. pip install jieba # jieba库三种分词模式 精确模式:把文本精确的切分开,不存在冗余单词. 全模式:把 ...

  5. [CSP-S模拟测试]:那一天她里我而去(堆优化Dijkstra)

    题目传送门(内部题3) 输入格式 每个测试点有多组测试数据.第一行有一个正整数T表示数据组数.接下来对于每组数据,第一行有两个正整数n,m分别代表图的点数和边数.接下来有m行,每行三个整数u,v,d表 ...

  6. 「CF442C」 Artem and Array

    题目链接 戳我 \(Solution\) 观察发现如果一个数两边都比他大,删掉他可以保证最优,这个应该是显然的.这个东西用单调栈维护一下,最后剩下的就是个单调递减或单调递增的数列,从小到大排个序取前面 ...

  7. Xargs用法详解(自创)

    简介之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: 这个命令是错误的find /sbin -perm +700 |ls -l ...

  8. c源码编译

    #include<stdio.h> #include<math.h> //程序中要调用求平方根函数sqrt int main() { double a,b,c,disc,x1, ...

  9. 如何使用python将指定文件里的数据读取到字典里

    list_dict_all = [] #创建一个空列表,全局变量,用来存放字典def AddtoDict(str_1): # 定义一个函数,功能:把文件里面的内容添加到字典中 list_str1 = ...

  10. 最简SpringBoot程序制法

    JDK:1.8.0_212 IDE:STS4(Spring Tool Suit4 Version: 4.3.2.RELEASE) 工程下载:https://files.cnblogs.com/file ...