出品方<Linux.cn & 阿里云开发者学堂>
一,Linux 可以划分为以下四个部分:
1. 应用软件
2. 窗口管理软件 Unity Gnome KDE
3. GNU 系统工具链 Software- GNU Project - Free Software Foundation
4. Linux 内核
二,什么是shell
1. Linux shell 是一种特殊的交互式工具,它提供了文件管理,运行进程的途径。
2. Shell 的核心是命令提示符,允许用户输入命令,然后解释命令,并在内核中执行。
3. 用户可以编写脚本文件,将多个 shell 命令以某种形式组织起来,作为程序一起执行。
三,默认的 Shell —— GNU Bash Shell
1. Shell 有很多种,不同的 shell 有不同的特性
2. 几乎所有的 Linux 发行版默认 shell 是 Bash shell
3. 有些发行版的默认系统 shell 和 默认交互 shell 并不相同
4. 查看系统支持的 shell 类型
bash: 一种对 bsh 在功能上进行扩展的 shell,几乎可以涵盖 shell 所需要的所有功能
ksh: 一种与 bsh 兼容的编程 shell,增加了很多特性,常见于 Unix 操作系统
tcsh: 一种具有 C 语言风格语法结构的 shell,常见于嵌入式开发(IC 公司)
zsh: 一种结合了 bash、ksh 和 tcsh 的特点,同时提供了高级编程特性的高级 shell
sh: 在绝大部分 Linux 发行版中,作为软链接指向其他 shell(默认是 bash )
shell 脚本 = shell 命令 + shell 特性 + 流程控制
四,Shell 的常用命令
# 管理文件和目录
touch cp mv rm file cat more less tail head cd pwd ls mkdir rmdir
# 管理系统进程
ps top kill killall
# 管理磁盘空间
mount umount df du
# 处理数据文件
sort grep gzip tar
#Shell 命令帮助手册
man [command]
五,Shell脚本中的变量
# 环境变量
set env
# 变量的定义/赋值
val=vaule
# 使用美元符 $ 对变量进行引用
echo ${name}
# 命令替换:将命令的输出赋值给变量
YYYYMMDD=$(date +%Y%m%d)
六,Shell脚本的条件控制
# if-then 语句
# if-then-else 语句
# if-then-elif-else 语句
if command
then
commands
fi
条件测试
-
test 命令提供了在 if-then 语句中测试不同条件的途径。
-
如果 test 命令中列出的条件成立,返回的退出状态码为 0,反之为 1。
-
test 命令的等价写法 [ ]
if [ ] ; then
commands
fi
提供的三类判断条件
-
数值比较
-
字符串比较
-
文件比较
case 语句,常代替 if-then-elif 语句用于对某个变量有大量判断语句的场景。
七,shell 脚本中数组的使用
-
一维数组
-
数组定义、元素引用、数组长度、数组分片
-
-
二维数组
-
Shell 只有一维数组的概念
-
如何实现二维数组的需求
-
-
关联数组(Bash从4.0版本才支持)
-
字典的概念
-
关联数组的定义与元素的访问
-
遍历元素的 key 和 value
-
八,Shell 脚本的循环控制
# for 语句
# 第一种
for var in list
do
commands
done
# 读取列表中的值
# 从命令读取值
# 用通配符遍历目录
# 第二种
for (( 变量赋值; 迭代条件; 迭代过程 ))
do
commands
done
# while 语句
# until 语句
# 嵌套循环
# break
# continue
九,Shell 脚本的参数
# 命令行参数
bash xxx.sh arg1 arg2
# 位置参数
$0 $1 ... $9 ${10}
# 若参数内容包含空格,则必须使用引号
bash xxx.sh "arg1 arg2"
# 特殊参数
$# $* $@
# 移除参数
shift
直接调用左移一个参数,以数字作为参数则指定左移的参数个数。
参数的几种常见形式
例:有一个 shell 脚本,用于处理一个文件中特定日期的数据,并将结果输出到另一个文件中。
我们需要有三个参数:输入文件路径、待处理数据的日期、输出文件路径
# 1. 参数个数明确、顺序固定
./handle_data.sh para1 para2 para3
# 2. 通过命令行选项传参(空格分隔),支持缺省参数
./handle_data.sh -input para1 -date para2 -output para3
10,Shell 脚本中的函数
函数的定义与使用
# 创建函数
function func_name { ... }
func_name() { ... }
# 使用函数
func_name
-
函数中使用变量
-
向函数传递参数
-
-
位置参数变量
-
在函数中处理变量
-
全局变量
-
局部变量 local
-
函数的返回值
# 获取函数的退出状态码
# 默认为函数最后执行的命令的退出状态码
$?
# 使用 return 命令
范围:整数 0-255
# 使用命令执行获取函数的输出
ans=$(func)
11,Shell 循环控制与参数处理
作业
194. 转置文件 - 力扣(LeetCode)
扩展
# 仿照以下脚本进行练习
tzselect
12,Shell 脚本编码规范
-
脚本的命名与权限
-
文件后缀、文件名可读性、可执行权限
-
-
脚本的基本结构
-
Shebang、函数、注释
-
-
脚本中变量与函数的命名与引用
-
变量和函数命名格式
-
引用方式
-
-
脚本中的相对路径和绝对路径
-
获取脚本执行路径的方法
-
-
脚本中的日志输出规范
-
函数封装、日志格式
-
13,Shell 脚本调试与排错
常见问题
1. 特殊字符问题
2. 环境变量问题
调试与排查
1. bash –n
读取但不执行命令
2. bash -x
显示bash执行过程
14,函数库
# 系统公共函数库文件,我在Ubuntu上没找到
/etc/init.d/function
# 调用系统公共函数库中的函数
. /etc/init.d/functions
source /etc/init.d/functions
# 第三方公共函数库
Bash Shell Function Library
Bash Shell Function Library 是一个短小精炼的Bash 公共库,他提供了诸如数组操作、命令执行、文件管理、日志记录、信息提醒、网络检测、字符操作、时间操作、变量操作等功能,帮助运维工程师快速完成自己的脚本编写工作。
项目地址:
GitHub - SkypLabs/bsfl: Bash Shell Function Library
GitHub - SkypLabs/bsfl: Bash Shell Function Library
bsfl: Bash Shell Function Library 是一个短小精炼的 Bash 公共库,他提供了诸如数组操 作、命令执行、文件管理、日志记录、信息提醒、网络检测、字符操作、时间操作、变量 操作等功能,帮助运维工程师快速完成自己的脚本编写工作。在线文档:https://skyplabs.github.io/bsfl/modules.html
Bash Lib
Bash Lib 是一个原子化的公共库,你可以根据自己的实际需要,引入所需的公共库分组,使用相应的内容,降低整个项目的大小。Bash Lib 提供了诸多原子库,包括参数处理、日历处理、日期处理、Hash处理、帮助处理、列表处理、交互处理、文字处理、测试处理、时间处理等功能。
项目地址: Bash-lib by aks