Shell脚本概述
Shell脚本是利用shell的功能所写的一个程序。这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能( . sh后缀)
第一个Shell脚本文件
执行方式
bash test.sh
source test.sh
./test.sh
脚本变量
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
变量可以通过变量名访问。在指令式语言中,变量通常是可变的
变量的作用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
变量命名要求
命名规则
1、区分大小写
2、不能使用程序内保留字和内置变量。如:for 、if
3、只能使用数字、字母及下划线,切不能数字开头
4、使用英文尽量使词义通俗易懂。
变量的分类
自定义变量:有用户自己定义、修改和使用
特殊变量:1、环境变量:用于系统维护,用于设置工作环境
2、只读变量:用于变量值不允许被修改的情况
3、位置变量:通过命令行给脚本程序传递参数
4、预定义变量:bash中内置的一类变量,不能直接修改
用户自定义变量
在shell编程中通常用全大写变量,方便识别
COUNT=1
变量调用:在变量前面加$
echo $COUNT
取消赋值
unset COUNT
用户自定义变量----取值
双引号:允许通过$符号引用其他变量值
弱引用,其中的变量引用会被替换为变量值
单引号:禁止引用其他变量值,$视为普通字符
强引用,其中的变量引用不会被替换为变量值,而保持源字符串
反撇号(esc下面键~):命令替换,提取命令执行后的输出结果,``和$(…)作用相同
用户自定义---数组
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这个数组
只读变量 readonly
变量值不允许修改(重新赋值)的情况
无法使用unset删除
最快方法重启
位置变量和预定义变量
$0 与键入的命令行一样,包含脚本文件名
$1,$2,……$9 ${10} 分别包含第一个到第十个命令行参数
$# 包含命令行参数的个数
$@ 包含所有命令行参数:“$1,$2,……$9”
$* 包含所有命令行参数,是一个整体:“$1,$2,……$9”
$? 包含前一个命令的退出状态
$$ 包含正在执行进程的ID号
环境变量
常用环境变量
$USER表示用户名称
$HOME表示用户的宿主目录
$LANG表示语言和字符集
$PWD表示当前所在工作目录
$PATH表示可执行用户程序的默认路径
export可以将变量指定为全局变量
Shell程序
Shell 程序由零或多条shell语句构成。shell语句包括三类:
说明性语句
功能性语句
结构性语句。
说明性语句(注释行)
以#号开始到该行结束,不被解释执行
功能性语句(命令)
read从标准输入读入一行,并赋值给后面的变量,其语法为:
read var
把读入的数据全部赋给var
read var1 var2 var3
把读入行中的第一个单词(word)赋给var1,第二个单词赋给var2,……把其余所有的词赋给最后一个变量.
如果执行read语句时标准输入无数据,则程序在此停留等侯,直到数据的到来或被终止运行。
read -p +提示语 : 指定输入提示字符串
read -t +限制时间 : 指定输入时间
例 : read -t 3 -p "please " val1 val2 :3秒内输入
read -s :输入不显示
算术运算命令expr
主要用于进行简单的整数运算,包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。例如:
$ expr12 + 5 \* 3
27
$ expr 3 - 8 / 2
-1
$ num=9
$ sum=`expr $num \* 6
`$ echo $sum
54
test语句
可测试三种对象:字符串 整数 文件属性
每种测试对象都有若干测试操作符
字符串测试
s1 = s2 测试两个字符串的内容是否完全一样
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1字符串的长度是否为0
-n s1 测试s1字符串的长度是否不为0
整数测试
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
文件测试
-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更旧
结构性语句
主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。
主要包括:
•条件测试语句(两路分支)•多路分支语句•循环语句•循环控制语句等