再读:Linux系统命令及Shell脚本实践指南(二)
第十章 正则表达式
linux命令下的正则规则和其他语言的规则类似
大多时候与 grep
结合使用,比如 grep 'ro.t'
通配符使用:cat *.txt
,ls fla?.txt
ls [a-c].txt
,ls [^a-c].txt
第十一章 shell编程概述
图11-1显示了Shell在操作系统中的位置。
了解下kernel
The Linux® kernel is the main component of a Linux operating system (OS) and is the core interface between a computer’s hardware and its processes. It communicates between the 2, managing resources as efficiently as possible.
The kernel is so named because—like a seed inside a hard shell—it exists within the OS and controls all the major functions of the hardware, whether it’s a phone, laptop, server, or any other kind of computer.
kernel的功能
The kernel has 4 jobs:
Memory management: Keep track of how much memory is used to store what, and where
Process management: Determine which processes can use the central processing unit (CPU), when, and for how long
Device drivers: Act as mediator/interpreter between the hardware and processes
System calls and security: Receive requests for service from the processes
参考https://www.redhat.com/en/topics/linux/what-is-the-linux-kernel
事实上,Shell不只是一种解释器(在用户和系统间起着桥梁的作用),还是一种编程工具,称为脚本语言,shell和编程语言一样,有很多版本的shell
Shell的功能
当一台系统运行起来时,内核(kernel)会被调入内存中运行,由内核执行所有底层的工作,它会将所有应用程序及用户的操作翻译成CPU的基本指令,并将其送至处理器。这些过程听起来非常复杂,而且实际上也确实是非常底层和技术化的。
为了对用户屏蔽这些复杂的技术细节,同时也是为了保护内核不会因用户直接操作而受到损害,有必要在内核之上创建一个层,该层就是一个“壳”,也就是Shell名称的由来。
Shell的内建命令
所谓Shell内建命令,就是由Bash自身提供的命令,而不是文件系统中的某个可执行文件。
通常来说,内建命令会比外部命令执行得更快,执行外部命令时不但会触发磁盘I/O,还需要fork出一个单独的进程来执行,执行完成后再退出。而执行内建命令相当于调用当前Shell进程的一个函数。
有关的常用命令
-
确定是否为内建命令 :
type
cd为内建命令,vim为可执行文件
-
执行程序:“.”(点号)和 source
即使没有运行权限,也可以可以执行脚本文件。
-
别名:alias------------删除别名:unalias
使用
-
break和break 2 的区别
break退出当前循环,break 2 退出当前循环外面的循环
-
eval执行shell命令
kang@Mac :: ~/Downloads/PWN 127 » cmd="ls -l"
kang@Mac :: ~/Downloads/PWN » eval $cmd
-
export:将局部变量转化为全局变量(也就环境变量
第十三章 shell编程基础
三种变量:局部变量,全局变量(也就是环境变量),特殊变量
赋值和其他脚本语言类似
unset
:取消变量或者方法
kang@Mac :: ~/Downloads/PWN » unset cmd
kang@Mac :: ~/Downloads/PWN » eval $cmd
shell下的位置参数
首先是“位置参数”,位置参数的命名简单直接,比如,脚本本身为$0,第一个参数为$1,第二个参数为$2,第三个为$3,以此类推。
当位置参数的个数大于9时,需要用${}括起来标识,比如说第10个位置参数应该记为${10}。另外,$#表示脚本参数的个数总和,$@或$*表示脚本的所有参数。
声明数组
kang@Mac :: ~/Downloads/PWN 1 » arr=('name' 'sue')
echo $arr[1]
echo $arr[*]#输出所用元素
#数组截断操作
kang@Mac :: ~/Downloads/PWN » echo ${arr[2]:2:4}
e
单引号和双引号
单引号和双引号在很多时候是一样的,只是要记住,在双引号中的$符、反引号、转义符还是会被解析成其特殊含义,而在单引号中所有的字符都只是字面意思。
使用双引号括起的内容中,$PWD被解析成/root,而在单引号中只是按照原样输出“$PWD”字符。
命令执行替换
$(ls) 和 反引号 都是相同的效果
使用场景:命令替换是指将命令的标准输出作为值赋给某个变量
kang@Mac :: ~/Downloads/PWN » ppwwdd=`pwd`
kang@Mac :: ~/Downloads/PWN » echo $ppwwdd
/Users/Mac/Desktop/PWN
kang@Mac :: ~/Downloads/PWN » pwwd=$(pwd)
kang@Mac :: ~/Downloads/PWN » echo $pwwd
/Users/Mac/Desktop/PWN
计算运算符和其他语言类似,就不提了。
通配符在正则章节也说过了。