Linux Shell 编程基础(持续更新)
部分内容选自《linux命令行与shell脚本编程大全.第3版》
1 什么是linux
linux可划分为以下四部分:
- linux内核
- gnu工具
- 图形化桌面环境
- 应用程序
完整的linux系统如下图:
1.1 linux内核
linux系统的核心就是内核,内核控制计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。
内核主要负责以下四种功能:
- 系统内存管理
- 软件程序管理
- 硬件设备管理
- 文件系统管理
(1)系统内存管理
管理服务器的可用物理内存,以及创建和管理虚拟内存;
(2)软件程序管理
linux系统将运行中的程序称为进程,内核控制着linux系统如何管理运行在系统上的所有进程。
(3)硬件设备管理
任何linux系统需要与设备通信,都需要在内核代码中加入其驱动程序代码。驱动程序代码相当于应用程序和硬件设备的中间人,允许内核与设备之间交换数据。
linux系统将硬件设备当成特殊的文件,称为设备文件。设备文件有3种分类:
- 字符型设备文件:处理数据时每次只能处理一个字符设备;
-
块设备文件:指的是处理数据时每次能处理大块数据的设备,通常用b表示,如硬盘,brw-rw----. 1 root disk 8, 0 8月 19 01:50 /dev/sda
- 网络设备文件:网卡、回环设备;
linux为系统上的每个设备都创建一种称为节点的特殊文件,与设备的所有通信都通过设备节点完成,比如网卡文件、硬盘文件;
(4)文件系统管理
系统上支持的文件系统
2.2 gnu工具
(1)shell
gnu/linux shell是一种特殊的交互式工具。shell的核心是命令提示符,命令提示符是shell负责交互的部分。允许你输入文本命令,然后解释命令,并在内核中执行。
shell包含一组内部命令,用这些命令可以完成复制文件、移动文件、重命名文件、显示和终止系统中正在运行的程序等操作。shell也允许你在命令行提示符中输入程序的名称,shell会将程序名传递给内核以启动它。
在linux系统中,通常有好几种shell可用,不同的shell有不同的特性,所有linux发行版默认的shell都是bash shell,常见的shell:ash、sh、ksh。
2 什么是shell
在linux内核与用户之间的解释器程序
— 通常指/bin/bash(默认解释器)
— 负责向内核翻译及传达用户/程序指令
—相当于操作系统的“外壳”
交互式 ——命令行
— 人工干预、智能化程度高;
— 逐条解释执行、效率低;
非交互式 ——脚本
— 需要提前设计、智能化难度大;
— 批量执行、效率高;
— 方便在后台静悄悄地运行;
shell就类似于汽车这个概念,那么bash就比喻为具体的品牌型号,比如宝马m2、m3。
/etc/shells 这个文件是保存系统中有多少shell可用
如何切换shell呢?
查看/etc/shells文件里面有多少可用的解释器,直接输入解释器名称即可,比如在命令行直接输入ksh就能切换,如果想返回到bash(默认解释器)直接exit即可。
其他的解释器并没有bash好用,所以红帽官方选择它当做默认的解释器!bash有的特性是其他解释器没有的!
bash基本特性
— 快捷键、tab键补全
— 命令历史
— 命令别名
— 标准输入输出
— 重定向
— 管道操作
注意:选项不要过度依赖tab键(针对于7),个人认为选项能不用tab就不要用,命令和文件/目录路径可以使用。
命令历史:默认记录1000条,通过全局变量histsize设置;(记录最好改到100以内,每一条命令操作都会有记录,所以任何人都可以看到,所以为了安全起见)
所有用户生效,配置文件:/etc/profile
命令历史使用:!885或者!cat(最近使用cat的记录)可以重复使用之前输入的命令;
清空命令历史:history -c(但是在每个用户的家目录里边还有个文件.bash_history,历史命令已经保存文件中所以要想彻底清空需要把这个文件删除!删除后会自动生成!)
重定向输出/输出
标准输入,描述号为0;
标准输出,描述号为1;
标准错误,描述号为2;
&:错误信息和正确信息
>:覆盖重定向
>>:追加重定向
输出重定向可以理解为本来要显示在屏幕上内容给它放到文件中,那么输入重定向就是本来要通过键盘输入内容直接从文件中去读取,文件的内容代替了键盘输入;
# mail -s dacui root < note.txt
管道
将一条命令的标准输出交由另一条命令处理
脚本的设计
写脚本的三个步骤:
1、脚本声明(需要的解释器、作者信息等)
2、注释信息(步骤、思路、用途、变量含义等)
#autor:作者、邮箱
#version:版本
#description:描述
3、可执行语句(操作代码)
linux会按照脚本的上下顺序去执行
执行脚本的方式:
1、chmod +x
2、使用绝对路径来运行
3、bash 运行
4、source 运行
脚本的执行一般都是开启子进程的,但是如果使用source命令执行脚本是不开启子进程的;
source 在当前进程执行
例如,目前有一个脚本名称为a.sh,内容为sleep 100,分别使用bash a.sh ./a.sh /root/a.sh source a.sh执行
使用bash a.sh ./a.sh /root/a.sh这三种执行都是一样的,开启子进程
[root@server0 sh]# pstree
bash(当前进程)─── bash(脚本开启的子进程)─── sleep
使用source a.sh结果:
[root@server0 sh]# pstree
bash(当前进程)─── sleep
那么开启子进程和不开启子进程有什么区别吗?
没有太多意义,但是有的时候会需要!比如,修改/etc/profile文件中的histsize为20条,配置文件修改不能立即生效,需要在新的终端才生效,此时我不想开新的终端那么就使用source命令去执行即可;
未来90%多的脚本都是按照正常执行,不需要考虑到开不开子进程,少数需要考虑到,特殊情况;
变量
set 查看所有变量
unset 删除变量
env 查看系统自带的变量
位置变量:
$0:脚本名称
$1:第一个参数
$2:第二个参数
$3:第三个参数
...
$*:列出所有参数
$#:列出参数的个数
$$:显示脚本的pid进程号
$?:查看上一条命令的返回状态,两种值,0和非0
引号
" ":把多个内容变成一个整体;
' ':把多个内容变成一个整体,但是单引号屏蔽特殊符号,也就是说在调用变量的使用单引号就无法调用;
$():取命令的结果;
``:取命令的结果;
tar -czf xx.`date +%f`.tar /var/log
read
只定义变量名
-p:提示
stty -echo 不在终端显示输入信息
stty echo 在终端显示输入信息
export将局部变量变成全局变量
上一篇: iOS KVC-对象初始化赋值的神级技巧
下一篇: 刚刚在网看到一个笑话