第三章
LSB(Linux Standard Base),FHS(Filesystem Heirarchy Standard):
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader,grub)都存放于此目录,一般单独分区
/bin:供所有用户使用的基本命令:不能关联至独立分区,OS启动时即会用到的程序;
/sbin:管理类的基本命令:不能关联至独立分区,OS启动即会用到的程序;
/lib:基本共享库文件,以及内核模块文件(/lib/modules);
/lib64:专用于x86_64系统上的辅助共享库文件存放位置;
/etc:配置文件目录
/home/USERNAME:普通用户家目录;
/root:管理员的家目录;
/media:便携式移动设备挂载点;
/mnt:临时文件系统挂载点;
/dev:设备文件及特殊文件存放位置:
b:块设备,随机访问;
c:字符设备,线性访问;
/opt:第三方应用程序存放位置;
/srv:系统上运行的服务用到的数据;
/tmp:临时文件目录;
/usr:universal shared,read-only data;
bin:保证系统拥有完整功能而提供的应用程序;
sbin:
lib:
lib64:
include:C程序的头文件存放目录
local:第三方应用程序的安装位置(取代opt),独立的层级结构:
bin、sbin、lib、lib64、include 等。
/var:variable data directory:
cache:应用程序缓存数据目录;
lib:应用程序状态信息数据;、
local:专用于/usr/local下的应用程序存储可变数据
lock:锁文件;
log:日志目录
opt:为opt目录下的应用程序存储可变数据;
run:运行中的进程相关的数据;通常用于存储进程的pid文件;
spool:应用程序数据池;
tmp:保存系统两次重启之间产生的临时数据;
/proc:用于输出内核与进程信息相关的虚拟文件系统
/sys:用于输出当前系统上硬件设备相关的虚拟文件系统;
/selinux:security enhanced linux,selinux相关的安全策略等信息存储位置;
Linux应用程序的组成部分:
二进制程序:/bin,/sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
库文件:共享库和程序自身的库文件,/lib,/lib64,/usr/lib 等;
配置文件:/etc,/usr/local/etc等
帮助文件:/usr/share/man,/usr/share/doc等;
系统管理类命令:关机、重启、用户登录
halt:调用shutdown -h关机
shutdown:执行关闭进程,写入磁盘等系列操作后,init 0关机或init6重启
poweroff:关闭操作系统后,会向电源发送信号,切断电源(指向halt -p)
reboot:调用shutdown;
init 0:
关机:halt,poweroff,shutdown,init 0;
重启:poweroff --reboot
shutdown --reboot
reboot
init 6
-f:强制关机,不建议选项
-p:切断电源
shutdown time选项:
now:立即
0:立即
+#:提交命令后#分钟后关机(默认单位minute)
hh:mm:具体时间
用户登录信息:who、whoami,w
whoami:当前登录的有效用户
who:当前系统的所有用户会话
w:当前系统的所有用户会话及当前动作
bash的基础特性:
1、命令历史(见笔记02)
2、命令补全
3、路径补全
4、命令行展开:
~:展开为用户家目录
~USERNAME:展开为指定用户家目录
{}:承载一个以逗号分隔的列表,拆分为多个路径
5、命令的执行状态返回结果,0(成功),1-255(错误)
bash使用特殊变量$?保存最近一条命令的执行状态结果;
6、命令别名:alias
alias:显示当前shell所有可用别名
alias name=‘value’:设定别名;仅对当前shell有效
unalias name:撤销别名
\command:执行命令本身不执行同名的别名
~/.bashrc:对此家目录的用户有效;
/etc/bashrc:对所有用户有效;
7、glob:通配符,用于实现文件名‘通配’
*:任意长度的任意字符;
?:单个的任意字符;
【】:指定范围内的单个字符;
【^】:指定范围外的单子字符;
专用字符集:
[[:space:]]:空格 [[:digit:]]:数字
[[:alpha:]]:大小写字母 [[:alnum:]]:大小写字母及数字
[[:lower:]]:小写字母 [[:upper:]]:大写字母
[[:punct:]]:标点符号
8、bash快捷键:
ctrl+a、ctrl+e、ctrl+u,ctrl+k
9、bash的I/O重定向及管道:
file disctribtion:文件描述符,每个打开的文件都有一个id
标准输入:键盘,0
标准输出:monitor,1
标准错误输出:monitor,2
I/O重定向:改变输入输出的标准位置
输出重定向:
【1】>:标准输出覆盖重定向;
>>:标准输出追加重定向;
# set -C:禁止将内容覆盖输出至已有文件中;
#set +C:允许。。。。
2>:标准错误输出覆盖重定向
2>>:
&>:标准输出和标准错误输出覆盖重定向
&>>:
例:command > file1 2> file2
输入重定向:<
Here Documentation:<<
cat << EOF;
管道:
COMMAND | COMMAND2 | COMMAND3 ....
10、提供编程环境:
编程风格
过程式:以指令为中心处理数据,组织代码解决问题;
C,C++,java;
代码执行方式:顺序执行、选择执行、循环执行
对象式:以数据为中心,设计数据结构组织数据,并提供此类数据可被允许的处理操作;
shell、perl、python;
程序运行方式:
编译型:程序执行前,由编译器先完整编译成可执行的二进制文件;
源代码-->编译器-->
解释型:程序执行前,不进行完整编译,执行时,由解释器边解释边执行;
变量类型约束:
强类型:严格区分变量类型,变量类型不轻易转化;参与运算必须符合类型要求;
调用未声明变量会产生错误;
弱类型:数据类型可以被忽略;默认为字符型,参与运算时会自动进行隐式类型转换;
程序运行时结构:
动态语言:运行时可改变程序结构的语言;
静态语言:运行时不可改变程序结构的语言;
数据类型检查:
动态类型语言:运行时进行数据类型检查;
静态类型语言:编译期间(或运行前)确定数据类型;
库调用方式:??
动态:编译时,共享库对象不编译进文件;??
静态:编译时,共享库对象编译进文件;??
shell编程:过程式、解释执行、弱类型
编程语言的基本结构:
数据存储:变量、数组
表达式:算术表达式、比较表达式、逻辑表达式等
语句:if、while、until、for等
格式:
shebang:#!/bin/bash
#!/usr/bin/python
由于脚本文件是文本格式,cpu无法直接运行,这里指定cpu上真正
运行的解释器程序,而把此文件作为解释器的运行参数(cpu通过
二进制代码的magic number识别要运行程序的格式exe?elf?);
代码:
echo “hello world”;
。。。
变量:命名的内存空间
文本数据存储格式:大致分为字符型、数值型;
变量类型的作用:
1、数据存储的格式;
2、数据参与的运算;
3、表示的数据范围;
11、变量种类:
本地变量:只在当前shell进程生效,此shell进程的子进程或其他shell进程无效;
环境变量:当前shell进程及其子进程生效(su - USER会读取指定用户的环境变量,此时不生效),export
局部变量:只在shell进程中某代码片段生效(一般指函数),local;
位置变量:$1,$2,$3,$4。。。
特殊变量:$?,$0(脚本文件名),$#(传递给脚本的参数个数),$@,$*
$@,$*:都表示传递给脚本的参数列表,但带有双引号的引用时略有不同:
“$@”:所有参数是一个列表,传递给其它命令时是多个参数;
“$*”:所有参数当做一个整体,传递给其它命令时是一个整体;
shift #:脚本的第#+1及后面的参数成为脚本的参数列表,第#+1个参数位置变更为$1;
本地变量:
变量赋值:name=value
1、name=string;给定字符串
2、name=$(var);把其它变量的值赋值给此变量
3、name=`command`或name=$(command);把命令结果存储为变量;
变量引用:$[var],括号一般情况可省
“$[var]”:弱引用,内容替换为变量值;
‘$[var]’:强引用,内容为$[var];
Note:使用发现,变量引用时:
$(var):用于引用命令结果,引用变量时报错;
$[var]或${var}:用于引用变量;
set:显示所有已设定的变量;
unset:撤销已有变量
环境变量:
变量赋值:
export name=value
declare -x name=value
变量引用:$(var),$var
变量撤销:unset
显示系统环境变量:
env、printenv、export
变量命名规则:
1、不要使用程序中的保留字(如if,for,in等);避免跟其他类型或此类型变量重名;
2、有字母、数字和下划线组成,不能以数字开头(也不以_开头,避免跟其他程序的内置变量重名);
3、命名要尽量见名知意;
12、配置文件:
全局配置生效:/etc/bashrc、/etc/profile、/etc/profile.d
个人配置生效:~/.bashrc、~/.bash_profile
profile类:为交互式登录的shell提供配置(也有部分为非交互式登录shell提供配置);
1、“su - username”或“su -l username”登录的shell;
2、通过终端输入账户密码登录的shell;
一般在此文件中:
1、定义环境变量;2、定义命令或脚本;
交互式登录shell配置文件读取顺序:
/etc/profiel--> /etc/profile.d/*.sh--> ~/.bash_profile-->
~/.bashrc-->/etc/bashrc
bashrc类:为非交互式登录的shell提供配置(也有部分为交互式登录shell提供配置);
1、“su username”登录的shell;
2、图形界面打开的模拟终端;
3、执行脚本时打开的shell进程
一般在此文件中:
1、定义本地变量;2、定义命令别名;
非交互式登录shell配置文件读取顺序:
~/.bashrc--> /etc/bashrc --> /etc/profile
13、bash的算术运算:+,-,*,/,%,**等:
实现算术运算:
1、let var=算术表达式;例,let mul=$a*$b;
2、var=$[算术表达式];例,mul=$[$a*$b];
3、var=$((算术表达式));例,mul=$(($a*$b));
4、var=$(expr $1 $2 $3 ...);例,mul=$(expr $a \* $b)
BASH内建的随机数生成器:$RANDOM
$[$RANDOM%30+1]:随机生成1-30的整数;
自增、自减等运算:+=、-=、/=,*=,%=
let var+=1 同let var++
let var-=1 同let var--
14、条件测试:(获取帮助:“man bash”或test命令用法)
测试命令:
test EXPRESSION;
[ EXPRESSION ];
[[ EXPRESSION ]];
Note:条件表达式的前后必须要有空格;
数值测试:
-gt、-eq、-ge、-lt、-le、-ne
字符串测试
==/=,!=,-z,-n
<,>:字符串大小比较(比较ASCII码,很少用)
=~:比较左侧的字符串是否匹配右侧的模式,此表达式一般使用“[[ ]]”;
不要求左侧完全匹配右侧,左侧内容有部分匹配即满足条件(左侧部分或整体包含右侧);
Note:用于字符串比较的操作数都应该使用双引号,如:
[ “hello” = “hi” ],hello和hi都用使用双引号
文件测试:
存在:-a,-e
类型:-f,-d,-L,-b,-c,-S,-p,-h
权限:-r,-w,-x(注意root用户的特殊性)
特殊权限:-g(sgid),-u(suid),-k(sticky)
大小:-s(非空)
是否打开:
-t fd:fd(表示文件描述符)是否已经打开并且与某终端相关;
其他:
-N:文件自上一次被读取后是否被修改过;(上次读取文件时是否做过修改操作或者输入重定向到此文件)
-ef:是否为同一个文件(可用于硬链接)
-nt:new than(比较的是ls -l显示的时间,即文件modify时间)
-ot:old than
-O:当前有效用户是否为文件属主;
-G:属组
组合条件测试:
1、用于语句之间:||,&&,!
id user &> /dev/null || useradd user;
2、用于测试表达式内部:-a,-o
[ -e file -a -r file ]
示例:
[ -e file ] && [ -w file ];
[ -e file -a -w file ];
[ ! -r file -a !-w file ],! [ -r file -o -w file ],
[ ! \( -r file -a -w file \) ],[ ! -r file ] && [ ! -w file ];
15、bash脚本控制语句:exit,return,continue,break
exit #:到此语句时立即终止脚本,并返回“#”状态码;如为指定“#”或未定义exit,
则返回脚本最后执行命令的状态码
16、bash数组
特性:
▲不支持多维数组,只支持一维数组;
▲使用前无须事先声明;(关联数组使用前要声明)
调用一个事先未存在的数组元素,其值为空,做数学运算时其值为0;
▲普通数组下标为从0开始的整数,支持算术表达式(结果为整数)、支持稀疏格式;
关联数组下标可以是任意字符串,称为键值对,键唯一而值可以不唯一;
用法:
数组声明:
declare -a array:声明数组;
declare -A array:声明关联数组;
数组元素赋值:
单个元素赋值:
weekdays[a]=“monday”
一次赋值全部元素:
weekdays=(“monday” “tuesday” “thirsday” “wensday”)
一次赋值多个元素:
weekdays=([0]="monday" [2]="tuesday" [3]="thirsday")
用户交互赋值:
read -a ARRAY
关联数组赋值:
weekdays[a]="monday"
weekdays=([a]="monday" [b]="tuesday" [c]="wensday")(awk的关联数组
测试不支持此种格式的多个元素同时赋值)(bash的赋值事先要声明)
数组元素引用:
引用单个数组元素:
${array[index]};
index省略表示引用${array[0]}
引用全部数组元素:
${array[@]}
${array[*]}
引用数组元素个数:
${#array[*]};
${#array[@]};
遍历素组元素
for i in ${array[@]};
for i in ${array[*]};
遍历素组元素下标:
for i in ${!array[@]};
for i in ${!array[*]};
数组切片:
${array[@]:offset:number}
offset:从开头开始要跳过的数组元素;
number:从跳过的素组元素末开始要选取的数组元素;
${array[@]:offset}
去除数组前面的n个元素,取剩余的所有元素;
向数组中追加元素:非稀疏格式
array[$[${#array[@]}-1]]="value"
删除数组和元素:
unset array[index]:删除数组元素;
unset array:删除数组;
基本命令:mkdir,rmdir,tree、pstree、declare、typeset、export:
mkdir:
-p:存在时不报错,不存在时按需创建;
-v:显示详细信息;
-m MODE:创建目录时直接指定权限;
tree:
-d:只显示目录;
-l #:按指定层级显示;
-P pattern:只显示由pattern匹配的路径;
rmdir:
-v:显示过程;
-p:逐级删除空目录;
文件查看命令:
cat,tac、more、less、tail、head、touch
tail | head:
-c #:指定获取前|后#个字节;
-【n】 #:指定获取前|后#行;
tail -f:持续追踪文件尾部
touch:文件的时间戳管理工具:
access time:访问时间,atime,读取文件内容
modify time:修改时间,mtime,指文件有过编辑动作(内容不一定改变)
change time:改变时间,ctime,元数据发生改变;
未知?:
访问文件atime发生改变时,ctime未改变;
touch修改文件atime时,ctime一同改变
-c:不创建文件,当文件存在时才修改时间戳;
1、写一个脚本:计算/etc/passwd中第10个用户和第20个用户id之和;
2、写一个脚本:传递两个文件路径给脚本,计算两个脚本中空白行之和;
3、写一个脚本:统计/etc,/var,/usr下共有多少一级子目录和文件;
4、写一个脚本:接受一个用户路径做参数,如果参数个数小于1,则提示并退出;
如果参数个数大于等于1,则统计所有给出文件的空白行之和;
1、汇编代码是什么格式的?
2、二进制文件:除由ASSIC码组成的纯文本以外的所有文件;
3、编译器编译后的代码文件格式是二进制文件,是机器代码?汇编代码?还是其他?
描述程序源代码从编译到执行的完整过程?
4、描述解释型语言所编写程序执行的完整过程?
5、编译器或解释器可以完成从源代码到机器代码的直接转化吗?
试答:不行,编译器或解释器是基于系统调用或库或少量机器代码开发的;
从高级编程语言到机器语言的超量工作,基于减少重复工作和明晰结构进行了分工;
汇编语言完成对对应硬件机器代码的转化,并向上层提供较为易用的调用接口;
操作系统(一般为C语言)面向各个硬件的汇编接口,并向上层提供更为易用的系统
调用或库调用接口;
其他高级语言基于操作系统提供的接口进行便捷开发;
会发生少量跨层级的接口调用;
提交到硬件上运行的代码为汇编代码,在硬件内部实现汇编代码到机器代码的转换??
任务:寻找相关书籍,完整地系统性地理解整个代码运行流程
6、动静态语言和动静态类型语言?动静态类型语言和强弱类型语言?
/电子书/fhs-2.3