本章目录:
一.编程基础
二.脚本基本格式
三.变量
四.运算
五.条件测试
六.配置用户环境
一.编程基础
1.程序:
1)程序:指令+数据
2)程序编程风格:
(1)过程式:以指令为中心,数据服务于指令
(2)对象式:以数据为中心,指令服务于数据
(1)过程式:以指令为中心,数据服务于指令
(2)对象式:以数据为中心,指令服务于数据
3)程序的执行方式:
(1)计算机:运行二进制指令,无法查看
(2)编程语言:
a.低级:越接近于数字0和1,越接近于计算机能够读懂的语言,是低级语言
(2)编程语言:
a.低级:越接近于数字0和1,越接近于计算机能够读懂的语言,是低级语言
例如:汇编
b.高级:越接近于人类能够读懂的语言,是高级语言
a)编译型语言:
b.高级:越接近于人类能够读懂的语言,是高级语言
a)编译型语言:
(a)高级语言源代码------------->二进制文件------------->目标程序
编译器编译 使用者执行
编译器编译 使用者执行
(b)由于使用者只是执行二进制文件,不需要源代码,也不需要编译器编译,所以执行效率高
(c)执行之前需要编译,有时编译所需要的时间比较长
(d)可以对版权进行保护
(e)例如:java,C#
b)解释型语言:
(a)高级语言程序------------->二进制文件-------------->目标程序
解释器解释----------------计算机执行
解释器解释----------------计算机执行
同时进行
(b)即时性较强,即写即执行
(c)执行效率没有编译型语言高
(d)不同语言的解释器不同
(e)例如:shell, perl, python
4)Shell程序:提供了编程能力,解释执行
2.Shell编程的基本概念
1)Shell编程的逻辑处理方式
(1)顺序执行
(2)循环执行
(3)选择执行
2)Shell编程:过程式、解释执行
3)Shell编程语言的基本结构:
(1)各种系统命令的组合
(2)数据存储:变量、数组
(3)表达式:a + b
(4)语句:循环语句,判断语句
3)Shell编程语言的基本结构:
(1)各种系统命令的组合
(2)数据存储:变量、数组
(3)表达式:a + b
(4)语句:循环语句,判断语句
二.脚本基本格式
1.Shell脚本:包含一些命令或声明,并符合一定格式的文本文件
2.Shell脚本的首行:
1)首行格式:
(1)shebang机制和shell的解释器
(2)因为脚本的实质是文本文件,不能执行;所以必须需要调用解释器将其解释为二进制文件,才可以执行
(3)每一种解释型语言都有特定的解释器
bash shell的解释器:#!/bin/bash
(4)其他语言的解释器:
perl:/bin/perl
python:/bin/python
2)在执行脚本的时候不调用解释器,只使用脚本的绝对或相对路径执行,那么系统会到脚本的首行shebang中搜索解释器,找 到时调用这个解释器去执行这个脚本;
如果没有找到,会调用当前的默认shell去运行;
例:./文件
3)如果执行脚本的时候直接调用解释器,加上脚本的绝对或相对路径去执行,那么不需要在脚本的首行使用shebang机制和 shell的解释器(不常用),不便移植 例:/bin/bash 文件
4)执行一个脚本:./文件a=/bin/bash 文件
所以脚本的首行可以不是/bin/bash(不常用)
例:写一个delete.sh的脚本,首行为#!/bin/rm -rf ,删除功能,并在第二行准备输出"hello world"
当执行这个脚本时候,这个脚本自身被删除了,hello world 并不会输出
3.创建shell脚本
1)第一步:使用文本编辑器来创建文本文件
(1)第一行必须包括shell声明序列:#!
例:#!/bin/bash
(2)添加注释:注释以#开头
2)第二步:运行脚本
(1)如果执行脚本的时候不调用解释器,只使用脚本的绝对或相对路径去执行,需要靠脚本的"shebang"部分提供解释器,那么
(1)第一行必须包括shell声明序列:#!
例:#!/bin/bash
(2)添加注释:注释以#开头
2)第二步:运行脚本
(1)如果执行脚本的时候不调用解释器,只使用脚本的绝对或相对路径去执行,需要靠脚本的"shebang"部分提供解释器,那么
必须给予脚本执行权限
(2)如果执行脚本的时候直接运行解释器,将脚本作为解释器程序的参数运行,脚本只是提供数据的文件,那么不需要给予脚本 执行权限
4.脚本代码开头注释信息的规范
1)第一行一般为调用使用的语言
2)程序名,避免更改文件名为无法找到正确的文件
3)版本号
4)更改后的时间
5)作者相关信息
6)该程序的作用,及注意事项
7)最后是各版本的更新简要说明
2)程序名,避免更改文件名为无法找到正确的文件
3)版本号
4)更改后的时间
5)作者相关信息
6)该程序的作用,及注意事项
7)最后是各版本的更新简要说明
5.脚本调试
1)检测脚本中的语法错误
bash -n 文件的绝对路径/文件的相对路径
bash -n 文件的绝对路径/文件的相对路径
例:创建一个有语法错误的test.sh的脚本
执行之后会显示出语法错误
2)调试执行
bash -x 文件的绝对路径/文件的相对路径
bash -x 文件的绝对路径/文件的相对路径
例:创建一个又可以正确执行部分,有语法错误部分的脚本test1.sh
执行之后会在脚本执行成功的代码之前添加一个"+",并将成功执行的输出内容显示出来,错误的部分会提示语法错误
三.变量
1.变量:命名的内存空间
1)数据存储方式:
(1)字符:(可以是路径)
(2)数值:整型,浮点型
2) 作用:(1)数据存储格式 (2)参与的运算(3)表示的数据范围
2.变量的类型:
1)数据存储方式:
(1)字符:(可以是路径)
(2)数值:整型,浮点型
2) 作用:(1)数据存储格式 (2)参与的运算(3)表示的数据范围
2.变量的类型:
(1)强类型:
a.变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。
b.一般定义变量时必须指定类型
c.参与运算必须符合类型要求
d.用未声明变量会产生错误
e.如 java,c#
(2)弱类型:
e.如 java,c#
(2)弱类型:
a.语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;
b.参与运算会自动进行隐式类型转换;
c.变量无须事先定义可直接调用
d.如bash(不支持浮点数),php
c.变量无须事先定义可直接调用
d.如bash(不支持浮点数),php
3.变量的命名法则
1)不能使程序中的保留字:例如if,for
2)只能使用数字、字母及下划线,且不能以数字开头
3)见名知义
4)统一命名规则:驼峰命名法;例如:UserName
4.变量的种类
1)根据变量的生效范围等标准分为:
(1)本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
(2)环境变量:生效范围为当前shell进程及其子进程
(3)局部变量:生效范围为当前shell进程中某代码片断(通常指函数)
(4)位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
(5)特殊变量:$?, $0, $*, $@, $#,$$
(1)本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
(2)环境变量:生效范围为当前shell进程及其子进程
(3)局部变量:生效范围为当前shell进程中某代码片断(通常指函数)
(4)位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
(5)特殊变量:$?, $0, $*, $@, $#,$$
2)本地变量
(1)变量赋值:(例如变量名为"name")
a. 可以是直接字串赋值: name=“root"
b.引用其它变量的值赋值:name="$USER"
c.引用命令的执行结果赋值:name=`COMMAND` name=$(COMMAND)
(2)变量的引用:
a. 可以是直接字串赋值: name=“root"
b.引用其它变量的值赋值:name="$USER"
c.引用命令的执行结果赋值:name=`COMMAND` name=$(COMMAND)
(2)变量的引用:
a.${name}:指定变量的范围,
例:如果赋值变量A=123,输出的时候想通过引用变量A输出123456
b.$name:直接引用变量
(3)"":弱引用,双引号其中引用的变量会被替换为变量值
'':强引用,单引号其中的引用的变量不会被替换为变量值,而保持原字符串,即所见即所得
(4)显示已定义的所有变量:set
(5)删除变量:unset name
(3)"":弱引用,双引号其中引用的变量会被替换为变量值
'':强引用,单引号其中的引用的变量不会被替换为变量值,而保持原字符串,即所见即所得
(4)显示已定义的所有变量:set
(5)删除变量:unset name
3)环境变量
(1)变量声明、赋值:
a.export name=VALUE
b.declare -x name=VALUE
a.export name=VALUE
b.declare -x name=VALUE
例:给变量A赋值123,再通过bash进入当前shell的一个子shell,变量失效
通过环境变量赋值,变量A的值仍然存在
(2)变量引用:$name, ${name},与本地变量相同
(3)显示所有环境变量:
env
printenv
export
declare -x
printenv
export
declare -x
(4)删除变量:unset name
(5)bash内建的环境变量:
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
MAIL
HOSTNAME
HISTSIZE
—
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
HOSTNAME
HISTSIZE
—
4)位置变量