一.shell编程
1.概念
shell就是一个命令行的程序,用操作系统和用户的交互
csh -------- >rsh -------->bash
shell可以用来执行用户输入的命令
shell编程就是将在命令行执行的命令写到一个文件中,再使用shell去执行这个程序,提高效率,这种方式就叫shell编程
这个文件也叫作shell脚本,shell编程也叫脚本程序
shell脚本属于解释性语言,不需要编译直接运行
2.shell
shell脚本文件以 .sh作为后缀,第一行应该写上执行shell脚本的shell路径。如下:
#!/bin/bash
shell脚本中使用#作为单行注释
注:不要再共享目录下写shell脚本
执行:
启动新bash来执行 ----- bash shell文件路径
将shell脚本加上可执行权限,直接运行 ----- ./shell文件路径
使用./source运行shell脚本(本shell) ----- . shell文件路径
注:shell语法中对空格和空行非常敏感,不能随意添加空格空行
3.输入输出
(1)输出 ---------- echo
用法:
echo 输出的内容
echo -n表示本行最后不换行
" "中的 $变量名 会被替换为变量的值
’ ’ 中不会做这种替换
``(反引号)中的命令会被它执行的结果所替代
(2)输入 ----------- read
用法:
read 变量(可以写多个变量,依次赋值)
read -p ...(提示信息) 变量名
read命令是将输入的内容保存到变量中
(3)变量
(1)查看shell中所有的变量
declare --------- 变量和函数
set -------- 变量和函数
env -------- 环境变量
(2)变量使用语法
变量=变量值 -------------- 定义/修改变量
$变量 --------------- 获取变量值
shell中的变量没有类型,默认使用字符串处理。
shell中的变量分为全局变量和本shell变量
本shell中的变量只能在本shell中使用
全局shell变量可以在子shell中(本shell直接/间接启动的shell)使用
变量默认是本shell变量,可以使用export将变量导出为全局变量
unset 变量名 --------------- 删除变量
变量与$组合使用:
${变量名:-值} ----- 变量存在取变量的值,变量不存在取后面的值
${变量名:=值} ----- 变量存在取变量的值,变量不存在定义变量为后面的值
${变量名:+值} ------ 变量存在取变量的值,变量不存在取空值
${变量名:?值} ----- 变量存在取变量的值,变量不存在输出错误信息
${#变量名} ------ 变量的长度
变量名= ----- 空值变量
以上语法中加:认为空值不是有效值,不加:认为空值是有效值
4.数组的使用
直接使用即可,不需要定义,下标也不要求连续
通过 ${数组名[下标]} 来获取数组中元素的值,直接把数组名当变量使用获取的是第一个元素的值
可以将变量直接当数组使用,这时变量的值就存放在下标为0的元素中 a[ * ] 代表整个数组, ${#数组名[*]} 可以获取数组元素个数
read -a 数组名 -------------- 所有输入的数据都存入数组中
5.特殊变量
$# ----- 命令行参数个数,不包括自己
$* ----- 所有命令行参数的内容
$? ----- 获取上一个命令的返回状态(0---正常 非0---出错)
$$ ----- 当前进程进程号
$0 ----- 当前进程名
$n ----- 命令行第n个参数
6.条件表达式
shell中可以使用 [ ] 或者 test命令 来计算条件表达式
注:中括号和表达式中间必须有空格,表达式的条件和值之间也要有空格
大于: -gt
小于: -lt
等于: -eq
不等于: -ne
大于等于: -ge
小于等于: -le
与: -a
或: -o
非: !
注:表达式中可以有变量,但是必须用变量的值
[ ] 和 test命令 也可以用来对文件和字符串进行判断
-e:测试一个文件是否存在
-f:测试一个文件是不是普通文件
-d:测试一个文件是不是目录
-r:测试一个文件是否有读权限
-w:测试一个文件是否有写权限
-x:测试一个文件是否有执行权限
-s:测试一个文件是否非空
-z:测试字符串是否为空
-n:测试字符串是否非空
注:在中括号中和test中也可以使用==和!=,别的运算符不能用
在$之后的[]中可以计算整数算数表达式(表达式中可以有变量的参与), ** 表示计算指数
[[ ]] ---------- 双中括号用法和[]几乎一样,[[]]内部可以使用运算符&&和||,不能使用 -a -o,可以直接使用变量
(( )) ---------- 双小括号内部直接使用运算符号,而且不用空格,内部直接使用变量,不能使用[ ]中语法
7.if结构
语法:
iffi(必须有) 命令 / [] / [[]] / (())
thenfi(必须有) 命令
elif 命令 / [] / [[]] / (())
then 命令
else 命令
fi(必须有)
8.case结构
case结构也可以实现分支,语法如下:
case $变量 in
值1)
命令;;
值2)
命令;;
值3)
命令;;
...
*)
....
esac
9.循环结构
(1)for循环 ----------- 遍历一组数据
语法格式:
for 变量 in 一组数据
do
.......
done
(2)while循环 --------- 条件成立继续循环,不成立结束循环
语法格式:
while 条件/命令
do
....
done
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)until循环 ------------ 条件不成立继续循环,成立结束循环
语法格式:
until 条件/命令
do
....
done
10.select语法
将所有的内容列出来供用户选择
语法:
select 变量 in 一组数据
do
...
done
11.shell中的函数
定义语法:
函数名()
{
.....
}
调用函数直接写函数名即可
函数可以有返回值,使用return来指定返回值,在函数调用语句后使用$?获取返回值
调用函数时也可以给函数传数据,直接把要传入的数据写到调用语句之后
:是一个什么都不做的命令,可以把一个表达式变成一条完整的命令
12.shell编程中的变量
在函数中定义变量默认也是本shell变量,可以在本shell中使用
REPLY变量是一个全局变量,记录内容是用户上次输入的值
可以在函数中定义本地变量,这种变量只能在本函数中使用
语法:
local 变量名
全局变量 --------- 本shell和子shell可以访问
本shell变量 ------ 本shell可以访问
本地变量 --------- 本函数可以访问
13.几个命令的补充
sort命令 --------- 对给定的内容(文件)进行排序
uniq命令 --------- 去掉文件中重复的行
seq命令 ---------- 产生给定的序列
seq 起始数字 间隔大小 结束数字
14.正则表达式
正则表达式用于进行字符串匹配
* ---------- 通配符,代表任意多个任意字符
? ---------- 通配符,代表1个任意字符
^xxx -------- 匹配行首
xxx$ -------- 匹配行尾
[] --------- 匹配范围
{} --------- 匹配的次数 {最少,最多},大括号要用\转义