shell脚本编程基础

shell脚本编程基础


一、编程基础

  • 程序
  • 程序:算法+数据结构
  • 数据:是程序的核心
  • 数据结构:数据在计算机中的类型和组织方式
  • 算法:处理数据的方式
  • 程序编程风格:
    • 过程式:以指令为中心,数据服务于指令
    • 对象式:以数据为中心,指令服务于数据
  • 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脚本的用途有:
    • 自动化常用命令
    • 执行系统管理和故障排除
    • 创建简单的应用程序
    • 处理文本或文件

查看linux操作系统支持哪些shell

1
2
3
4
5
6
7
8
9
~]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

五、创建shell脚本

  • 第一步:使用文本编辑器来创建文本文件
    • 第一行必须包括shell声明序列:#!
      • #!/bin/bash
    • 添加注释
      • 注释以#开头
  • 第二步:运行脚本
    • 给予执行权限,在命令行上指定脚本的绝对或相对路径
    • 直接运行解释器,将脚本作为解释器程序的参数运行

六、脚本规范

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

七、脚本调试

  • 检测脚本中的语法错误
    • bash -n /path/to/some_script
  • 调试执行
    • bash -x /path/to/some_script

如何将脚本所在的路径设置为PYTH变量并可以支持运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
查看默认的PATH变量

~]# echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
~]# mkdir /data/bin
~]# cd /data/bin
bin]# vim hellow.sh

#!/bin/bash
echo "hellow word"

添加执行权限

bin]# chmod +x hellow.sh

添加PATH变量

~]# vim /etc/profile.d/shell.sh
PATH=/data/bin:$PATH

生效PATH变量

~]# source /etc/profile.d/shell.sh

运行脚本

bin]# hellow.sh

脚本内是不支持别名的

hash缓存表
~]# hash -d hellow.sh #删除单个文件额缓存
~]# hash -r #清空所有的bash表

脚本执行的方式

1
1: 添加执行权限


八、变量

  • 变量:命名的内存空间
    • 数据存储方式:
    • 字符:
    • 数值:整型,浮点型
  • 变量:变量类型
    • 作用:
      • 1、数据存储格式
      • 2、参与的运算
      • 3、表示的数据范围
  • 类型:
    • 字符
    • 数值:整型、浮点型

  • 强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。一般定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误
    • 如:java , c# ,python
    • 如:print(‘daizhe’+ 10) 提示出错,不会自动转换类型
      • print(‘daizhe’+str(10)) 结果为daizhe10,需要显示转换类型
  • 弱类型(shell脚本):语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
    • 如:bash 不支持浮点数,php,javascript
  • 变量命名法则:
    • 1、不能使程序中的保留字:例如if, for
    • 2、只能使用数字、字母及下划线,且不能以数字开头
    • 3、见名知义
    • 4、统一命名规则:驼峰命名法

变量的定义个显示

1
2
3
4
5
6
7
8
9
10
11
12
13
定义变量

~]# name=daizhe
~]# student_num=99

调用单个变量

~]# echo "this is $name"

调用两个变量

~]# echo "this is ${name}$student_num"
this is daizhe99

定义变量的值为一句话

1
2
3
~]# context='hellow my name is daizhe'
~]# echo $context
hellow my name is daizhe

定义变量的值为一个命令

1
2
3
4
~]# hellow=`cat /etc/issue`
~]# echo "$hellow"
\S
Kernel \r on an \m

定义变量的值为命令并执行

1
2
3
4
5
~]# cmd=hostname
~]# echo $cmd
hostname
~]# $cmd
centos7.com

变量引用

1
2


九、bash中变量的种类

  • 根据变量的生效范围等标准划分下面变量类型:
    • 局部变量:生效范围为当前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

只读和位置变量

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

退出状态

  • 进程使用退出状态来报告成功或失败
    • 0 代表成功,1-255代表失败
    • $? 变量保存最近的命令退出状态
  • 例如:
    • ping -c1 -W1 hostdown &> /dev/null
    • echo $?

退出状态码

  • bash自定义退出状态码
    • exit [n]:自定义退出状态码
    • 注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
    • 注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

十、算术运算

  • bash中的算术运算:help let
    • +, -, *, /, %取模(取余), **(乘方)
    • 实现算术运算:
      • (1) let var=算术表达式
      • (2) var=$[算术表达式]
      • (3) var=$((算术表达式))
      • (4) var=$(expr arg1 arg2 arg3 …)
      • (5) declare –i var = 数值
      • (6) echo ‘算术表达式’ | bc
  • 乘法符号有些场景中需要转义,如*
  • bash有内建的随机数生成器:$RANDOM(0-32767)
    • echo $[$RANDOM%50] :0-49之间随机数

十一、赋值

  • 增强型赋值:
    • +=, -=, *=, /=, %=
  • let varOPERvalue
    • 例如:let count+=3
      • 自加3后自赋值
  • 自增,自减:
    • let var+=1
    • let var++
    • let var-=1
    • let var
-------------------码字不易尊重原创转载标注不胜感激-------------------
Yes or no?
0%