Linux中利用shell来实现编程效果
1 Shell
1.1 介绍
- Shell 是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序
1.2 快速入门
- (1)创建“hello.sh”文件
1
vim hello.sh
- (2)输入脚本解析器以及脚本执行内容
1
2
echo "hello, world!" #脚本执行内容
- (3)给此脚本赋予执行权限“x”
1
chmod 744 hello.sh
- (4)运行脚本
1
./hello.sh

2 Shell变量
2.1 介绍
- Shell中变量分为:系统变量 和 用户自定义变量
- 系统变量:$HOME,$PWD,$SHELL,$USER
- set指令可查看所有系统变量
- 自定义变量:变量=值
- 撤销变量:unset 变量
- 声明静态变量:readonly 变量(不能够unset)
2.2 定义规则
- (1)变量名可以有字母,数字,下划线组成,但不能以数字开头
- (2)等号两侧不能有空格
- (3)变量名一般使用大写
2.3 命令返回值用于赋值
1 | 变量=`命令` |
2.4 演示


3 设置环境变量
3.1 介绍
- linux上所有的环境变量都配置在/etc/profile中
export 变量=值
来配置环境变量- 配置完毕后,通过
source /etc/profile
,重新加载配置文件来使用
3.2 演示
- (1)打开/etc/profile配置环境变量

- (2)echo打印一下环境变量(先要resource加载配置文件)

4 位置参数变量
4.1 介绍
- 在我们执行shell脚本的时候,可以在后面拼接参数,进行传参,例:
./test.sh hello world
- shell脚本有对应的参数变量来接收这些参数
- (1)$n (n为数字)
- 以空格来切分命令,将上面命令变成[
./test.sh
,hello
,world
],通过$0, $1, $2来获取参数 - 如果个数达到10位数以上,需要用大括号括住数字
${10}
(2)$*
- 获取全部参数,会将传入的参数
hello world
视为一个整体
- (3)$@
- 获取全部参数,与上面不同,会将
hello
和world
区分为个体
- (4)$#
- 统计传入参数的个数
4.2 演示
- (1)创建test.sh

- (2)带参运行test.sh

5 预定义变量
5.1 介绍
- shell本身有定义好的变量提供用户使用
- (1)$$
- 获取当前进行的PID
- (2)$!
- 获取后台运行的最后一个进程的进程号
- (3)$?
- 最后一次执行的命令的返回状态{0=正常,非0=异常}
5.2 演示
- (1)创建test.sh文件

- (2)运行test.sh文件

6 运算符
6.1 使用方式
1 | (1)$((运算表达式)) |
6.2 演示


7 条件判断
7.1 判断条件
- (1)比较符
1
2
3
4
5
6
7= 字符串比较使用的等于
-lt 小于
-gt 大于
-eq 等于
-le 小于等于
-ge 大于等于
- (2)文件权限判断
1
2
3-r 文件路径 :是否有读的权限
-w 文件路径 :是否有写的权限
-x 文件路径 :是否有执行的权限
- (3)文件类型判断
1
2
3-e 文件路径 :文件是否存在
-f 文件路径 :文件是否是常规文件
-d 文件路径 :文件是否是目录
7.2 if判断语法
- 方式一
1
2
3
4
5
6
7if [ 判断条件 ];
then
代码逻辑
else
代码逻辑
fi
# 注意:[]中的内容左右两边要有空格,[]结尾用带有;
- (2)方式二
1
2
3
4
5
6
7
8# 方式二
if [ 判断条件 ]
then
代码逻辑
else
代码逻辑
fi
# 注意:跟上面基本一致,少了个分号';'
- (3)多重判断写法
1
2
3
4
5
6
7
8
9
10
11# 多重判断写法
if [ 判断条件 ]
then
代码逻辑
elif [ 判断条件 ]
then
代码逻辑
else
代码逻辑
fi
# 注意:就是用elif来拼接,用上面两种写法都可以
7.3 演示


8 分支控制
8.1 case分支控制语法
- case写法
1
2
3
4
5
6
7
8
9
10
11
12case 变量 in
"变量值1")
逻辑代码1
;;
"变量值2")
逻辑代码2
;;
...
*)
默认逻辑
;;
esac
8.2 演示


9 循环遍历
9.1 for循环语法
- (1)方式一
1
2
3
4
5for 暂时变量 in 变量1 变量2 变量3 ...
do
代码逻辑
done
# 注意:遍历时将变量1,2,3...分别赋值给暂时变量
- (2)方式二
1
2
3
4
5for ((初始值; 循环控制条件; 变量变化))
do
代码逻辑
done
# 注意:跟java语法遍历类似,只是用了两个()进行括起
9.2 for循环演示


9.3 while循环语法
- while语法
1
2
3
4while [ 条件判断 ]
do
代码逻辑
done
9.4 while循环演示


10 读取控制台输入
- 类似java中的scanf,等待用户输入数据,然后才进行下一步操作
10.1 语法
1 | read (选项) (参数) 接收变量 |
10.2 演示


11 函数
11.1 系统函数
- (1)获取文件名
1
2basename (文件路径) (后缀名)
# basename会自动帮助过滤路径,只保留文件名,若连后缀名也不保留,则要填写后缀名

- (2)获取文件目录路径
1
2dirname (文件路径)
# dirname与basename相反,反而会获取文件所在目录的路径

11.2 自定义函数
- 函数自定义语法
1
2
3
4function (函数名) () {
代码逻辑
}
# 注意:shell编程的函数不需要带形参

