历史
GNU
即GNU's not Unix的缩写,一个类Unix操作系统,希望开发出一套自由软件环境的来取代Unix系统。操作系统包括:内核、shell、编辑器、编译器。当时唯独缺少内核,后来自由软件基金会FSF开始发展内核,命名为Hurd。林纳斯开发出了Linux,Linux并不是GNU项目的一部分,但是使用了许多GNU中的软件,Linux和GNU软件的结合,形成了完全自由的操作系统,该系统称为"GNU/Linux"或Linux。GNU依然在研发自己的Hurd,但是依然没有稳定的版本。
GNU计划开发了很多厉害的软件,这些软件也被一直到了其他操作系统(win,mac,unix)上,其中最出名的软件就是GCC。
自由软件
表示你可以直接获取源码,毕竟只有获取了源码才可能自由使用。但是免费软件你不一定获取到源码。
GCC
GNU compiler collection(GNU编译器套装),由GNU按照GPL规则开发的编译器(自由软件),亦是其他操作系统的标准编译器(特别是C语言)。GCC原本只能处理C,后来经过扩展可以处理Fortran,Pascal,Java,ada,Go以及其他语言。android的系统层也是属于Linux,故使用的是GCC,但是android的app运行在Dalvik虚拟机上,所以用的不是GCC。windows的应用大部分是自家vs编译器。mac和ios默认使用的也是GCC,后来变为clang和llvm。GCC(跨平台首选)在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。
Clang & LLVM
Apple对GCC编译器提出新增的要求,但是是被拒绝,于是LLVM诞生了。GCC代码耦合度太高,越是后期,质量越差。由于GCC是一个纯粹的编译系统,对IDE(xcode)配合很差,Apple无法使用LLVM 继续改进GCC的代码质量,便从零开始编写编译器前端,于是Clang诞生了。Apple的Clang是对C,C++,Objective-C的编译器前端,采用底层虚拟机LLVM作为编译器后端。Clang的目的是代替GCC,包括Clang前端和静态分析器。Clang输出代码对应的抽象语法树(AST),并将代码编译成LLVM bitcode,接着在后端用LLVM编译成平台相关的机器语言。Clang的编译速度和性能大幅高于GCC。GCC的兼容性是以牺牲性能得到的。
C++与Objective-C
二者都从C演化过来。Objective-C提供了运行期动态绑定。而C++ 是编译时静态绑定, 并通过嵌入类(多重继承)和虚函数(虚表)来模拟实现。Objective-C++即允许使用C++也可使用Objective-C。
编译器的前后端
编译器前端Parse,编译器后端Generator。词法分析、语法分析、语义分析被称为前端处理,生成AST,后面优化和目标代码生成称之为后端处理。想一下是否可以为不同的高级语言单独一个前端,不同的处理器架构写一个后端GCC + 不同的configuration可以实现。GCC真正的强大在于它是自由的,如果你的硬件添加新的功能,你可以在GCC编译器后端添加相应的指令。
MinGW-w64
Minimalist GNU for Windows:让GCC在windows上运行。下载x86_64-8.1.0-release-win32-seh:在windows上开发选择win32,在Linux,mac,unix选择posix;异常处理模式为seh。然后把其bin复制到环境变量中。cmd中gcc -v
查看是否成功。MinGW包括最基本的gcc-core、gcc-g++、binutils 和 MinGW runtime。gcc (gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是"预处理"和"编译",以及提供了与编译器紧密相关的运行库的支持。binutils 提供了一系列用来创建、管理和维护二进制目标文件的工具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析工具(readelf)、无效调试信息和符号的工具(strip)等。通常,binutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常工作的。glibc是gnu发布的libc库,也即c运行库。glibc是linux系统中最底层的api(应用程序开发接口),几乎其它任何的运行库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现,
gdb
gdb表示GNU symbolic debugger来调试源码,查找bug。如果没有bug,可以选择在生成版本时,选择-00到-03表示编译优化。
C语言来历
C语言由B语言演化而来,丹尼斯里奇最初为了开发Unix而制作,可以用于编写系统级软件,Unix/Linux/RDBMS(比如MySQL)
令牌Token
令牌可以是关键字、标识符、常量、字符串值,或者是一个符号。Token 是程序中对编译器有意义的最小元素,注意区别于字符集。关键字,标识符,常量,字符串,运算符,特殊符号;
Linux基础
-
什么是Linux?
Linux是一套类Unix的OS,继承了Unix以网络为核心。Linux是多用户多任务,DOS是单用户单任务(windows模拟DOS)。
-
Linux区别Unix
开源、GUI+CLI、硬件要求低、跨平台、易学习、安全低。Unix相反
-
Linux内核(大部分操作系统内核的作用相似)
内核控制着系统中所有的硬件和软件,执行软件、分配硬件。包括:系统内存管理、应用程序管理、硬件设备管理、文件系统管理。
-
Linux应用领域
网站:LAMP=Linux+Apache+MySQL+PHP。LNMP=Linux+Nginx+MySQL+PHP
-
体系结构
用户空间:应用程序、C库
内核空间 :系统调用接口、内核、平台架构相关的代码
用户→内核:1.系统调用、2.硬件中断
-
Bash区别cmd区别bat
shell:壳。连接用户与内核,命令解释器
bash(Bourne Again SHell):Linux的shell。区分大小写,
/
目录分割符,\
转移字符。cmd:windows的shell。
bat:DOS下的命令,bat文件表示批处理。
\
目录分割符,/
参数分割符。 -
开机启动过程
POST(加电自检)→加载BIOS→确定启动设备并加载boot loader→加载kernel初始化initrd→运行/sbin/init初始化系统→打印用户登陆提示符
-
Linux系统缺省:
缺省即默认。
-
日志文件
/var/log/message
-
桌面环境
KDE和GNOME
-
交换空间
swap space磁盘上临时保存内存中多余的程序和数据。
-
LILO
Linux loader将Linux操作系统加载到内存中
-
发行版本
三剑客
echo $?
grep
命令成功后返回0,没结果返回1,出现错误返回2
-
grep(global regular express print)查找
shellgrep [options] pattern [file] --color=auto -v 显示未匹配到的行 -f 从文件中获取pattern -i 忽略大小写 -n 第几行 -c 行数 -o 只显示匹配到的 -q 静默模式,不显示任何信息 -A 表示After -B 表示Before -C 表示Context -e 表示多个逻辑关系or grep -e 'cat' -e 'dog' file -w 匹配单词 -F 相当于fgrep,将pattern视为固定字符串 不懂的 -s -E 相当于egrep #例子 grep -n dog file grep -nv dog file grep ^d file grep g$ file grep 'do*' file区别grep -F 'do*' file
sed
stream editor:编辑到匹配的文本。需要学习正则表达式regex
shell
sed [-hnV][-e<script>][-f<script文件>] file
a add新增,目前的下一行
i insert插入,目前的上一行
c change代替
d 删除
p 打印
s stead取代
#例子
sed 3a\newLine file
sed /Linux/a\dog file
sed 3c\newLine file
sed /Linux/c\dog file
sed 3d file
sed /Linux/d file
sed 3i\newLine file
sed /Linux/a\dog file
sed -n 2p file #打印第二行
sed -n 2,5p file #打印2~5行
sed s/dog/cat/g file #替换。s表示取代,g表示全局
sed s/^/newstart/g file
sed 's/$/newend/g' file
sed s/a/A/3g file
#多行操作
sed -e s/LINUX/dog/g -e s/Linux/dog/g file
扩展
bash
+ g:将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
+ G:将hold space中的内容append到pattern space\n后
+ h:将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
+ H:将pattern space中的内容append到hold space\n后
+ d:删除pattern中的所有行,并读入下一新行到pattern中
+ D:删除multiline pattern中的第一行,不读入下一行
#文件名:1
1
2
3
//倒序
sed '1!G;h;$!d' 1 //第一行不执行G,最后一行不执行d
//打印1,1~2,...,1~9
seq 9|sed 'H;g'
//打印九九乘法表
seq 9|sed 'H;g'|awk -v RS='' '{for(i=1;i<=NR;i++)printf("%dx%d=%d%s",i,NR,i*NR,i==NR?"\n":"\t")}'
awk
(命名类似kmp)格式化文本。以行读入,并以空格为分隔符切片。l
bash
awk [选项参数] 'script' var=value file #script可以是 -f scriptfile。script单引号必须有
awk的变量分为内置变量和自定义变量
内置变量:
FS(Field Separator):输入字段分隔符, 默认为空白字符
OFS(Out of Field Separator):输出字段分隔符, 默认为空白字符
RS(Record Separator):输入记录分隔符(输入换行符), 指定输入时的换行符
ORS(Output Record Separate):输出记录分隔符(输出换行符),输出时用指定符号代替换行符
NF(Number for Field):当前行的字段的个数(即当前行被分割成了几列)
NR(Number of Record):行号,当前处理的文本行的行号。
FNR:各文件分别计数的行号
ARGC:命令行参数的个数
ARGV:数组,保存的是命令行所给定的各参数
自定义变量:
方法一:-v varname=value ,变量名区分字符大小写。
方法二:在program中直接定义。
awk '{print $1,$3,$0}' file #必须带有单引号,打印每行的1和3号单词。$0表示整行
awk -F, '{print $2}' file #以逗号为分隔符
awk -F '[ ,]' '{print $1,$2,$5}' file #以逗号和空格为分隔符
awk '/^this/' file #打印this开头的行
awk '/th/' file //带有th的行
awk '$2 ~ /th/ {print $2,$4}' file //第二个中带有th的行,并打印行的第二和第四个
awk '$2 !~ /th/ {print $2,$4}' file //取反,不解释
awk '!/th/ {print $2,$4}' file
awk 'BEGIN{IGNORECASE=1} /this/' file //忽略大小写
awk 'length>8' file //行长大于8的行
awk脚本
bash
#文件 score.txt
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
#文件cal.awk
#运行前
BEGIN {
math = 0
english = 0
computer = 0
printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
printf "---------------------------------------------\n"
}
#运行中
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
END {
printf "---------------------------------------------\n"
printf " TOTAL:%10d %8d %8d \n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}
$awk -f cal.awk score.txt
NAME NO. MATH ENGLISH COMPUTER TOTAL
---------------------------------------------
Marry 2143 78 84 77 239
Jack 2321 66 78 45 189
Tom 2122 48 77 71 196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
---------------------------------------------
TOTAL: 319 393 350
AVERAGE: 63.80 78.60 70.00
//计算所有txt的大小。不懂
ls -l *.txt | awk '{sum+=$5} END {print sum}'
shell脚本编程
- shell脚本
- 使用的变量
- 编程中条件、循环的使用
- 脚本的执行和调试
- 定义函数
- 算数运算
文件命令管理
- cat
- chmod
- chown
- cp
- find
- head
- less
- ln
- locate
- more
- mv
- rm
- tail
- touch
- vim
- whereis
- which
- grep
- wc
磁盘命令管理
- cd
- df
- du
- ls
- mkdir
- rmdir
- pwd
网络通讯命令
- ifconfig
- iptables
- netstat
- ping
- telnet
系统+备份
- date
- free
- kill
- ps
- rpm
- top
- yum
- bzip2
- gzip
- tar
- unzip
情绪:人活着总要做些有意义的事情,否则和死了有什么区别,我正因此而活着。客观跳出自己。
逻辑:本质(大道至简) + 回顾。
行为:做出来。
x+100 = n^2^
x+268 = m^2^
(m-n)(m+n) = 168;可知i=m-n;j=m+n均为偶数;