评测知识点(PHP基础,LINUX基础)
php基础:
- 语言语法基础语言语法基础
(基础语法太多了没办法总结)
- 反射
参考资料:
https://www.cnblogs.com/lonelyxmas/p/8183520.html http://php.net/manual/zh/book.reflection.php
定义:它是指在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。这种动态获取的信息以及动态调用对象的方法的功能称为反射API。
相关类:
Reflection | 为类的摘要信息提供静态函数export() |
ReflectionClass | 类信息和工具 |
ReflectionMethod | 类方法信息和工具 |
ReflectionParameter | 方法参数信息 |
ReflectionProperty | 类属性信息 |
ReflectionFunction | 函数信息和工具 |
ReflectionExtension | PHP扩展信息 |
ReflectionException | 错误类 |
相关操作:
ReflectionClass::export() 获取类信息,提供类的几乎所有的信息,包括属性和方法的访问控制状态、每个方法需要的参数以及每个方法在脚本文档中的位置。
ReflectionClass::getFileName()获取类的绝对路径。
ReflectionClass::getMethods()获得ReflectionMethod对象的数组。
ReflectionMethod::getDocComment()获取方法注释。
ReflectionMethod::getParameters()方法返回ReflectionParameter对象数组。
使用场景:
权限添加
- 异常和错误处理机制
参考资料:
http://php.net/manual/zh/book.reflection.php
http://php.net/manual/zh/function.set-error-handler.php
http://php.net/manual/zh/function.register-shutdown-function.php
http://www.w3school.com.cn/php/php_exception.asp
http://php.net/manual/zh/language.errors.php7.php
PHP中什么是错误:
属于php脚本自身的问题,大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行的情况。
PHP错误级别:
Fatal Error:致命错误(脚本终止运行)
Parse Error:编译时解析错误,语法错误(脚本终止运行)
Warning Error:警告错误(仅给出提示信息,脚本不终止运行)
Notice Error:通知错误(仅给出通知信息,脚本不终止运行)
自定义PHP错误处理:
set_error_handler($error_handler,$error_types);注册一个函数处理PHP的错误($error_handler:函数名称,$error_type错误等级),但不会一下级别的错误:E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、E_COMPILE_ERROR、 E_COMPILE_WARNING。自定义函数可接受到错误级别、错误信息、错误文件名、错误发生的行数、错误发生时用的的变量数组四个参数。
trigger_error($errmsg,$errtype)函数:
函数创建用户级别的错误消息。$errmsg:错误信息。$errtype:错误类型 E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE(默认)。自定义错误可有上诉函数捕获。
register_shutdown_function()函数处理无法捕获的错误:
register_shutdown_function:注册一个会在PHP脚本执行完成之后调用的函数(包括因为错误导致的终止。可以注册多个函数,系统会依次调用)。使用 error_get_last()函数获取最后的错误信息,把错误信息传递给注册的函数可以处理一些致命的PHP错误。
PHP中什么是异常:
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。我自己认为:业务上出现的错误都可以称之为异常。
异常产生与处理:
通过关键字throw,抛出一个异常类。通过try-catch结构捕获异常。一个throw应该至少有个一个catch去捕获。也可以多个catch去捕获不同的异常。
set_exception_handler()函数:
注册一个函数,去处理未被捕获的异常。
错误异常统一处理思想:
PHP7以前:注册错误处理函数,把错误变成异常抛出,用异常处理机制统一处理。
PHP7:使用throwable类捕获异常,他可以捕获异常机错误。
- 正则表达式
参考资料:
http://www.runoob.com/regexp/regexp-syntax.html
https://www.cnblogs.com/mingxiastory/p/5426913.html
定义:描述了一种字符串匹配的模式。
组成:正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成。
结构:分为三个部分,分隔符,表达式和修饰符。例如:/hello.+?hello/is。"/"就是分隔符。两个"/"之间的就是表达式,第二个"/"后面的字符串"is"就是修饰符。
元字符:
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 \[。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 \{。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 \|。 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 |
限定符
定位符
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。 |
\b | 匹配一个单词边界,即字与空格间的位置。 |
\B | 非单词边界匹配。 |
预定义字符集:
“\d”-->[0-9]-->1位数字
“\w”-->[0-9a-zA-Z_]-->1位字母,数字或_
“\s”-->1位空字符:匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
“ . “: 除换行回车外的任何一个字符,如:
"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;
"^.{3}$":表示有任意三个字符的字符串(长度为3个字符)
\t--------匹配一个制表符
预定义字符的反义:预定义字符的大写形式都是小写的反义
\D---->1位非数字字符
\S------匹配任何非空白字符。等价于 [^\f\n\r\t\v]。
\v------匹配一个垂直制表符
\n------匹配一个换行符
\r-------匹配一个回车符
其他匹配
[:alpha:]:匹配任何字母
[:alnum:]:匹配任何字母和数字
[:digit:]:匹配任何数字
[:space:]:匹配空格符
[:upper:]:匹配任何大写字母
[:lower:]:匹配任何小写字母
[:punct:]:匹配任何标点符号
[digit:]:匹配任何16进制数字
正则表达式的贪婪与非贪婪匹配
如:String str="abcaxc";
Patter p="ab.*c";
贪婪匹配:正则表达式一般趋向于最大长度匹配,也就是所谓的贪婪匹配。如上面使用模式p匹配字符串str,结果就是匹配到:abcaxc(ab.*c)。
非贪婪匹配:就是匹配到结果就好,就少的匹配字符。如上面使用模式p匹配字符串str,结果就是匹配到:abc(ab.*c)。
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
- PHP模板引擎
参考资料:
https://blog.csdn.net/sinat_30603081/article/details/77671685
https://www.jb51.net/article/66731.htm
https://blog.csdn.net/u013474436/article/details/50010955
https://www.baidu.com/link?url=7vjOo6xuy-RtYRnOd9z3EXPIXQ54Su0Z87DSCdVgnEZLsqiXaUZYyUrokO-hV38B&wd=&eqid=ff8f4c6f00007e2e000000055bfcbf27
定义:通过定义操作标签,将HTML页面与PHP完全分离的功能代码。
六中模板引擎:
Smarty算是一种很老的PHP模板引擎了,它曾是我使用这门语言模板的最初选择。虽然它的更新已经不算频繁了,并且缺少新一代模板引擎所具有的部分特性,但是它仍然值得一看。
Twig是来自于Symfony的模板引擎,它非常易于安装和使用。它的操作有点像Mustache和liquid。
HAML移植了同名的Ruby模板语言。注意,HAML使用的缩进模式(例如像Python)可能在最初会给你带来一定的困扰(而一旦你熟悉这种模式之后便会上瘾)。
Liquid:生成Shopify(以及原始的Ruby),Liquid是在限制用户权限的同时又可使其自定义页面服务风格的完美语言。此外,这个语言是跨平台的,并且相同的模板可在PHP和Ruby中交替使用。
Mustache:作为多种语言的模板,Mustache可以兼容所有能够想到语言的模板(例如,甚至包括bash)。
Plate受到Twig启发,重载了PHP的原生特性。如果你不想使用需要编译的模板语言,它可以为你大开方便之门。
我们大部分使用smarty模板引擎,TP内置的也是smarty模板引擎。这里只介绍一下smarty模板引擎。
Smarty:
1. 速度:采用smarty编写的程序可以获得最大速度的提高,这一点是相对于其它的模板引擎技术而言的。
2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将WEB请求直接转换到这个文件中,而不再进行模板重新编译(在源程序没有改动的情况下)
3. 缓存技术:smarty选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页,当设定smarty的cache属性为true时,在smarty设定的cachetime期内将用户的WEB请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTML文件。
4. 插件技术:smarty可以自定义插件。插件实际就是一些自定义的函数。
5. 模板中可以使用if/elseif/else/endif。在模板文件使用判断语句可以非常方便的对模板进行格式重排。
运行原理:
其实所有的模板引擎的工作原理是差不多的,无非就是在php程序里面用正则匹配将模板里面的标签替换为php代码从而将两者混合为一个php的混编文件,然后执行这个混编文件。
例如:
将
<body> <div>{subject}</div> <div>{content}</div> </body>
通过smarty模板引擎改变为:
<body> <div><?php echo $subject ?></div> <div><?php echo $content ?></div> </body>
然后执行该文件。
还有许多其他的标签:
{if}{else}{/if} 为php 的 if {}else{}
{for}{/for} 为 php 的 for{}
等
- PHP网络函数
http://www.php.net/manual/zh/ref.network.php
https://blog.csdn.net/phphot/article/details/2755880
十个比较重要的网络函数:
getmxrr($hostname,$mxhosts):
该函数用来恢复某个特定主机的MX(邮件交换记录)主机名称。用这个函数来确认某个域的邮件主机,通常以验证那个域上的一个邮箱开始。
gethostbyaddr($ip):
该函数用来恢复与一个IP有关的主机名。用此函数执行一个逆DNS查找,把一个名称给某个IP地址——如记录您的网络服务器日志的IP地址。
gethostbyname($name):
该函数与gethostbyaddr()函数互逆,恢复与主机有关的IP地址。用此函数执行一个标准的DNS查找,获得与IP地址有关的主机名——例如自动将有疑点的域列入黑名单时。
p2long($ip)和long2ip($long):
这些函数将由符号连接的四个小于255的数字代表的IP地址转换成整数,或进行逆操作。
在您需要用整数格式表示IP地址(通常用于数字计算),或用IP地址表示数字格式时,应用这些函数。
checkdnsrr($host, $type)
该函数在DNS中检查与$host主机相符的$type类型记录,如发现,即返回布尔真值。用此函数检查主机中是否存在某个特定的DNS记录类型。
dns_get_record($host, $type):
该函数返回$host主机的DNS记录。可选的$type参数只可用来恢复那些与一个特定的类型匹配的子集。用此函数恢复某个特殊主机的详细DNS记录。
getprotobyname($num)和getprotobynum($name):
这些函数从泛系统/etc/protocols文件中恢复协议名称与号码。
用这些函数根据名称或号码来恢复系统协议信息。
getservbyname($service, $protocol):
该函数利用$protocol协议,从泛系统/etc/services文件中为$service服务恢复端口号码。
用此函数自动获得运行系统服务的端口信息。
inet_ntop($addr)和inet_pton($addr):
这些函数在二进制与人可读地址间转换IP地址。
用此函数在Ipv4/Ipv6地址字符串与二进制表达法间进行转换。
syslog($level, $msg):
这个函数利用警告级别$level将$msg信息记录到系统日志设备中。
用此函数发布泛系统错误或警告。
- 缓存机制和优化
参考资料:
http://www.cnblogs.com/usa007lhy/p/5421545.html
PHP自带output buffer缓存。
首先output_buffering=On打开php缓存。
php自带缓存指令:
ob_start() //开启缓存
ob_clean() //清空缓存
ob_end_clean() //清空缓存,关闭缓存
ob_flush() //刷新缓存(将缓存现有内容输出)
ob_end_flush() //刷新缓存,并关闭缓存
$contents = ob_get_contents() //获得缓存内容
file_put_contents("d:/log.txt",$contents) //将缓存内容打印到文本
flush与ob_flush区别
flush()是输出程序缓存指令;
ob_flush()是输出自带缓存指令;
- 调试、单元测试压测
调试:平常调试都是使用var_dump(),exit(),断点输出。Php还有一个调试方法Xdebug扩展。
参考资料:
https://www.cnblogs.com/anyeshe/p/5746404.html
https://blog.csdn.net/kikajack/article/details/81021061
(只要安装方法,没有具体使用方法)
单元测试:单元测试是对单独的代码对象进行测试的过程,比如对函数、类、方法进行测试。在PHP领域,单元测试的工具主要有 PHPUNIT,PHPUNIT2和SimpleTest三种。
参考资料:
https://www.oschina.net/translate/php-unit-testing-with-phpunit
PHPUnit介绍:
PHPUnit是一个用PHP编程语言开发的开源软件,是一个单元测试框架。PHPUnit使用断言来告诉你你所测试的代码是否如你预期那样工作。
压测:
参考资料:
https://www.jianshu.com/p/ef4c1dc329bd
介绍:压力测试指的是检测项目同时能够承受最大的访问量。
方法:
ab的全称是Apache Bench,能够测试网站在一定时间内的发生高并发时的反应。用法:
ab -c 并发数 -n 请求数 URL。
ab参数:
-n //在测试会话中所执行的请求个数。默认时,仅执行一个请求
-c //一次产生的请求个数。默认是一次一个。(如果请求的总数是1000,请求的总用户是10,那么平均每个用户执行100次请求)
-t //测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
-p //包含了需要POST的数据的文件.
-T //POST数据所使用的Content-type头信息
-v //设置显示信息的详细程度 – 4或更大值会显示头信息, 3或更大值可以显示响应代码(404, 200等), 2或更大值可以显示警告和其他信息。
-V //显示版本号并退出。
-w //以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。
-i //执行HEAD请求,而不是GET。
-x attributes String to insert as table attributes//
-y attributes String to insert as tr attributes//
-z attributes String to insert as td or th attributes//
-C attribute Add cookie, eg. ‘Apache=1234. (repeatable)//-C cookie-name=value 对请求附加一个Cookie:行。 其典型形式是name=value的一个参数对。此参数可以重复。
-H attribute Add Arbitrary header line, eg. ‘Accept-Encoding: gzip’Inserted after all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributesare a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributesare a colon separated username and password.//-P proxy-auth-username:password 对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。
-X proxy:port Proxyserver and port number to use-V Print version number and exit-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-h Display usage information (this message)//-attributes 设置 属性的字符串. 缺陷程序中有各种静态声明的固定长度的缓冲区。另外,对命令行参数、服务器的响应头和其他外部输入的解析也很简单,这可能会有不良后果。它没有完整地实现 HTTP/1.x; 仅接受某些’预想’的响应格式。 strstr(3)的频繁使用可能会带来性能问题,即, 你可能是在测试ab而不是服务器的性能。
- 数据库操作函数(以mysql为例,其他的数据库也有扩展函数)
参考资料:
https://www.cnblogs.com/shenzikun1314/p/8336207.html
PHP链接mysql三种方法:
PHP的MySQL扩展是设计开发允许php应用与MySQL数据库交互的早期扩展。MySQL扩展提供了一个面向过程的接口,并且是针对MySQL4.1.3或者更早版本设计的。因此这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端进行交互,但并不支持后期MySQL服务端提供的一些特性。由于太古老,又不安全,所以已被后来的mysqli完全取代;
PHP的mysqli扩展,我们有时称之为MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性。其特点为:面向对象接口 、prepared语句支持、多语句执行支持、事务支持 、增强的调试能力、嵌入式服务支持 、预处理方式完全解决了sql注入的问题。不过其也有缺点,就是只支持mysql数据库。如果你要是不操作其他的数据库,这无疑是最好的选择。
PDO是PHP Data Objects的缩写,是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以使得你的PHP应用不去关心具体要连接的数据库服务器系统类型,也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器,比如从Oracle 到MySQL,仅仅需要修改很少的PHP代码。其功能类似于JDBC、ODBC、DBI之类接口。同样,其也解决了sql注入问题,有很好的安全性。不过他也有缺点,某些多语句执行查询不支持(不过该情况很少)。(PDO能够支持mysql、sqlserver及oracle,PostgreSQL SQLite 3)。
MySQL扩展访问数据库函数:
http://www.php.net/manual/zh/ref.mysql.php
MySQLI扩展访问数据库函数:
https://www.runoob.com/php/php-ref-mysqli.html
PDO访问数据库的方法:
https://www.runoob.com/php/php-pdo.html
- SQL注入漏洞防范。
参考资料:
https://www.cnblogs.com/mafeng/p/5939329.html
http://www.w3school.com.cn/php/func_string_addslashes.asp
https://www.jb51.net/article/49205.htm
http://www.cnblogs.com/mafeng/p/6306096.html
打开magic_quotes_gpc :
设置php配置magic_quotes_gpc = On,自动把用户提交对sql的查询进行转换,比如把 ' 转为 \'等。
addslashes()函数:
函数返回在预定义字符之前添加反斜杠的字符串。默认地,PHP 对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。所以您不应对已转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。
mysql_real_escape_string函数:
类似addslashes函数在预定义字符之前添加反斜杠的字符串。但是addslashes不会检查编码。对不认识的编码字符也会去转义。mysql_real_escape_string函数修补了这一漏洞。mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string ,两者的区别是:mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。
参数化查询
在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才 套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、SQL Server、MySQL、SQLite等常用数据库都支持参数化查询。(pdo,mysqli支持参数化查询)。
其他:
对传入的参数进行数据类型的验证,长度的验证,使用str_place替换调特殊字符。如把%替换为\%,等等,也可以简单的防止注入。
- PHP扩展开发
参考资料:
http://www.php.cn/php-weizijiaocheng-392678.html
https://www.cnblogs.com/boystar/p/6904795.html
(扩展看不同,真的复杂,上面两个链接敬请参考)
LINUX知识点
- 常用命令
参考资料
https://www.cnblogs.com/fnlingnzb-learner/p/5831284.html
cd
ls
ls -F 查看目录中的文件
ls -l 显示文件和目录的详细资料
ls -a 显示隐藏文件
mkdir dir1 dir2 同时创建两个目录
mv dir1 new_dir 重命名/移动 一个目录
cp file1 file2 复制一个文件
find / -name file1 从 '/' 开始进入根文件系统搜索文件和目录
Whereis 该指令只能用于查找二进制文件、源代码文件和man手册页
groupadd group_name 创建一个新用户组
useradd user1 创建一个新用户
passwd 修改口令
chmod 修改权限
chown 修改所属组所属人
Cat 获取文件内容
Vi vim 编辑文件
rm 删除
shutdown 关机
Reboot 重启
Man 查看命令的信息的命令
命令有很多,我在操作linux过程中这些命令觉得比较基础需要去记住。
- 网络操作
https://blog.csdn.net/WXXGoodJob/article/details/72642516
https://www.cnblogs.com/tian-yong/p/4497324.html
https://blog.csdn.net/li_101357/article/details/70256411
- 常用工具
https://blog.csdn.net/li_101357/article/details/70256411
https://blog.csdn.net/click_idc/article/details/80496541
- 文件系统
参考资料:鸟哥linux私房菜。
https://www.cnblogs.com/alantu2018/p/8461749.html
https://www.linuxprobe.com/linux-system-structure.html
系统:EXT2,EXT3
组成:super block,inode,block,inode bitmap,block bitmap
Super block:
超级快,记录总体信息,inode/block总量、剩余量,文件系统格式等。
Inode:
文件的头,记录文件属性,权限,block地址。一个文件一个inode。128bytes
Block:
实际文件的内容。根据文件系统规定大小。(EXT2 系统block具有4k大小。EXT3有8k)。
Inode和block关系。Inode直接记录12个block的地址信息,这十二个block记录具体内容和下一个block地址信息。这种关系只有三层。所以EXT2每个文件最大16GB。
(上面是我看鸟哥的书简单理解的,文件系统很复杂,有兴趣看一下链接,第二个链接个人认为很好)
- 常用软件编译安装
参考地址:
https://blog.csdn.net/anantie/article/details/68954118
编译过程图解
步骤:
- 执行configure脚本
--help:获得其支持使用的选项
--prefix=/PATH/TO/SOMEWHERE:指定默认安装位置;默认为/usr/local/; --sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置; --enable-FEATURE[=ARG]:开启指定特性以及安装路径;默认开启时无须指定; --disable-FEATURE:关闭指定特性;默认关闭时无须指定; --with-PACKAGE[=ARG]:安装指定依赖包以及其安装路径; --without-PACKAGE:不安装指定依赖包;
执行configure脚本的作用:
①用户可以通过选项传递参数给configure脚本,以指定启用的功能特性、安装路径等;而configure脚本在执行的过程中会参考用户的指定以及Makefile.in文件生成makefile文件;
②检查程序指定要启用的功能特性所依赖到的外部环境。
2,执行make程序
make会执行真正的编译操作,但make本身并不是编译器,它只是一个项目构建工具,make程序会根据执行configure脚本所生成的makefile文件,并调用所需要用到的编译器来构建应用程序
3,执行make install安装
在前面的make程序执行之后,在当前目录下会创建出已编译完成的
标二进制格式的应用程序(包括二进制程序、库文件、配置文件及帮助文档等),而make install则会执行安装操作,即把当前目录下已编译好的程序包(二进制程序、库文件、配置文件及帮助文档等)复制到用户指定的各个目录下。
(编译安装完成,还有编译后的配置可以链接查看)
- Shell编程
参考资料:
http://wiki.ubuntu.org.cn/Shell%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80
什么是shell编程:shell编程就是对一堆Linux命令的逻辑化处理。(就是命令的合集)
用途:
对常用的linux操作进行功能的封装,工作变得容易、简单、高效。
shell编程中分为两种变量,第一种是我们自己定义的变量(自定义变量),第二种是Linux已定义的环境变量(环境变量, 例如:$PATH, $HOME 等..., 这类变量我们可以直接使用)。定义变量不用$符号,使用变量要加$就行了。“=”左右千万不要有空。
变量赋值:a="hello world"
变量算数:
a="hello world"
if 语句:
if
判断命令,可以有很多个,真假取最后的返回值then
如果前述为真做什么[ # 方括号代表可选,别真打进去了!elif
可以再来个判断,如果签名为假继续尝试这里then
如果前述为真做什么 ]else
如果全都不行做什么fi # 结束,就是倒写的 if 啦。
select 循环语句:
pocket=()select var in 跳跳糖 糖 很多糖 企鹅糖; do
echo "除了 $var 还要什么吗?"
if ((RANDOM%4 == 0)); then
echo "呀!时间不够了,快上车!"
break # break 还是那个 break
fi
pocket+=("$var")doneecho "你最后说的那个 $var 弄丢了……"IFS='、'echo "现在口袋里只有:${pocket[*]}。"IFS=$' \t\n'
while/for 循环
while ...; do
....done
for var in ....; do
....done