Shell编程

Shell相当于翻译官,作为用户和Linux系统内部的通信媒介。

Shell 的使用

  1. 查看当前的shell:echo $SHELL(默认是Bash)

  2. 编写脚本:vim example.sh

1
2
3
4
#!/bin/bash
#举个例子,建议.sh结尾,表示一个脚本文件
Pwd
Ls -al

3.执行脚本:bash example.sh

Shell的变量

  • ​ 系统变量:$HOME , $PWD , $SHELL , $USER

​ eg : echo $HOME

​ 查看当前shell中所有变量的值: set

  • ​ 自定义变量:

​ 定义变量: 变量=值 (等号两边不要有空格,默认是字符串)

​ eg : c=1+1

  • 撤销变量:unset 变量

​ Eg: unset c

  • 声明静态变量:readonly 变量 (不能unset撤销)

  • 全局变量:export 变量名

  • ​ 特殊变量
  1. 特殊变量$n

​ n为数字,$0是脚本名称,$1-$9代表第一到第九个参数,十以上的参数要大括号,列入${10}

  1. 特殊变量 $#

​ 获取所有输入的参数(常用于循环)

  1. 特殊变量 $* , $@

​ $* :表示命令行中所有参数,$*把所有参数看成一个整体

​ $@:表示命令行中所有参数,$@把每个参数区别对待

例如:

识别参数

​ Vim example.sh

 
1
2
3
4
5
 #!/bin/bash
echo “当前脚本名称为$0
echo “总共有$#个参数,分别是$*。”
echo “第一个参数为$1,第五个为$5。”
echo “所有参数有$*,$@
  1. 特殊变量 $?

​ $? : 最后一次执行的命令的返回状态,正确执行后返回0,不正确执行返回非0。

Shell的运算符

  1. $[运算式]

  2. expr +,-,*,/ ,% 加减乘除,取余 (注意空格)

​ eg: 计算2+3 :expr 2 + 3

​ 计算(2+3)X 4 : expr expr 2 + 3 * 4

​ S = $[(2+3)*4]

Shell的条件判断

用条件测试语法判断表达式是否成立,条件成立就返回0;不成立就返回1。

测试语句表达式: [ 条件表达式 ] (注意红色为空格)

条件测试语句分为四种:

​ 文件测试语句;

​ 逻辑测试语句;(&&, ||, ! )

​ 整数值比较语句;

​ 字符串比较语句。

文件测试所用的参数

-d 测试文件是否为目录
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限运行

例如: [ -d example.sh ] && echo $?

echo $? 返回上条语句的返回值

​ 用&&连接,类似操作有“或||”,“非!”。

整数比较运算符

操作 作用
-eq(equal) 是否等于
-ne(not equal) 是否不等于
-gt(greater than) 是否大于
-lt(less than) 是否小于
-ge 是否大于等于
-le 是否小于等于

字符串比较运算符

= 比较字符串是否相同

!= 比较字符串是否不同

-z 判断字符串内容是否为空

Shell的流程控制

if控制语句

1
2
3
4
5
6
7
if 条件测试操作

then 命令序列

else 命令序列

fi

嵌套if

1
2
3
4
5
6
7
8
9
10
11
12
13
if 条件1

then 命令1

elif 条件2

then 命令2

else

命令3

fi

for条件循环语句

语法:

1
2
3
4
5
6
for 变量名 in 取值列表
do

命令序列

done

while条件循环语句

语法:

1
2
3
4
5
6
7
While 条件

Do

命令序列

Done

Case测试语句

语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Case 变量值 in

模式1)

命令1

模式2)

命令2

*)

默认命令

Esac

Read读取控制台输入

​ 基本语法: read (选项) (参数)

​ 选项: -p :指定读取值的提示符

​ -t :指定读取值的等待时间

​ 参数:

​ 变量:指定读取值的变量名

​ 例如:提示7s内,读取控制台输入名称

read -t 7 -p “请7S内输入数据” NAME

函数

​ 系统函数

  1. basename 切断路径

例如: basename /home/sds/example.txt

​ 结果是:example.txt

  1. dirname 保留路径

例如: basename /home/sds/example.txt

结果是: /home/sds

​ 自定义函数

​ 需要先声明函数

​ 基本语法:

1
2
3
4
5
6
7
8
9
[ function ] funname [()]

{

Action;

[return int;]

}

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#! /bin/bash

function sum()

{

S=0;

S=$[$1+$2]

Echo $s



}

read -p “输入第一个数:” $p1

read -p “输入第二个数: “ $p2

sum $p1 $p2

Shell工具

  1. cut

cut -d “ ” -f 1 example.txt (间隔符是“ ”,提取example.txt第一列)

image-20230103154839487

image-20230103154858172

  1. sed

sed 是一种流编辑器,一次处理一行内容。但是不改变文件内容,除非重定向。

语法 : sed [-e] ‘command’ filename

-e :在指令列模式上进行sed的动作编辑

Command:

​ a : 新增,a的后面可以接字符串,在下一行出现

​ d : 删除

​ s :查找并替换

例如:

Eg 1:把lushan放入example.txt的第二行后面

image-20230103154935521

​ Eg 2:把example.txt所有含有I的行删除

image-20230103154949305

Eg 3 :把example.txt中的I全部替换成you (+g即为全部替换)

image-20230103155002195

​ 注意原本文件并没有发生改变!

  1. awk

  2. sort

sort 对于文本内容进行排序

用法 :sort [参数] 文件名称

参数如下:

-f 忽略大小写

-b 忽略缩进与空格

-n 以数值型进行排序

-r 反向排序

-u 去除重复行

-t 指定间隔符

-k 设置字段范围

默认是字母顺序进行排序

计划任务服务程序

一次性计划任务

长久性计划任务

一次性计划任务用at命令,格式:at 时间

At 的参数

-f 指定包含命令的任务文件
-q 指定新任务名称
-l 显示待执行任务列表
-d 删除指定待执行任务
-m 任务执行后给用户发邮件

Atrm序号 :删除命令

倒计时命令:at now +2 MINUTE(HOUR,DAY,MONTH)

长久性命令crontab

参数

-e 编辑计划任务

-u 指定用户名称

-l 列出任务列表

-r 删除计划任务

参数格式:分,时,日,月,星期,命令(没有设置的时间直接用*代替,0,7均为星期日);

在线练习:https://crontab.guru/