开发者学堂课程【Linux Shell 编程:Linux Shell 训练营 Day1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/856/detail/14108
Linux Shell 训练营 Day1
内容介绍
一、什么是 shell 以及它的使用场景
二、shell 的常用命令
三、shell 脚本中变量的使用
四、shell 脚本中的条件控制
课程安排,第一天会讲解 Shell 脚本基础,主要了解 linux Shell 的使用场景;认识常用 Shell 命令;学习 Shell 脚本中变量的赋值与使用以及条件控制,主要是对 Shell 脚本基础的学习。
第二天学习 Shell 循环控制与参数处理,学习 Shell 脚本中的数组:一般遇到循环控制都会使用数组,Shell 中数组与其他语言区别较大,了解奇怪的语法;学习 Shell 脚本中的参数处理:在使用 Shell脚本时会用到参数,学习在处理参数使用的方法;学习 Shel 脚本中的函数使用:函数一般是封装常用功能,方便在其他地方调用。
第三天进行 Shell 脚本的实战以及公共函数库的学习,了解 Shell 脚本中编程规范:在大厂对 Java,python 都有编程规范那么即使是 Shell 脚本,在学习时依然需要遵循 Shell 脚本的编码规范,至少在一个项目或脚本中保证编码的统一性;了解 Shell 脚本调试与排错对于 Java,Eclipse 这种集成的 IDE 编程环境在命令行上写脚本时需要了解如何进行 Shell 脚本的调试与排错;了解 Shell 脚本的公共函数库:在其他编程语言中会有库函数或者第三方的软件包,Shell 中也有两个公共函数库需要了解公共函数库中的功能。
在第一天和第二天结束时会留小作业,在第三天课程开始会讲解小作业,作业其实是一个简单的编程题是为了巩固当天学习内容,如果只是听课程而未进行实际操作对于 Shell 脚本的学习而言比较困难。以上是关于 Shell 脚本学习的逻辑,从 Shell 脚本基础学习到Shell 循环控制与参数处理到最后 Shell 实战。
要求:需要有 linux Shell 的练习环境, 例如:自己的虚拟机,VMware,VirtualBox,阿里云上购买云主机(非常实惠,如果是按量使用那么一天可能几块钱)。
第一天的学习内容:第一部分讲解什么是 shell 以及它的使用场景,第二部分讲解 shell 的常用命令,第三部分讲解 shell 脚本中变量的使用,第四部分讲解 shell 脚本中的条件控制
一、什么是 shell 以及它的使用场景
在学习 shell 脚本之前需要了解 shell 在 linux 中的位置。
1. Shell 在 Linux 中的位置,Linux 可以划分为以下四个部分:
(1)应用软件,例如 web 应用,常用数据库应用,后端应用
(2)窗口管理软件,主流的窗口管理软件有 Unity ,Gnome, KDE。窗口管理软件即 Linux 桌面,在 Linux 中桌面程序单独于 Linux 本身,与 Wendousi 系统桌面与内核链接在一起是不同的。在服务器中登录时,不会安装窗口管理软件,如果自己装载 Linux PC 机可能会用到窗口管理软件。
(3)GNU 系统工具链非常重要
software.html
linux 一般是指 Linux 内核;Linux 系统应称为 GNU Linux ; GNU 系统工具链是Linux 中重要组成部分。可以点开链接进入 GNU 官网,GNU 是一个100%由自由软件构成的操作系统但是 GNU 系统在刚开发时未完善,缺少系统内核;随着自有软件基金会对系统不断补充。在关于 GNU 中查看 GNU 的历史,从1989年至今的变化非常有趣。
今天要学习的 shell 属于 GNU项目中的 Coreutils 工具。GNU 系统工具链其中核心开发工具,核心工具包以及常用 linux 命令都在 Coreutils 中,例如:对用户的操作 chown,chgrp,chroot;对文本的操作以及对文件,对进程的操作。GNU Coreutils 文档建议了解,可以对 Linux 中命令有所了解
(4)Linux 内核
Linux 内核主要是对内存的管理,对系统进程的管理,对文件系统的管理,以及对硬件驱动的管理。用户在终端输入的命令都是通过 shell 管理的,在这个层面不接触 Linux 系统内核。在图中需要了解 shell 的位置,会有清晰的蓝图来进行后续学习。
2.什么是 Shell
(1)Linux shell 是一种特殊的交互式工具,它提供了文件管理,运行进程的途径。
(2)Shell 的核心是命令提示符,允许用户输入命令,然后 shell
工具会解释命令,并在内核中执行,然后内核执行完毕后会把结果返
回给 shell 并输出到命令提示符上。
(3)如果有很多命令,用户可以编写脚本文件,将多个 shll 命令以某种形式组织起来,作为程序一起执行,某种形式组织即 shell 的流程控制,其中包括 if判断语句,循环语句,函数的有机组合。Shell 存在于 GNU 中,在Linux 的 shell 默认的是 bash,bash 也在 GNU 软件库中,在 GNU 官网上有 bash 手册,观看文档会对 bash 有更深的了解。
3.默认的 Shell一GNU Bash Shell
(1)Shell 有很多种,不同的 shell 有不同的特性
(2)几乎所有的 Linux 发行版默认 shell 是 Bash shell。本次学习的 shell 均为默认的 bash shell。
(3)有些发行版的默认系统 shell 和默认交互 shell 并不相同。其他 bash 类型大同小异,可以自行了解差异
(4)查看系统支持的 shell 类型,在工作或学习中只需要关注 shell 语法。
bash
一种对 bsh 在功能上进行扩展的 shell,几乎可以涵盖 shell 所需要的所有功能
ksh
一种与 bsh 兼容的编程 shell,增加了很多特性,常见于 Unix 操作系统
tcsh
一种具有 C 语言风格语法结构的 shell,常见于嵌入式开发(IC 公司)
zsh
一种结合了 bash、ksh 和 tcsh 的特点,同时提供了高级编程特性的高级 shell
sh
在绝大部分 Linux 发行版中,作为软链接指向其他 shell(默认是 bash)
4.shell脚本=shell命令+shell特性+流程控制。
为什么 shell 不容易学习,其中 shell 命令非常多例如刚刚查看的 GNU 软件工具库有非常多命令,那么这些命令并不都需要了解只需要了解最常用的 shell 命令;shell 特性语法特殊,学习 shell 语法特性保证进行编程时不会出错;第三块流程控制,流程控制对有一定编程基础的人来说比较容易。
难点主要在于 shell 命令与 shell 特性。为什么要学习 shell,在应用开发时需要使用服务器又没有完善的自动化工具,只要登录 linux 服务器就要了解 shell命令,像 C 语言需要在 linux 服务器上编译的如果需要手工编写脚本就需要了解 shell。
二、shell 的常用命令
1. 管理文件和目录
管理文件命令和目录命令:对文件的查看,创建,删除,移动;对目录的查看,创建,删除,移动;
touch cp mv rm file cat more less tail head
cd pwd ls mkdir rmdir
2. 管理系统进程
挂历系统进程命令:查看系统进程,查看系统进程启动时间,结束系统进程
ps top kill killall
3. 管理磁盘空间
管理磁盘空间命令:查看服务器目录空间,mount 命令:挂载目录,umount 命令:卸载目录
mount umount df du
4. 处理数据文件
处理数据文本命令:Sort 命令对文件排序,grep 命令压缩文件即把多个文件压缩成一个压缩包,gzip 命令解压文件,tar 命令是解压缩的命令
sort grep gzip tar
使用 shell 命令:
(1)查看命令文档 man[command] ,man[command] 是提供的命令帮助手册。
(2)例如 touch,touch 命令可以创建文件。如果只知道 touch 可以创建文件而不知道 touch 命令具体的用法,可以查看 man[command] 手册,输入 man thouch 查看 thouch 命令具体使用方法:touch-change file timestamps 即可以修改文件或创建空文件,下面有关于参数的使用。如果想要了解某一个命令,可以按照此方法查看文档。
可以使用 touch--help,查看最基本的参数以及使用方法。
如果觉得文档中全部都是英文不方便,可以使用小程序,在小程序上查询关于 linux 命令解释以及常规用法,小程序是 linux 中国 开放的方便与对常规命令的查询。
三、shell 脚本中变量的使用
1. 环境变量
如果需要创建 shell 脚本首先需要了解变量。首先了解环境变量,环境变量即 Linux 操作系统中默认存在的变量,可以使用 set 命令查看。
Set 命令输出当前的环境变量,=的左边为变量名,右边为输出变量。例如,USER 为当前登录用户,输出值 root 为登录用户。
2. 变量的定义/赋值输出的值。
val=vaule
对变量的定义或赋值用=连接,=两边不能有空格,这是 shell 的语法。定义变量,变量名只能是英文字母,数字,下划线组成;并且数字不能在变量的开头,可以用下划线或字母进行组合;变量名中不能有空格或标点符号;也不能使用 bash 中关键字作为变量名。
3.使用美元符$对变量进行引用
使用 $ 符号对变量名进行引用,一般引用变量使用 $ 符合加变量名例如$val 可以对 val 变量引用。 建议在变量名前后使用括号进行引用,以便进行字符拼接防止识别到其他变量名。例如echo$(name)
4.命令替换:将命令的输出赋值给变量
YYYYMMDD=$(date +%Y%m%d),获得年月日使用 date 命令,命令两边使用 $符合加括号,可以将命令输出赋值给变量 YYYYMMDD。
四、shell 脚本中的条件控制
条件控制语句非常简单主要讲解 if-then 语句,if-then-else 语句,if-then-elif-else 语句。
1.if-then 语句语法
if command
then
c
ommands
fi
如果 if command 与 then 没有写在一行,command 后不需要加符合;如果 if command 与 then 写在一行,那么command 后需要添加分号即符号 ;。If 后的 command 含义:每一个命令会有一个返回值0或1,在 linux 中0代表命令执行成功,如果返回值为0,执行后面的命令否则不执行。
2.if-then-else 语句语法
if command
then
commands1
else
commands
fi
同理if-then-else 语句中,if 后 command 返回值为0执行 command1,否则执行下一条语句 command2。
3. if-then-elif-else 语句语法
4. Shell 脚本条件控制
有条件测试,commands 只能是命令,如果进行判断就不能使用 commands。
使用 linux 中提供的 test 命令,test 命令中列出的条件成立,返回0不成立返回1;test 命令等价写法用[]。Shell 中与其他语言判断返回值相反,这是 linux 中的特性,Linux 中如果返回值为0认为命令执行成功与其他语言相反,需要多加练习。
(1)条件测试
① test 命令提供了在 if-then 语句中测试不同条件的途径。
② 如果 test 命令中列出的条件成立,返回的退出状态码为0,反之为。
③ test 命令的等价写法[]
if {};then
commands
fi
(2)提供的三类判断条件
(1)数值比较
(2)字符串比较
(3)文件比较
(1)数值比较
比较两个数值大小,-eq 是 echo 的缩写;-ge是greta echo的缩写表示大于等于;gt 是 greta then 的缩写;le是lash then 的缩写;ne 是 not echo 的缩写;比较方便记忆。只适用于数值之间比较,如果传入字符串会报错,例如数字1与数字2进行比较不会报错,数字2与字母 a 比较会报错。
① n1 -eq n2
检查 n1是否与 n2相等
② n1-ge n2
检查 n1是否大于或等于 n2
③ n1-gt n2
检查 n1是否大于 n2
④ n1-le n2
检查 n1是否小于或等于 n2
⑤ n1-It n2
检查 n1是否小于 n2
⑥ n1-ne n2
检查 n1是否不等于 n2
(2) 字符串比较
用等于号即 符号= 表示字符串相同;用感叹号等于号即 符号!= 表示字符串不同;小于号,大于号表示字符串字母序大小;参数 -n 判断字符串长度是否不为0,如果不为0则 test 语句返回0执行 if 后的语句;参数 -z 判断字符串长度是否为0即判断字符串长度是否为空;-n,-p常用于判断变量是否存在,变量是否为空
① str1=str2
检查 str1是否和 str2相同
② str1 !=str2
检查 str1是否和 str2不同
③ str1< str2
检查 str1是否和 str2小
④ str1 >str2
检查 str1是否和 str2大
⑤ -n str2
检查 str1的长度是否不为0
⑥ -z str2
检查 str1的长度是否为0
(3) 文件比较
-d 判断文件是否存在并且是目录;-f 判断文件是否存在并且是文件;在 linux 中目录也是文件。可读,非空,可写,可执行有对应参数进行判断;-nt,-ot 判断两个文件中那个文件新,一般在备份是可能用到-nt,-ot。
① -d file
检查 file 是否存在并且是一个目录
② -f file
检查 file 是否存在并且是一个文件
③ -r file
检查 file 是否存在并且可读
④ -s file
检查 file 是否存在并且非空
⑤ -w file
检查 file 是否存在并且可写
⑥ -x file
检查 file 是否存在并且可执行
⑦ file1-nt file2
检查 file1 是否比 file2 新
⑧ file1-ot file2
检查 file1 是否比 file2 旧
4.条件测试的使用,例如1是否等于2,等于输出 equal,不等于输出 not equal。
if[ 1-eq 2 ]:then
echo "equal"
else
echo "not equal'
Fi
注意:If 后[]中1-eq 2 要与[]保留空格即条件与左方括号的右边,与右方括号的左边保留空格,否则会报错,这是 shell 独特的语法。
四.shell 脚本中的条件控制
Case 语句与其它语言 case 语句类似,常代替 if-then-elif 语句用于对某个变量有大量判断语句的场景。
case expression in
pattern1)
commands ;;
pattern2)
commands ;
pattern3 I pattern4)
commands ;
★)
default commands ;
esac
expression 为变量,当变量值为 pattern1 是执行 commands,当变量值等于 pattern2 时执行对应的 commands 语句,依次执行下面的语句直至结束。case 语法结尾是 case 的逆序 esac。