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
编程逻辑处理方式
顺序执行
选择执行
循环执行
编程基本结构
shell编程:过程式、解释执行
- 编程语言的基本结构:
- 各种系统命令的组合
- 数据存储:变量、数组
- 表达式:a + b
- 语句:if
shell脚本基础
shell脚本:
- 包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行shebang机制
- #!/bin/bash
- #!/usr/bin/python
- #!/usr/bin/perl
shell脚本的用途有:
- 自动化常用命令
- 执行系统管理和故障排除
- 创建简单的应用程序
- 处理文本或文件
创建shell脚本
第一步:使用文本编辑器来创建文本文件
- 第一行必须包括shell声明序列:#!
- 示例:#!/bin/bash
- 添加注释
- 注释以#开头
第二步:运行脚本
- 给予执行权限,在命令行上指定脚本的绝对或相对路径
- 直接运行解释器,将脚本作为解释器程序的参数运行
脚本规范
脚本代码开头约定
- 第一行一般为调用使用的语言
- 程序名,避免更改文件名为无法找到正确的文件
- 版本号
- 更改后的时间
- 作者相关信息
- 该程序的作用,及注意事项
- 最后是各版本的更新简要说明
脚本的基本结构
脚本的基本结构
#!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 可以显示一步一步的效果
变量
变量:命名的内存空间
变量:变量类型
- 作用:
- 数据存储方式
- 参与的运算
- 表示的数据范围
- 类型:
- 字符
- 数值:整型、浮点型
静态编译语言:使用变量前,先声明变量类型,之后类型不能改变,在编译时检查,如:java,c
动态编译语言:不用事先声明,可随时改变类型,如:bash,Python
强类型语言:不同类型数据操作,必须经过强制转换才同一类型才能运算,如java , c# ,python
- 如:以下python代码
print('magedu'+ 10) #提示出错,不会自动转换类型
print('magedu'+str(10)) #结果为magedu10,需要显示转换类型
弱类型语言:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
- 如:bash 不支持浮点数,php,javascript
Shell中变量命名法则
- 不能使程序中的保留字:如:if, for
- 只能使用数字、字母及下划线,且不能以数字开头
- 见名知义
- 统一命名规则:驼峰命名法
Shell中命名建议规则:
- 变量名大写
- 局部变量小写
- 函数名小写
- 用英文名字,并体现出实际作用
变量种类
根据变量的生效范围等标准划分下面变量类型
- 局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
- 环境变量:生效范围为当前shell进程及其子进程
- 本地变量:生效范围为当前shell进程中某代码片断,通常指函数
- 位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
- 特殊变量:$?, $0, $*, $@, $#,$$
局部变量
变量赋值:name='value'
可以使用引用value
- 可以是直接字串:name='root'
- 变量引用:name="$USER"
- 命令引用: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
- HOSTNAME
- HISTSIZE
- _ 下划线
引用变脸时需要紧跟数字时,用花括号把变量括起来就好了
echo $BASHPID 显示当前进程pid
环境变量:export 改动之后,不改变父进程的变量,再创建紫禁城就编程新的了
不完全切换,环境变量不切换
$_ 上一个命令的最后一个单词
只读变量和位置变量
只读变量:只能声明,但不能修改和删除
- 声明只读变量:
- readonly name
- declare -r name
- 查看只读变量:
- readonly -p
位置变量:在脚本代码中调用通过命令行传递给脚本的参数
- readonly -p
- $1, $2, ... 对应第1、第2等参数,shift [n]换位置
- $0 命令本身
- $* 传递给脚本的所有参数,全部参数合为一个字符串
- $@ 传递给脚本的所有参数,每个参数为独立字符串
- $# 传递给脚本的参数的个数
注意:$@ $* 只在被双引号包起来的时候才会有差异
set -- 清空所有位置变量
退出状态
进程使用退出状态来报告成功或失败
- 0 代表成功,1-255代表失败
- $? 变量保存最近的命令退出状态
bash自定义退出状态码
- exit [n]:自定义状态码,n表示数字
- 注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit梦里后面的数字
- 注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一跳命令的状态码
6-2 shell编程基础的更多相关文章
- 【转】Shell编程基础篇-下
[转]Shell编程基础篇-下 1.1 条件表达式 1.1.1 文件判断 常用文件测试操作符 常用文件测试操作符 说明 -d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立 ...
- 【转】Shell编程基础篇-上
[转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...
- shell编程基础(转载)
Shell编程基础 原作者 Leal:请参阅页面底部的编者列表. 授权许可: 创作共享署名协议 GNU 自由文档许可证 注意:本文仍然在持续的修订之中,且错漏之处可能较多.如果能够阅读英语的话,可以考 ...
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!
http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...
- Linux学习之二十一-shell编程基础
Shell编程基础 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言.Shell 是指一种应用程序,这个应用程序提供了一个 ...
- 7-1 shell编程基础之二
shell编程基础之二 算数运算 bash中的算术运算:help let +, -, *, /, %取模(取余), **(乘方),乘法符号有些场景中需要转义 实现算术运算: (1) let var=算 ...
- shell编程基础进阶
为什么学习shell编程 shell脚本语言是实现linux/unix 系统管理机自动化运维所必备的重要工具,linux/unix系统的底层及基础应用软件的核心大部分涉及shell脚本的内容.每一个合 ...
- 基于Linux系统的Shell编程-基础篇
1. Shell基础介绍 1.1 Shell编程的意义 为什么使用shell编程 节约时间 1.2 显示脚本执行过程 前面有+表示执行过的命令的 前面没有东西,表示输出到屏幕上的内容. [root@C ...
- Shell 编程基础之变量和环境变量
一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...
随机推荐
- 微服务框架SpringCloud与Dubbo
#v1.0.0# 1.背景 Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点.阿里巴巴近几年对开源社区的贡献不论在国内还是国外都是引人注目的,比如:JStorm捐赠给 ...
- JS 给数字加三位一逗号间隔的方法
1.方法 function format_number(n) { var b = parseInt(n).toString(); var len = b.length; ) { return b; } ...
- 【Springboot】Springboot整合Ehcache
刚刚项目上线了,记录下使用的技术...... EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. Ehcache的特点 ( ...
- 51 Nod 1072 威佐夫游戏
https://baike.baidu.com/item/%E5%A8%81%E4%BD%90%E5%A4%AB%E5%8D%9A%E5%BC%88/19858256?fr=aladdin&f ...
- 排序学习(learning to rank)中的ranknet pytorch简单实现
一.理论部分 理论部分网上有许多,自己也简单的整理了一份,这几天会贴在这里,先把代码贴出,后续会优化一些写法,这里将训练数据写成dataset,dataloader样式. 排序学习所需的训练样本格式如 ...
- 笔记本在安装Windows+Linux双系统后,进入Windows时花屏的解决办法
问题:在笔记本安装双系统(Windows7+Ubuntu14.04)[先安装Windows,后安装Ubuntu]后,进入Windows时出现了花屏. 问题原因:笔记本只有集显,在系统启动时会先加载Ub ...
- HDU 5831 Rikka with Parenthesis II ——(括号匹配问题)
用一个temp变量,每次出现左括号,+1,右括号,-1:用ans来记录出现的最小的值,很显然最终temp不等于0或者ans比-2小都是不可以的.-2是可以的,因为:“))((”可以把最左边的和最右边的 ...
- TCP主动打开 之 第三次握手-发送ACK
假定客户端执行主动打开,并且已经收到服务器发送的第二次握手包SYN+ACK,在经过一系列处理之后,客户端发送第三次握手包ACK到服务器:其流程比较简单,主要是分配skb,初始化ack包并发送:需要注意 ...
- CSS标签详解
CSS3标签 Css3概述 从2010年开始,HTML5与CSS3就一直是互联网技术中最受关注的两个话题.从前端技术的角度可以把互联网的发展分为三个阶段:第一阶段是web1.0以内容为主的网络,前端主 ...
- Windows下设置U盘自动复制文件到本地
一.打开记事本,把下面的代码复制进去 set fso=createobject("scripting.filesystemobject") set ws=createobject( ...