Shell 编程

10 Jul 2021

什么是 Shell

Linux 的启动过程

/BIOS-MBR-BootLoader(grub)-kernel-init-系统初始化-shell

Shell 书写规范

#!/bin/bash
# Sha-Bang
# 第一行的#!/bin/bash,告诉看脚本的人,这个文件需要用哪个shell编译器运行
# 当以 ./xx.sh 的方式运行脚本是,会读取第一行,并以对应的编译器运行

# demo
cd /var
ls
pwd
# 列出当前目录下所有文件大小
du -sh *
# 查看当前文件夹的大小
du -sh
# 查看整文件系统空间使用情况
df -h

执行方式

内建命令和外部命令的区别

管道与重定向

变量

运算符

特殊符号大全

测试与判断

退出与退出状态

测试命令 test

使用 if-then语句

使用 if-then-else 语句

嵌套 if 的使用

分支

循环

使用 for 循环遍历命令的执行结果

C 语言风格的 for 命令

for((变量初始化;循环判断条件;变量变化)) 
do
	循环执行的命令
done

for (( i=1 ; i <= 10 ; i++ ))
do 
	echo $i;
done

while 循环

while test测试是否成⽴ 
do
	命令
done


➜  bash_test a=1                    
➜  bash_test while [ $a -lt 10 ]; do
echo $a ; ((a++))
done
1
2
3
4
5
6
7
8
9
➜  bash_test echo $a
10

until 循环

循环的使用

* 循环和循环可以嵌套 
* 循环中可以嵌套判断,反过来也可以实现嵌套 
* 循环可以使用 break 和 continue 语句在循环中退出
# break
➜  bash_test for i in {1..9};do 
	if [ $i = 5 ];then 
		break;
	fi
	echo $i
done
1
2
3
4

# continue, skip 5
➜  bash_test for i in {1..9};do
if [ $i = 5 ];then
continue;
fi
echo $i
done
1
2
3
4
6
7
8
9

使用循环处理命令行参数

#!/bin/bash

# help display help help

for pos in $@;do
if [ "$pos" = "help" ]; then
	echo $pos $pos
else
	echo $pos
fi
done


echo "1:"$1
# 参数为空的时候占位
echo "1_:"${1-_}

# shift 移动参数,每次删掉参数列表的第一个参数
# 配合while [ $# -ge 1 ] 可以便利参数列表
while [ $# -ge 1 ] 
do
	if [ "$1" = "help" ]; then
		echo $1 $1
	fi
	shift 
done

函数

自定义函数

自建函数库

脚本控制

脚本优先级控制

捕获信号

计划任务

一次性计划任务 at

[root@3fc93cd751e9 learn_bash]# at 09:03
warning: commands will be executed using /bin/sh
at> echo hello > /tmp/hello.txt
at> <EOT>     
job 2 at Sat Jul 10 09:03:00 2021
# 使用ctrl+D结束输入,并提交
[root@3fc93cd751e9 learn_bash]# atq
2	Sat Jul 10 09:03:00 2021 a root

周期性计划任务

计划任务加锁

# 排他锁, 使这种方式运行, 如果当前运行的a.sh没有结束
# 就不能在次运行
flock -xn "/tmp/f.lock" -c "/root/a.sh"

Vim 文本编辑器的使用

四种模型: