一、shell脚本概述
1、shell脚本概念
Shell 脚本是利用 shell 的功能所写的一个程序。这个程序是使用纯文本文件,将一些 shell 的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能。
2、Shell 脚本编写步骤
第一个 Shell 脚本文件:
- 执行方式
- bash test.sh
- source test.sh
- ./test.sh
二、shell脚本变量
1、变量介绍
- 变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
- 变量可以通过变量名访问。在指令式语言中,变量通常是可变的
2、 变量的作用
用来存放系统和用户需要使用的特定参数(值):
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化而变化
3、变量的命名要求
4、变量的分类
5、用户自定义变量
在 shell 编程中通常使用全大写变量,方便识别
- $ COUNT=1
变量的调用:在变量前加 $
- $ echo $COUNT
Linux Shell/bash 从右向左赋值
- $Y=y
- $ X=$Y
- $ echo $X
- y
使用 unset 命令删除变量的赋值
- $ Z=hello
- $ echo $Z
- hello
- $ unset Z
- $ echo $Z
6、 用户自定义变量
1)用户自定义变量 - 取值
- 双引号 : 允许通过 $ 符号引用其他变量值
- 弱引用,其中的变量引用会被替换为变量值
- 单引号 : 禁止引用其他变量值, $ 视为普通字符
- 强引用,其中的变量引用不会被替换为变量值,而保持源字符串
- 反撇号 : 命令替换,提取命令执行后的输出结果, `` 和 $(...) 作用相同
2)用户自定义变量 - 数组
- echo $a :默认显示数组 a 的第一个元素
- echo ${a[0]} :显示数组中第一个元素,以此类推
- echo ${a[-1]} : 显示数组中最后一个元素
- echo ${a[*]} 和 echo ${a[@]} :显示数组中所有元素
- echo ${#a[@]} :显示数组中元素的个数
- echo ${a[@]: 起始元素 id: 元素个数 ]} :显示数组中以起始元素为首的指定个数的元素(注意:这里起始元素 id 不能为负值
- unset a[n] 删除数组中的第 n 个元素
- unset a 删除 a 这个数组
7、只读变量
- 变量值不允许修改(重新赋值)的情况
- 无法使用 unset 删除
- 最快方法重启
- readonly
8、位置变量和预定义变量
- $0 与键入的命令行一样,包含脚本文件名
- $1,$2,......$9 ${10} 分别包含第一个到第十个命令行参数
- $# 包含命令行参数的个数
- $@ 包含所有命令行参数:“ $1,$2,......$9”
- $* 包含所有命令行参数,是一个整体:“ $1,$2,......$9”
- $? 包含前一个命令的退出状态
- $$ 包含正在执行进程的 ID 号
9、环境变量
常用环境变量
- $USER 表示用户名称
- $HOME 表示用户的宿主目录
- $LANG 表示语言和字符集
- $PWD 表示当前所在工作目录
- $PATH 表示可执行用户程序的默认路径
- export 可以将变量指定为全局变量
三、shell语句
1、shell程序
Shell 程序由零或多条 shell 语句构成。 shell 语句包括三类 :
- 说明性语句
- 功能性语句
- 结构性语句
2、说明性语句(注释行)
以 # 号开始到该行结束,不被解释执行
注释行可以出现在程序中的任何位置 , 既可以单独占用一行 , 也可以接在执行语句的后面 . 以 # 号开始到所在行的行尾部分,都不被解释执行 .
例如 :
#! /bin/sh
#
# 本程序说明
#
command_1
command_2 # command_2 的语句说明
......
# 下面程序段的说明
command_m
......
command_n # command_n 语句的说明
......
3、功能性语句(命令)
1)命令 -read
read 从标准输入读入一行 , 并赋值给后面的变量 , 其语法为 :
read var
把读入的数据全部赋给 var
read var1 var2 var3
- 把读入行中的第一个单词 (word) 赋给 var1, 第二个单词赋给 var2 , ......把其余所有的词赋给最后一个变量 .
- 如果执行 read 语句时标准输入无数据 , 则程序在此停留等侯 , 直到数据的到来或被终止运行。
2)算术运算命令 -expr
算术运算命令 expr 主要用于进行简单的整数运算,包括加 (+) 、减( - )、乘( \*) 、整除
( / )和求模( % )等操作。例如 :
$ expr 12 + 5 \* 3
27
$ expr 3 - 8 / 2
-1
$ num=9
$ sum=`expr $num \* 6 `
$ echo $sum
54
3)命令 -test
- test 语句可测试三种对象 :
- 字符串 整数 文件属性
- 每种测试对象都有若干测试操作符
4)字符串测试
- s1 = s2 测试两个字符串的内容是否完全一样
- s1 != s2 测试两个字符串的内容是否有差异
- -z s1 测试 s1 字符串的长度是否为 0
- -n s1 测试 s1 字符串的长度是否不为 0
5)整数测试
- a -eq b 测试 a 与 b 是否相等
- a -ne b 测试 a 与 b 是否不相等
- a -gt b 测试 a 是否大于 b
- a -ge b 测试 a 是否大于等于 b
- a -lt b 测试 a 是否小于 b
- a -le b 测试 a 是否小于等于 b
6)文件测试
- -e name 测试一个文件是否存在
- -d name 测试 name 是否为一个目录
- -f name 测试 name 是否为普通文件
- -L name 测试 name 是否为符号链接
- -r name 测试 name 文件是否存在且为可读
- -w name 测试 name 文件是否存在且为可写
- -x name 测试 name 文件是否存在且为可执行
- -s name 测试 name 文件是否存在且其长度不为 0
- f1 -nt f2 测试文件 f1 是否比文件 f2 更新
- f1 -ot f2 测试文件 f1 是否比文件 f2 更旧
4、结构性语句
结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。
主要包括:
- 条件测试语句(两路分支)
- 多路分支语句
- 循环语句
- 循环控制语句等