什么是shell?
事实上。Linux命令就是一种shell。
由此可见,shell是用户与Linux操作系统沟通的桥梁
什么是shell编程?
shell编程就是把多个shell逻辑命令组合在同一个文件中,后面可直接执行该文件,该文件称为shell脚本。
第一个shell脚本
- shell脚本文件名后缀通常是.sh
- shell脚本第一行内容是
#!/bin/bash
注意
除第一行外的shell脚本,其它行以#开头表示注释
创建第一个shell脚本
步骤一 创建文件
mkdir 文件名
步骤二 把操作目录更换至文件目录
cd 文件名/
步骤三 脚本文件的创建及编写
vi 脚本名称.sh
执行shell脚本
格式
bash 脚本名称 sh 脚本名称
bash命令对应的是bin目录下的bash文件
而sh命令对应的是bin目录下的sh文件,sh文件是一个连接文件,指向bash文件
执行权限问题
通过ll命令我们可知,shell文件没有执行权限
那为什么我们可以在shell里面执行shell脚本呢?
原因是:我们在前面加上了bash/sh命令,把shell脚本作为参数,传入bash文件执行
添加执行权限
chmod u+x 脚本
拥有执行权限后,我们可以直接使用命令简写来执行脚本
./脚本名
命令中.是指当前目录
这里有个坑
如果我们直接输入文件名,会发现系统抛出command not found的错误,原因是Linux默认是在PATH环境变量下寻找脚本,而不是当前目录下
shell脚本的单步执行
方便脚本调试
bash -x:
shell中的变量
- shell变量不需要声明,初始化也不需要指定类型
shell是一门弱类型语言
- 变量命名:只能使用数字、字母和下划线,且不能以数字开头
- 变量赋值是通过"="进行赋值,在变量、等号和值之间不能出空格
创建变量
变量名=值
打印变量
echo $变量名
echo ${变量名}
若想在某个变量后无缝拼接另一个变量,选择使用后者
也可以在第一个命令后加空格,但不达到无缝拼接
变量的分类
本地变量
格式
变量名=值
应用场景
在shell脚本中定义一些临时变量时使用,对当前shell进程的子shell进程及其它shell进程无效
对其它shell进程无效
运行pstree命令,查看进程
pstree命令默认未安装
当前进程数为3,把另外一个进程关掉后,进程数为2
进入子进程
bash
对子进程无效
退出子进程
exit
环境变量
格式
export 变量名=值
应用场景
用于设置临时环境变量,对子shell进程有效,对其它shell进程无效
注意
设置永久环境变量,需要添加到配置文件/etc/profile中,然后执行source /etc/profile可立刻生效
添加至/etc/profile中可对于所有用户生效
再次运行echo
原因分析
由于开始shell进程时,默认已经打开etc/profile/文件,上述更改是进程打开后的更改,未重新加载文件
解决
source /etc/profile
位置变量
位置变量相当于Java中main函数的args参数,可以在shell脚本中动态获取外部参数
location.sh文件
$0 $1 $2
格式
location.sh 字符串
$0打印文件名称 2打印xyz
字符串参数数量对应在行数的角标
应用场景
给shell脚本传输动态参数时,需要用到位置变量
特殊变量
$?:上一条命令的返回状态码,状态码在0~255之间
$#: shell脚本所有参数的个数
paramnum.sh内容
应用场景
需要动态获取多个参数时,在执行脚本前确认参数个数
变量和引号的特殊使用
":单引号不解析变量
echo '$name'
"": 双引号解析变量
echo "$name'"
``:反引号是执行并引用命令的执行结果echo `$name'
$name为peiqi,执行语句peiqi未能正常执行
$name为pwd,执行语句pwd获取当前路径信息
$(...)是的另一种写法,效果一样
注意
echo '"$name"'
echo "'$name'"
shell脚本中的逻辑判断
for循环
格式1
for((条件))
do
循环体
done
格式2
for 变量名称 in 列表 # 列表元素之间以空格间隔
do
循环体
done
while循环
适用于循环次数未知,或不便于使用for直接生成较大列表时
格式
while 测试条件
do
测试体
done
测试条件
格式: test EXPR或者[ EXPR ]中括号和表达式之间的空格不能少
整型测试: -gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)、-eq(等于)、-ne(不等于)
字符串测试:=(等于)、!=(不等于)
退出按
ctrl+c
异常原因:[后和]前没有空格
if判断
- 单分支
if 测试条件
then
选择分支
fi
不传参数会报错
- 双分支
if 测试条件
then
选择分支1
else
选择分支2
fi
if 测试条件1
then
选择分支1
elif 测试条件2
then
选择分支2
.…·
else
选择分支n
fi