1、shell脚本概念
shell编程就是将在命令写在一个文件中,再用shell去执行这个程序,提高效率。shell脚本属于解释性语言,不需要编译直接运行。
(注:Shell脚本对空格十分敏感)
2、编写规范
设立了脚本文件以.sh作为后缀,第一行写上执行shell脚本的shell路径。
如:#!/bin/bash
1)执行
bash shell文件路径 -------- 启动新bash来执行
./shell文件路径------------ 将shell脚本加上可执行权限(777),即可直接 运行
.shell文件路径------------- 使用./source运行shell脚本(本shell)
2)输入/输出
echo------------- 输出
用法: echo 输出内容
-n表示本行最后不换行
“”(双引号)中的$变量名会被替换为变量的值
‘’(单引号)中不会左这的替换
`` (反引号)中的命令会被它执行的结果所替代
read------------- 输入
(将输入的内容输入到变量中,可以写多个变量一次赋值)
用法: read 变量
read -p …(提示信息) 变量名
变量
shell中的变量没有类型,默认使用字符串处理
查看shell中所有变量
declare ----- 变量和函数
set --------- 变量和函数
env --------- 环境变量
语法: 变量名=变量值------- 定义/修改变量
$变量--------------- 获取变量值
shell中的变量分为全局变量和本shell变量
本shell中的变量只能在本shell中使用
全局shell变量可以在子shell中(本shell直接/间接启动的shell)使用
变量默认是本shell变量,可以使用export将变量导出为全局变
变量与$组合使用:
${变量名:-值} --------------- 变量存在取变量的值,变量不存在取后面的值
${变量名:=值} --------------- 变量存在取变量的值,变量不存在定义变量为后面的值
${变量名:+值} -------------- 变量存在取变量的值,变量不存在取空值
${变量名:?值} -------------- 变量存在取变量的值,变量不存在输出错误信息
${#变量名} --------------- 变量的长度
变量名= -------------- 空值变量
以上语法中加:任务空值不是有效值,不加:认为空值是有效值
expr可以用来计算整数的加减法,我们经常用来判断输入的数据是不是整数,返回0或者1表示计算正常,大于1表示错误
expr还可以求出变量从第一位开始某些内容出现的次数
语法:
expr $变量:’[…]’
bc命令可以计算小数,用法:
“算数表达式”|bc
使用 scale=数字 来控制结果显示小数的位数
计算指数需要用^
echo “scale=5;1.1^2”|bc
使用sqrt开平方
echo “scale=5;sqrt(3)”|bc
bc还提供进制转换功能
obase 指定输出的进制,ibase 指定输入的进制
echo “obase=16;ibase=2;10101010”|bc
3)数组使用
直接使用即可,不需要定义,下标也不要求连续
通过
数
组
名
[
下
标
]
来
获
取
数
组
中
元
素
的
值
,
直
接
把
数
组
名
当
变
量
使
用
获
取
的
是
第
一
个
元
素
的
值
可
以
将
变
量
直
接
当
数
组
使
用
,
这
时
变
量
的
值
就
存
放
在
下
标
为
0
的
元
素
中
a
[
∗
]
代
表
整
个
数
组
,
{数组名[下标]} 来获取数组中元素的值,直接把数组名当变量使用获取的是第一个元素的值 可以将变量直接当数组使用,这时变量的值就存放在下标为0的元素中 a[*]代表整个数组,
数组名[下标]来获取数组中元素的值,直接把数组名当变量使用获取的是第一个元素的值可以将变量直接当数组使用,这时变量的值就存放在下标为0的元素中a[∗]代表整个数组,{#数组名[*]}可以获取数组元素个数
read -a 数组名 -------------- 所有输入的数据都存入数组中
4)特殊变量
$# ----- 命令行参数个数,不包括自己
$* ----- 所有命令行参数的内容
$? ----- 获取上一个命令的返回状态(0—正常 非0—出错)
$$ ----- 当前进程进程号
$0 ----- 当前进程名
$n ----- 命令行第n个参数
5)条件表达式
shell中可以使用 [] 或者 test命令 来计算条件表达式
注:中括号和表达式中间必须有空格,表达式的条件和值之间也要有空格
大于: -gt
小于: -lt
等于: -eq
不等于: -ne
大于等于: -ge
小于等于: -le
与: -a
或: -o
非: !
注:表达式中可以有变量,但是必须用变量的值
[] 和 test命令 也可以用来对文件和字符串进行判断
-e:测试一个文件是否存在
-f:测试一个文件是不是普通文件
-d:测试一个文件是不是目录
-r:测试一个文件是否有读权限
-w:测试一个文件是否有写权限
-x:测试一个文件是否有执行权限
-s:测试一个文件是否非空
-z:测试字符串是否为空
-n:测试字符串是否非空
注:在中括号和test中中也可以使用==和!=,别的运算符不能用
在$之后的[]中可以计算整数算数表达式(表达式中可以有变量的参与),**表示计算指数
[[]] ---------- 双中括号用法和[]几乎一样,[[]]内部可以使用运算符&&和||,不能使用 -a -o,可以直接使用变量
(()) ---------- 双小括号内部直接使用运算符号,而且不用空格,内部直接使用变量,不能使用[]中语法
3.逻辑结构、函数
1)if结构
if 命令 / [] / [[]] / (())
then 命令
elif 命令 / [] / [[]] / (())
then 命令
else 命令
fi
2)case结构
case $变量 in
值1)
命令;;
值2)
命令;;
值3)
命令;;
...
*)
....
esac
3)循环结构
(1)for循环-------遍历一组数据
for 变量 in 一组数据
do
......
Done
(2)while循环-----条件成立继续循环,不成立结束循环
while 条件/命令
do
...
Done
(3)until循环------条件不成立继续循环,成立结束循环
until 条件/命令
do
...
done
4)select语法
select 变量 in 一组数据
do
....
done
5)shell中的函数
函数名()
{
...
}
调用函数直接写函数名即可
函数可以有返回值,使用return来指定返回值,在函数调用语句后使用$?获取返回值
调用函数时也可以给函数传数据,直接把要传入的数据写到调用语句之后
:是一个什么都不做的命令,可以把一个表达式变成一条完整的命令
在函数中定义变量默认也是本shell变量,可以在本shell中使用
可以在函数中定义本地变量,这种变量只能在本函数中使用
语法:
local 变量名
全局变量 --------- 本shell和子shell可以访问
本shell变量 ------ 本shell可以访问
本地变量 --------- 本函数可以访问
6)几个命令的补充
sort命令 --------- 对给定的内容(文件)进行排序
uniq命令 --------- 去掉文件中重复的行
seq命令 ---------- 产生给定的序列
seq 起始数字 间隔大小 结束数字
7)正则表达式
正则表达式用于进行字符串匹配
* ---------- 通配符,代表任意多个任意字符
? ---------- 通配符,代表1个任意字符
^xxx -------- 匹配行首
xxx$ -------- 匹配行尾
[] --------- 匹配范围
{} --------- 匹配的次数 {最少,最多},大括号要转义
8)patsubst函数
格式:$(patsubst pattern,replacement,text)
例子:
$(patsubst %.c,%.o,a.c b.c)
将字符串(a.c b.c)符合模式[%.c]的单词替换成[%.o],返回结果为”a.o b.o”