Shell
Linux 的启动过程
- BIOS-MBR-BootLoader(grub)-kernel-systemd-系统初始化-shell
- BIOS BIOS引导,基本输入输出系统,在主板上,引导硬盘或光盘
- MBR 硬盘主引导
- BootLoader 启动和引导内核的工具,选择哪一个内核以及版本
- kernel 内核,驱动硬件,然后初始化环境
- systemd 1号进程,加载内核模块
- 查看硬主引导记录
- dd if=/dev/sda of=mbr/bin bs=446 count=1
- hexdump -C mbr.bin 以十六进制方式查看,记录中有 55 aa 这个标记,说明硬盘是可引导的
shell 脚本的执行方式
-
组合命令 用分号隔开:cd /var ; ls
-
为了组合命令和多次执行,使用脚本文件来保存需要执行的命令,然后赋予该文件执行权限(chmod u+rx filename)
-
用文件编写脚本,一般在第一行编写:#!/bin/bash 声明脚本使用什么解释器进行解释
-
标准Shell脚本包含哪些元素
- Sha-Bang 在第一行用 #! 开头
- 命令
- “#”号开头的注释
- chmod u+x filename 可执行权限
- 执行命令
- bash ./filename.sh 会在当前bash进程下边创建一个子进程执行脚本。不用给脚本赋予执行权限也可以执行,执行完回到原目录
- ./filename.sh 也会产生一个子进程,使用Sha-Bang说明的解释器。需要对脚本赋予权限才可以执行,执行完回到原目录
- source ./filename.sh 在当前的进程中执行,需要对脚本赋予权限才可以执行,执行完停留在脚本的目录下
- . filename.sh 在当前的进程中执行,执行完停留在脚本的目录下
-
内建命令和外部命令的区别
- 内建命令不需要创建子进程,内建命令对当前Shell生效
管道与重定向
-
管道与管道符
- 管道也是进程通信的方式之一
- 管道符 “|”,将前一个命令执行的结果传递给后面的命令
- ps | cat
- echo 123 | ps
- 管道符两边若是外部命令,则会建立子进程。若是使用内部命令,建议将命令封装在脚本之内再去执行。若无必要,避免在管道符内使用内部命令。
-
子进程与子shell
-
重定向符号
- 一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符
- 输入重定向符号 "<"
- read var < /path/to/a/file
- 输出重定向符号
- ">" 清空文件后再进行输入
- ">>" 文件保持不变,在末尾追加输入
- “2>” 将错误的信息进行输出到指定文件
- “&>” 无论正确或错误的信息,都输出到指定文件
- 例:echo 123 > /path/a/file
- 输入和输出重定向组合使用
- cat > /path/a/file << EOF
- I am #USER
- EOF
变量
-
变量名的命名规则
- 字母、数字、下划线
- 不以数字开头
-
给变量赋值
- a=123 "="左右两边不允许出现空格,系统会认为左边是一条命令去执行
- let a=10+19
- l=ls 将命令赋值给变量
- letc=$(ls -l /etc) 将命令结果赋值给变量,使用$()或‘‘
- 变量中若有空格或特殊字符,可包含在" "或 ‘ ‘ 中
-
变量引用
- ${变量名} 引用变量,在部分情况下可以省略为 $变量名
-
变量一般作用在当前的shell进程和当前的终端中,若想要对当前进程也生效的话,使用 source 方式执行脚本
-
export + 变量,可以使子进程获取父进程的变量取值
-
环境变量:每个shell打开都可以获取的变量
-
set 和 env 变量
-
$? 上一条命令是否正确执行成功; $$ 显示当前进程的PID; $0 当前进程的名称;
-
$PATH 命令的搜索路径
- PATH=$PATH:/root 若一个命令文件放在/root 下面,通过这个方式将/root 添加到搜索路径下,则在任何地方都可以直接执行文件,从而执行命令。对当前终端和子shell生效,换其他终端则无效。
-
$PS1
-
-
位置变量
- $1 $2 $3 ... $9 ${10}
- pos=${1-_} 表示若$1的取值是空值,则用下划线给pos赋值;若$1有内容,则用$1赋值
-
环境变量配置文件
- 配置文件,保存在/etc 目录下面的配置文件,都是通用的,普通用户可用。~下面的配置文件,是用户的家目录配置文件
- /etc/profile 保存系统和终端启动时的配置文件,使用su - +用户名 时,这个文件第一个被加载。例如 su - root 依次加载的文件:
/etc/profile
.bash_profile
.bashrc
/etc/bashrc
以上顺序,若在定义变量时,在各个配置文件中若名称有重复,后面的执行的脚本会把前面的变量给覆盖掉。
若要使当前系统的所有终端都可用,使用下面语句:
export PATH=$PATH:/new/path 将该语句写入到上面的配置文件中,则父进程和子进程,以及所有终端都可以使用相关环境变量。 - /etc/profile.d/
- ~/.bash_profile
- ~/bashrc
- /etc/bashrc
- /etc/profile 保存系统和终端启动时的配置文件,使用su - +用户名 时,这个文件第一个被加载。例如 su - root 依次加载的文件:
- 在配置文件中添加环境变量后,如何生效?
- 关掉终端,重新打开
- source + 配置文件 执行,如 source /etc/bashrc
- 配置文件,保存在/etc 目录下面的配置文件,都是通用的,普通用户可用。~下面的配置文件,是用户的家目录配置文件
数组
- 定义数组
- IPTS=(10 11 12)
- 显示数组所有元素
- echo ${IPTS[@]}
- 显示数组元素个数
- echo ${#IPTS[@]}
- 显示数组的第一个元素
- echo ${IPTS[0]}
转义与引用
- 特殊字符
- "#" 注释, ";"分号,""转义符号,"""和"‘" 双引号和单引号
- " ‘ ` 双引号,单引号和反引号的区别。双引号不完全引用,包含变量的话会进行解释,单引号完全引用,包含变量的话不会进行解释。反引号用于执行命令。
- 由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释
- 由双引号括起来的字符,除 $、反引号 (`) 和反斜线 (\) 仍保留其特殊功能外,其余字符均作为普通字符对待。“$”表示变量替换;反引号表示命令替换;
- 反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分
算数运算
- expr 4+5 expr 只支持整数
- num=`expr 4+5`
- (( a=4+5 )) ; echo $a,双圆括号相当于 let 命令
特殊符号
- (),单独使用圆括号,会产生一个子进程。( abc=123 );echo $abc 时不会显示。
- [] 用于测试,相当于 test 命令,测试两个字符,判断文件类型以及对数字大小作比较。
如[ 5 -gt 4 ];echo $? - [[]] 双中括号用于表达式,如 [[ 5 > 4 ]];echo $?
- {},用于规定范围,如 echo {0..9}
退出与退出命令
- 退出程序命令
- exit
- exit 10 返回10给shell,返回值非0位不正常退出
- $? 判断当前shell前一个进程是否正常退出
- test 命令用于检查文件或者比较值