├── .gitattributes ├── 01_Basic ├── 01_什么是软件测试-01.md ├── 01_什么是软件测试-02.md ├── 02_01_什么是测试用例.md └── 03_好的测试用例是什么样的.md ├── 02_Framework ├── 01_什么是自动化框架.md └── 02_好的自动化框架有哪些特性.md ├── 03_Language ├── Java │ └── Jupyter Notebook工具的优势.md └── Python │ ├── Jupyter Notebook工具的优势.md │ ├── Python-formart用法.md │ ├── Python-基础.md │ └── Python-学习资源.md ├── 04_CI_CD └── 01_什么是CICD.md ├── 05_Others ├── 01_博客.md └── 02_测试书籍.md ├── 06_Attachments ├── 01_Linux │ ├── Linux常用命令01 - cd.md │ ├── Linux常用命令02 - mv.md │ ├── Linux常用命令03 - grep.md │ ├── Linux常用命令04 - ls.md │ ├── Linux常用命令05 - 文本追加到文件中.md │ ├── Linux常用命令06 - ps.md │ ├── Linux常用命令07 - rm.md │ ├── Linux常用命令08 - curl.md │ ├── Linux常用命令09 - sed.md │ ├── Linux常用命令10 - unzip.md │ ├── Linux常用命令11 - xargs.md │ ├── Linux常用命令12 - vi.md │ └── Linux常用命令13 - echo.md ├── 02_Docker │ └── Docker带来哪些好处.md ├── GoodTest.pdf ├── LP87w0.png └── 学习路径.md └── README.md /.gitattributes: -------------------------------------------------------------------------------- 1 | *.md linguist-language=python 2 | -------------------------------------------------------------------------------- /01_Basic/01_什么是软件测试-01.md: -------------------------------------------------------------------------------- 1 | # 前言 2 | 3 | 先来看看大厂Google公司测试岗位的要求(岗位发布时间是:2020-02-12)。 4 | 5 | >作为测试工程师,您将与开发工程师,调优工程师和其他跨职能团队合作,以提供经过充分验证的高性能系统设计。 您将确保将产品需求映射到系统设计组件和验证方法。 您将通过开发测试基础架构来帮助确保产品卓越,并与全公司测试团队合作以确保一致的测试程序和输出。 您将监督所有产品程序的验证工作,并与硬件和软件团队紧密合作,以自动化和改进测试,并为团队积极开发的功能设计新的测试。 6 | 7 | 其中有几个纬度值得关注,`合作、沟通、输出、设计`。作为质量部门一般来说,沟通能力是必选的,不能做ETC(一种自动抬杠的机器);还有就是合作,一个产品不是PD、RD说了就算了,一定是一个研发部门、甚至是一个公司决定的,人与人之间的合作也是必选的。对于输出,从上面可以看出需要保证产品的性能、卓越,以及一致的输出结果。除了这些工作,还有就是开发一些工具和制定一些流程,优化流程和保证产品质量。 8 | 9 | # 软件测试定义 10 | 11 | 在软件应用程序或程序中发现错误,以使应用程序按照最终用户的要求运行的过程或方法称为软件测试。 12 | 13 | 描述一种用来促进鉴定软件的`正确性、完整性、安全性和质量的过程`。据此,您可能会想,软件测试永远不可能完整的确立任意电脑软件的正确性。然而,在可计算理论(计算机科学的一个支派)一个简单的数学证明推断出下列结果:不可能完全解决所谓“死机”,指任意计算机程序是否会进入死循环,或者罢工并产生输出问题。 14 | 15 | 还有一种定义:在规定的条件下对程序进行操作,以`发现程序错误,衡量软件质量`,并对其`是否能满足设计要求`进行评估的过程。 16 | 17 | 从上面可以看出,换句话说,软件测试是一种`实际输出与预期输出间的审核或者比较过程`。 18 | 19 | 20 | # 软件测试方法 21 | 22 | 软件测试有许多方法,但对复杂的产品运行有效测试不仅仅是研究过程,更是创造并严格遵守某些呆板步骤的大事。测试的其中一个定义:为了评估而质疑产品的过程;这里的“质疑”是测试员试着对产品做的事,而产品以测试者脚本行为反应作为回答。虽然大部分测试的智力过程不外乎回顾、检查,然而“测试”这个词意味着产品动态分析──让产品流畅运行。程序质量可能,而且通常会,随系统不同而有差异;不过某些公认特性是共通的:`可靠性、稳定性、轻便性、易于维护、以及实用性`。 23 | 24 | 软件测试一般分为`黑盒测试`和`白盒测试`。 25 | 26 | ## 黑盒测试 27 | 28 | 黑盒测试(black-box testing),也称黑箱测试,是软件测试方法,测试应用程序的功能,而不是其内部结构或运作。测试者不需具备应用程序的代码、内部结构和编程语言的专门知识。测试者只需知道什么是系统应该做的事,即当键入一个特定的输入,可得到一定的输出。测试案例是依应用系统应该做的功能,照规范、规格或要求等设计。测试者选择`有效输入和无效输入来验证是否正确的输出`。 29 | 30 | 此测试方法可适合大部分的软件测试,例如集成测试(integration testing)以及系统测试(system testing)。 31 | 32 | ## 白盒测试 33 | 34 | 白盒测试(white-box testing,又称透明盒测试glass box testing、结构测试structural testing等)是一个测试软件的方法,测试应用程序的内部结构或运作,而不是测试应用程序的功能(即黑盒测试)。在白盒测试时,以编程语言的角度来设计测试案例。测试者`输入数据验证数据流在程序中的流动路径,并确定适当的输出`,类似测试电路中的节点。 35 | 36 | 白箱测试可以应用于单元测试(unit testing)、集成测试(integration testing)和系统的软件测试流程,可测试在集成过程中每一单元之间的路径,或者主系统跟子系统中的测试。尽管这种测试的方法可以发现许多的错误或问题,它可能无法检测未使用部分的规范。 37 | 38 | # 测试的进程 39 | ## Alpha测试 40 | Alpha测试通常是阶段性的开发完成后所开始进行,一直持续到进入Beta测试阶段前的阶段。Alpha测试是一种验证测试,在模拟的环境中以模拟的数据来运行。 41 | 42 | 在这个阶段中,通常是在开发单位由开发人员与测试的测试人员,以`模拟或实际操作性的方式进行验证测试`。 43 | 44 | ## Beta测试 45 | 在系统测试中通常先进行Alpha测试以验证信息系统符合用户以及设计需求所期望的功能。当Alpha阶段完成后,开发过程进入到Beta阶段,由公众参与的测试的阶段。Beta测试可称为确认测试,在一个真实的环境中以实际的数据来运行测试,以`确认性能,系统运行有效率`,系统撤销与备份作业正常,透过测试让信息系统日后可以更趋完善。 46 | 47 | ## 封测与公测 48 | 封闭测试(Closed Beta,常简作封测或CB)是软件或服务等产品在开发完成后、将公开上市前的测试过程。相对于公开测试,封闭测试的主要用途是`测试软件的功能和检查程序错误`等等,因此通常只提供给少数人进行测试。有些公司会要求参与测试者签署保密协议,以避免测试的产品提前外流。MMORPG的封测结束之后,游戏公司常会将角色数据删除,但也有少数不删的。 49 | 50 | 公开测试(Open Beta,常简作公测或OB),一般常指软件或服务等产品在正式上市前开放给不特定人试用,虽然原意是希望试用者能够提报bug,但并不是把试用者当做真正的验证人员。由于通常为免费性质,故常常能够吸引到大批的试用者参与,可视为另一种营销策略。另一方面也节省下测试人员的成本,和验证稳定度(对于多人使用的带宽及机器是否能负载,又称压力测试)的时间。 51 | 52 | ## Gamma测试 53 | Gamma测试是一个很少被提及的非正式测试阶段,该测试阶段对应的是对“存在缺陷”产品的测试。考虑到任何产品都可以被称为“存在缺陷”的产品(测试只能发现产品中存在的问题,不能说明产品不存在问题),因此这个概念存在一定的不确定性。 对Alpha和Beta测试常见的一个误解是“Beta测试=黑盒测试”。实际上,Alpha和Beta测试对应在软件产品发布之前的Alpha和Beta阶段,而白盒、黑盒和灰盒测试技术是从技术和方法层面对测试的描述,不应该将这两部分概念混淆。 54 | 55 | # 测试的类型 56 | ## 功能测试 57 | 按照测试软件的各个功能划分进行有条理的测试,在功能测试部分要保证测试项覆盖`所有功能和各种功能条件`组合。 58 | ## 系统测试 59 | 对一个完整的软件以用户的角度来进行测试,系统测试和功能测试的区别是,系统测试利用的所有测试数据和测试的方法都要模拟成和`用户的实际使用环境完全一样`,测试的软件也是经过系统集成以后的完整软件系统,而不是在功能测试阶段利用的每个功能模块单独编译后生成的可执行程序。 60 | ## 极限值测试 61 | 对软件在各种特殊条件,特殊环境下能否正常运行和软件的性能进行测试。 62 | 特殊条件一般指的是软件规定的`最大值,最小值`,以及在超过最大、最小值条件下的测试。 63 | 特殊环境一般指的是软件运行的机器处于CPU高负荷,或是网络高负荷状态下的测试,根据软件的不同,特殊环境也有过不同。 64 | ## 性能测试 65 | 性能测试是对软件性能的评价。简单的说,软件性能衡量的是软件具有的响应及时度能力。因此,性能测试是采用测试手段对软件的`响应及时性`进行评价的一种方式。根据软件的不同类型,性能测试的侧重点也不同。 66 | 67 | ## 压力测试 68 | `压力测试常常和性能测试相混淆`。它们主要不同点是,压力测试要求进行`超过规定性能指标`的测试。例如一个网站设计容量是100个人同时点击,压力测试就要是采用120个同时点击的条件测试。 69 | 70 | 压力测试的通常判断准则: 71 | - 系统能够恢复。 72 | - 压力过程中不要有明显性能下降。 73 | 74 | 75 | 76 | # 测试的阶段 77 | ## 单元测试 78 | 79 | 单元测试是对软件组成单元进行测试,其目的是检验软件基本组成单位的正确性,测试的对象是软件设计的`最小单位:函数`。 80 | 81 | ## 集成测试 82 | 83 | 集成测试也称综合测试、组装测试、联合测试,将程序模块采用适当的集成策略组装起来,对系统的接口及集成后的功能进行正确性检测的测试工作。其主要目的是检查软件单位之间的`接口是否正确`,集成测试的对象是已经经过单元测试的模块。 84 | 85 | ## 系统测试 86 | 87 | 系统测试主要包括功能测试、界面测试、可靠性测试、易用性测试、性能测试。 功能测试主要针对包括功能`可用性、功能实现`程度(功能流程&业务流程、数据处理&业务数据处理)方面测试。 88 | 89 | ## 回归测试 90 | 91 | 回归测试指在软件维护阶段,为了检测`代码修改而引入的错误`所进行的测试活动。回归测试是软件维护阶段的重要工作,有研究表明,回归测试带来的耗费占软件生命周期的1/3总费用以上。 92 | 93 | 与普通的测试不同,在回归测试过程开始的时候,测试者有一个完整的测试用例集可供使用,因此,如何根据代码的修改情况对已有测试用例集进行有效的复用是回归测试研究的重要方向,此外,回归测试的研究方向还涉及自动化工具,面向对象回归测试,测试用例优先级,回归测试用例补充生成等。 94 | 95 | > 部分内容引用维基百科。https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95 96 | 97 | 98 | -------------------------------------------------------------------------------- /01_Basic/01_什么是软件测试-02.md: -------------------------------------------------------------------------------- 1 | 下面是来自著名美国大学`卡内基梅隆大学`的介绍软件测试,从事软测行业,我觉得有必要了解一下。 2 | 英语不好强行提笔,文中有不对的地方,请指正,谢谢 3 | 4 | 英语好的同学,可以直接看下面的原文链接 5 | >https://users.ece.cmu.edu/~koopman/des_s99/sw_testing/ 6 | 7 | 8 | 软件测试是任何旨在评估一个程序或系统的属性或能力并确定它满足其所需结果的活动。 尽管软件测试对软件质量至关重要,并且被程序员和测试人员广泛使用,但由于对软件原理的理解有限,软件测试仍然是一门艺术。 软件测试的困难源于软件的复杂性: 我们不能完全测试一个中等复杂度的程序。 测试不仅仅是调试。 测试的目的可以是质量保证、验证及确认或可靠性评估。 测试也可以作为一种通用度量。 正确性测试和可靠性测试是测试的两个主要领域。 软件测试是预算、时间和质量之间的权衡。 9 | 10 | 11 | 12 | 软件测试是为了发现错误而执行程序或系统的过程。 [ Myers79]或者,它包括任何旨在评估一个程序或系统的属性或能力并确定它满足所需结果的活动。 [ Hetzel88]软件与其他物理过程不同,在这些过程中,输入被接收,输出被生成。 软件的不同之处在于它失败的方式。 大多数物理系统都以固定(且相当小)的方式出现故障。 相比之下,软件可能以许多奇怪的方式失败。 检测所有不同的软件故障模式通常是不可行的。 [ Rstcorp ] 13 | 14 | 与大多数物理系统不同,软件中的大多数缺陷是设计错误,而不是制造缺陷。 软件不会遭受腐蚀、磨损——通常直到升级或者过时,它才会改变。 因此,一旦软件发货,设计缺陷——或者说 bug ——将被隐藏起来,直到激活为止。 15 | 16 | 17 | # 前言 18 | 19 | 软件缺陷几乎总是存在于任何大小适中的软件模块中: 不是因为程序员粗心或不负责任,而是因为软件的复杂性通常是难以处理的---- 而且人类只有有限的能力来管理复杂性。 对于任何复杂的系统,设计缺陷也不能完全排除。 20 | 21 | 发现软件中的设计缺陷,同样是困难的,因为同样的复杂性。 由于软件和任何数字系统都是不连续的,测试边界值不足以保证正确性。 所有可能的值都需要测试和验证,但是完整的测试是不可行的。 尽可能详尽地测试一个只添加两个32位整数输入的简单程序(产生2 ^ 64个不同的测试用例)需要数百年的时间,即使测试以每秒数千次的速度进行。 显然,对于一个实际的软件模块,其复杂性可能远远超过这里提到的示例。 如果涉及到来自现实世界的输入,问题将变得更糟,因为时间和不可预测的环境影响以及人与人之间的相互作用都是正在考虑的可能输入参数。 22 | 23 | 进一步的复杂性与程序的动态性有关。 如果在初步测试期间发生了故障,并且代码被更改,那么软件现在可以为一个以前不能使用的测试用例工作。 但是,它在以前通过的预错误测试用例上的行为不再能够得到保证。 为了考虑到这种可能性,应该重新启动测试。 这样做的费用往往令人望而却步。 [ Rstcorp ] 24 | 25 | 26 | 27 | 一个有趣的类比将软件测试的困难与杀虫剂的困难相提并论,即所谓的杀虫剂悖论[ Beizer90] : 你用来防止或发现虫子的每一种方法都会留下一些微妙的虫子残留物,而这些方法对这些虫子是无效的。 但是这并不能保证使软件变得更好,因为“复杂性障碍”(Complexity Barrier [ Beizer90])原则指出: 软件复杂性(以及因此而产生的 bug)已经达到了我们管理这种复杂性的能力的极限。 通过消除(以前的)容易的 bug,您允许特性和复杂性的另一个升级,但是他的时间您有更微妙的 bug 面对,只是为了保持您以前拥有的可靠性。 社会似乎不愿意限制复杂性,因为我们都想要额外的铃声、哨子和功能互动。 因此,我们的用户总是把我们推向复杂的障碍,而我们能够接近这个障碍的程度在很大程度上取决于我们对付更复杂和微妙的错误所运用的技术的强度。 [ Beizer90] 28 | 29 | 30 | 31 | 尽管有这些限制,测试仍然是软件开发中不可或缺的一部分。 它被广泛地部署在软件开发周期的每个阶段。 通常,超过50% 的开发时间用于测试。 测试通常用于以下目的: 32 | 33 | ## 提高质量 34 | 35 | 36 | 由于计算机和软件被用于关键的应用程序,故障的后果可能是严重的。 缺陷可以造成巨大的损失。 关键系统的缺陷导致了飞机失事,航天飞机任务出了差错,股票市场停止交易,甚至更糟。 虫子会杀人。 虫子会引起灾难。 所谓的2000年问题催生了一个由顾问和编程工具组成的家庭手工业,致力于确保现代世界不会在下个世纪的第一天戛然而止。 [ bug ]在一个计算机化的嵌入式世界里,软件的质量和可靠性是生死攸关的问题。 37 | 38 | 39 | 40 | 质量是指符合规定的设计要求。 正确是对质量的最低要求,是指在特定情况下按要求执行。 调试是软件测试的一个狭隘的视角,程序员通过大量的调试来发现设计缺陷。 人性的不完美使得一个中等复杂的程序几乎不可能在第一时间进行修正。 发现问题并解决问题[ Kaner93] ,是编程阶段调试的目的。 41 | 42 | 正如主题验证及确认所指出的,测试的另一个重要目的是验证及确认。 测试可以作为度量标准。 在 v & v 过程中,它被大量用作工具。 测试人员可以根据对测试结果的解释作出声明,产品可以在某些情况下工作,也可以不工作。 我们也可以根据相同的测试结果,比较同一规格的不同产品之间的质量。 43 | 44 | 45 | 我们不能直接检测质量,但我们可以检测相关因素,使质量可见。 质量有三组因素——功能性、工程性和适应性。 这三组因素可以看作是软件质量空间中的维度。 每个维度可以在依次较低的细节层次上分解为其组成因素和考虑因素。 表1说明了一些最常被引用的质量考虑因素。 46 | 47 | 48 | ### 典型的软件质量因素 49 | | Functionality (exterior quality) 功能(外观质量)| Engineering (interior quality) 工程(室内质量)| Adaptability (future quality) 适应性(未来质量)| 50 | | ---- | ---- | ---- | 51 | Correctness 正确性| Efficiency 效率| Flexibility 灵活性 52 | Reliability 可靠性| Testability 可测试性| Reusability 可重用性 53 | Usability 可用性 | Documentation 文件| Maintainability 可维护性 54 | Integrity 诚信 | Structure 结构 | 55 | 56 | 57 | 58 | 良好的测试为所有相关因素提供了衡量标准。 任何特定因素的重要性因应用而异。 任何涉及人类生命安全的系统都必须极其强调可靠性和完整性。 在典型的业务系统中,可用性和可维护性是关键因素,而对于一个一次性的科学程序来说,可用性和可维护性并不重要。 我们的测试,为了完全有效,必须面向衡量每个相关因素,从而迫使质量成为有形和可见的。 [赫泽尔88] 59 | 60 | 61 | 用于验证产品工作的测试称为干净测试或阳性测试。 缺点是,它只能验证软件是否为指定的测试用例工作。 有限数量的测试无法验证软件是否适用于所有情况。 相反,只有一个失败的测试就足以证明软件不能工作。 肮脏测试,或者说是否定测试,指的是那些旨在破坏软件的测试,或者表明软件不能正常工作的测试。 一个软件必须具有足够的异常处理能力,才能在重要级别的脏测试中生存下来。 62 | 63 | 64 | 65 | 可测试的设计是一种易于验证、伪造和维护的设计。 由于测试是一项严格的工作,需要大量的时间和成本,因此可测试性设计也是软件开发的一个重要设计规则。 66 | 67 | 68 | 软件可靠性与软件的许多方面有着重要的关系,包括软件的结构以及软件所受到的测试量。 基于运行剖面(对程序各种输入使用的相对频率的估计[ Lyu95]) ,测试可以作为一种统计抽样方法,获取故障数据进行可靠性估计。 69 | 70 | 71 | 软件测试还不成熟。 它仍然是一门艺术,因为我们仍然不能把它变成一门科学。 我们仍在使用20-30年前发明的同样的测试技术,其中一些是精心设计的方法或启发式方法,而不是好的工程方法。 软件测试成本可能很高,但不测试软件则更加昂贵,尤其是在人类生命处于危险之中的地方。 解决软件测试问题并不比解决图灵停机问题容易。 我们永远无法确定一个软件是否正确。 我们永远无法确定这些规格是否正确。 没有任何验证系统可以验证每一个正确的程序。 我们也永远无法确定一个验证系统是否正确。 72 | 73 | # 关键概念 74 | ## 分类学 75 | 76 | 有过多的测试方法和测试技术,在不同的生命周期阶段服务于多种用途。 软件测试按目的分为: 正确性测试、性能测试、可靠性测试和安全性测试。 按生命周期阶段划分,软件测试可分为需求阶段测试、设计阶段测试、程序阶段测试、评估测试结果、安装阶段测试、验收测试和维护测试。 按照范围,软件测试可以分为以下几类: 单元测试、组件测试、集成测试和系统测试。 77 | 78 | ## 正确性测试 79 | 80 | 81 | 正确性是软件的最低要求,是测试的基本目的。 正确性测试将需要某种类型的 oracle,以区分正确的行为和错误的行为。 测试人员可能知道也可能不知道被测试软件模块的内部细节,例如控制流程、数据流程等。 因此,在测试软件时可以采用白盒视角或黑盒视角。 我们必须注意,黑盒和白盒思想并不仅限于正确性测试。 82 | 83 | ## 黑盒测试 84 | 85 | 86 | 黑盒方法是一种测试方法,其中测试数据来自于指定的功能需求,而不考虑最终的程序结构。 它也称为数据驱动、输入 / 输出驱动[ Myers79]或基于需求的[ Hetzel88]测试。 因为只有软件模块的功能是需要关注的,黑盒测试也主要指功能测试---- 一种强调执行功能和检查输入输出数据的测试方法。 [ Howden87]测试人员将被测试的软件视为一个黑盒子——只有输入、输出和规范是可见的,而功能是通过观察相应输入的输出来确定的。 在测试中,执行各种输入,并将输出与规范进行比较,以验证其正确性。 所有测试用例都是从规范中派生出来的。 不考虑代码的实现细节。 87 | 88 | 89 | 90 | 很明显,我们在输入空间中覆盖的内容越多,我们将发现越多的问题,因此我们将对软件的质量更有信心。 理想情况下,我们应该尽可能详尽地测试输入空间。 但是如上所述,对于大多数程序来说,用尽全力测试有效输入的组合是不可能的,更不用说考虑无效的输入、时间、顺序和资源变量了。 组合爆炸是功能测试的主要障碍。 更糟糕的是,我们永远无法确定这个规范是正确的还是完整的。 由于规范语言(通常是自然语言)的局限性,歧义往往是不可避免的。 即使我们使用某种类型的正式或受限制的语言,我们仍然可能无法写出规范中所有可能的情况。 有时,规范本身成为一个棘手的问题: 不可能用有限的词语精确地指定可能遇到的每一种情况。 人们很少能够清楚地说明他们想要什么---- 他们通常能够在完成之后分辨出一个原型是否是他们想要的。 规范问题导致了软件中大约30% 的错误。 [ Beizer95] 91 | 92 | 93 | 94 | 黑盒测试的研究主要集中在如何以最小的代价最大化测试的有效性,通常是测试用例的数量。 不可能用尽输入空间,但可以用尽输入空间的子集。 分区是常用的技术之一。 如果我们已经将输入空间分区,并且假设一个分区中的所有输入值都是等价的,那么我们只需要在每个分区中测试一个代表值,以充分覆盖整个输入空间。 域测试[ Beizer95]将输入域划分为多个区域,并将每个区域中的输入值视为一个等价类。 域可以通过选择每个域中的代表值进行详尽的测试和覆盖。 边界值是特别重要的。 经验表明,探索边界条件的测试用例比不探索边界条件的测试用例有更高的回报。 边界值分析[ Myers79]需要选择一个或多个边界值作为典型的测试用例。 域测试的困难在于无法有效地发现规范中不正确的域定义。 95 | 96 | 97 | 98 | 良好的分区需要软件结构知识。 一个好的测试计划不仅包括黑盒测试,还包括白盒方法,以及两者的结合。 99 | 100 | ## 白盒测试 101 | 102 | 103 | 与黑盒测试相反,软件被看作是一个白盒子,或者说是白盒测试中的玻璃盒子,因为被测试软件的结构和流程对测试人员来说是可见的。 测试计划是根据软件实现的细节制定的,例如编程语言、逻辑和样式。 测试用例来源于程序结构。 白盒测试测试也被称为玻璃盒测试,逻辑驱动测试[ Myers79]或基于设计的测试[ Hetzel88]。 104 | 105 | 106 | 107 | 在21白盒测试有许多可用的技术,因为对测试软件结构的特定知识和关注缓解了棘手的问题。 用尽软件某些方面的意图在21白盒测试仍然很强烈,并且可以达到某种程度的用尽,例如每行代码至少执行一次(语句覆盖率) ,遍历每个分支语句(分支覆盖率) ,或者覆盖所有真假条件谓词的可能组合(多条件覆盖率)。 [ Parrington89] 108 | 109 | 110 | 111 | 控制流测试、循环测试和数据流测试都将相应的软件流结构映射到有向图中。 根据至少覆盖或遍历所有节点或路径一次的标准,谨慎地选择测试用例。 通过这样做,我们可能会发现不必要的“死”代码——没有用处的代码,或者根本不执行的代码,功能测试无法发现这些代码。 112 | 113 | 114 | 在突变测试,原始的程序代码被扰乱,许多突变的程序被创建,每个都包含一个错误。 程序的每个错误版本都被称为变种。 测试数据是根据失败的突变体的有效性来选择的。 测试用例杀死的突变体越多,测试用例被考虑的效果就越好。 突变测试的问题在于它太昂贵了以至于无法使用。 黑盒方法和白盒方法之间的界限并不明确。 上面提到的许多测试策略,可能不能安全地分为黑盒测试或白盒测试。 对于事务流测试、语法测试、有限状态测试和许多其他本文没有讨论的测试策略也是如此。 原因之一是,上述所有技术都需要一些关于被测试软件规范的知识。 另一个原因是规范本身的概念很广泛——它可能包含任何需求,包括结构、编程语言和编程风格作为规范内容的一部分。 115 | 116 | 117 | 118 | 我们可能不愿意把随机测试看作是一种测试技术。 测试用例的选择简单而直接: 它们是随机选择的。 [ Duran84]的研究表明,随机测试对许多程序来说更具成本效益。 一些非常微妙的错误可以以很低的成本被发现。 而且它的覆盖率也不比其他精心设计的测试技术差。 人们也可以利用基于操作剖面的随机试验结果获得可靠性估计。 将随机测试与其他测试技术有效地结合起来,可以产生更强大和更经济有效的测试策略。 119 | 120 | 121 | ## 性能测试 122 | 123 | 124 | 并非所有的软件系统都有明确的性能规范。 但是每个系统都有隐含的性能需求。 软件不应该花费无限的时间或无限的资源来执行。 “性能缺陷”有时用来指那些导致系统性能下降的软件设计问题。 125 | 126 | 127 | 性能一直是计算机发展的重点和推动力。 软件系统的性能评价通常包括: 资源使用、吞吐量、刺激响应时间和队列长度,它们详细描述了选定资源等待服务的平均或最大任务数量。 需要考虑的典型资源包括网络带宽需求、 CPU 周期、磁盘空间、磁盘访问操作和内存使用[ Smith90]。 性能测试的目标可以是性能瓶颈识别、性能比较和评价等。 进行性能测试的典型方法是使用基准测试——一个代表典型系统使用情况的程序、工作负载或跟踪。 [ vokoolos98] 128 | 129 | ## 可靠性测试 130 | 131 | 132 | 软件可靠性是指系统无故障运行的概率。 它涉及到软件的许多方面,包括测试过程。 通过量化软件可靠性的相关因素直接评估软件可靠性是困难的。 测试是度量软件可靠性的一种有效的抽样方法。 在操作剖面的指导下,软件测试(通常是黑盒测试测试)可以用来获得故障数据,并且可以进一步使用估计模型来分析数据以估计当前的可靠性和预测未来的可靠性。 因此,开发人员可以根据评估结果决定是否发布软件,用户可以决定是否采用和使用软件。 使用软件的风险也可以基于可靠性信息进行评估。 [ Hamlet94]主张测试的主要目标应该是测量被测试软件的可靠性。 133 | 134 | 135 | 136 | 人们对可靠软件的直观含义达成了一致: 它不会以意想不到的或灾难性的方式失败。 [ Hamlet94]稳健性试验和应力试验是基于这一简单准则的可靠性试验的方差。 137 | 138 | 139 | 140 | 基于组件的软件工程系统的鲁棒性是它在特殊输入或紧张的环境条件下能够正常工作的程度。 [ IEEE90]稳健性测试与正确性测试的不同之处在于,它不关心软件的功能正确性。 它只关注诸如机器崩溃、进程挂起或异常终止等健壮性问题。 Oracle 相对简单,因此健壮性测试可以比正确性测试更具可移植性和可扩展性。 这项研究最近引起了越来越多的兴趣,其中大多数都以商业操作系统为目标,例如[ Koopman97][ Kropp98][ Ghosh98][ devalos 99][ Koopman99]。 141 | 142 | 143 | 压力测试,或负载测试,通常用于测试整个系统,而不仅仅是测试软件。 在这种测试中,软件或系统的运行受到或超过了规定的限制。 典型的压力包括资源枯竭、突发性活动和持续的高负荷。 144 | 145 | ## 安全测试 146 | 147 | 148 | 软件质量、可靠性和安全性是紧密耦合的。 入侵者可以利用软件中的漏洞打开安全漏洞。 随着互联网的发展,软件安全问题越来越严重。 149 | 150 | 151 | 152 | 许多关键的软件应用程序和服务都集成了针对恶意攻击的安全措施。 对这些系统进行安全测试的目的包括识别和消除可能导致安全违规的软件缺陷,以及验证安全措施的有效性。 可以执行模拟的安全攻击来发现漏洞。 153 | 154 | ## 测试自动化 155 | 156 | 157 | 软件测试可能非常昂贵。 自动化是减少时间和成本的好方法。 软件测试工具和技术通常缺乏通用的适用性和可伸缩性。 原因很简单。 为了使这个过程自动化,我们必须有一些方法来从规范中生成预言,并生成测试用例来测试目标软件以确定它们的正确性。 今天,我们仍然没有一个完整的系统来实现这个目标。 一般来说,在测试中仍然需要大量的人工干预。 自动化程度保持在自动化测试脚本级别。 158 | 159 | 160 | 161 | 在可靠性测试和性能测试中,这一问题有所缓解。 在健壮性测试中,简单的规范和 oracle: 不崩溃,不挂起就足够了。 类似的简单度量也可以用于压力测试。 162 | 163 | ## 什么时候停止测试? 164 | 165 | 166 | 测试可能是无穷无尽的。 我们不能测试,直到所有的缺陷都被发现和消除——这是根本不可能的。 在某种程度上,我们必须停止测试并发布软件。 问题是什么时候。 167 | 168 | 169 | 实际上,测试是预算、时间和质量之间的权衡。 它是由盈利模式驱动的。 最悲观的,也是最不幸的是最常用的方法是,当一些或任何分配的资源——时间、预算或测试用例——用尽时停止测试。 最乐观的停止规则是,当可靠性满足要求或者继续测试的好处不能证明测试成本合理时停止测试。 [ Yang95]这通常需要使用可靠性模型来评估和预测被测试软件的可靠性。 每个评估都需要重复运行以下循环: 故障数据收集 -- 建模 -- 预测。 然而,这种方法不适用于超可靠系统,因为实际的现场故障数据需要很长时间才能积累。 170 | 171 | ## 测试的替代品 172 | 173 | 174 | 软件测试越来越多地被认为是一种有问题的方法,以获得更好的质量。 使用测试来定位和纠正软件缺陷可能是一个无止境的过程。 虫子是不能完全排除的。 正如复杂性障碍表明的那样: 测试和修复问题的机会并不一定会提高软件的质量和可靠性。 有时修复一个问题可能会给系统带来更严重的问题,比如1991年加利福尼亚州和美国东岸电力公司的电话故障。 灾难发生在信令系统更换3行代码之后。 175 | 176 | 177 | 从狭义的角度来看,许多测试技术可能存在缺陷。 例如,覆盖测试。 测试中的代码覆盖率、分支覆盖率真的与软件质量有关吗? 没有确切的证据。 早在[ Myers79] ,所谓的“人体试验”——包括检查、排查、评论——就被建议作为传统试验方法的可能替代方法。 [ Hamlet94]主张将检查作为单元测试的一种成本效益替代方法。 [ Basili85]中的实验结果表明,就观察到的故障数量和代价而言,分步抽象的代码读取至少与在线功能测试和结构测试一样有效。 178 | 179 | 180 | 181 | 用形式化的方法“证明”软件的正确性也是一个引人注目的研究方向。 但这种方法也不能克服复杂性的障碍。 对于相对简单的软件,这种方法很有效。 它不能很好地扩展到那些复杂的、成熟的大型软件系统,这些软件系统更容易出错。 182 | 183 | 184 | 185 | 从更广泛的角度来看,我们可能会开始质疑测试的最大目的。 为什么我们需要更有效的测试方法呢,因为发现缺陷并消除它们并不一定会带来更好的质量。 这个问题的类比就像汽车制造过程。 在工艺时代,我们制造汽车,去除问题和缺陷。 但随着流水线生产和高质量的工艺流程,这些方法被淘汰了,使得汽车在生产阶段无缺陷。 这表明,通过设计过程(如无尘室软件工程)使产品具有较少的缺陷,可能比通过设计测试过程更有效。 测试只用于质量监控和管理,或者“可测试性设计”。 这是软件从工艺到工程的飞跃。 186 | 187 | ## 可用的工具、技术和指标 188 | 189 | 190 | 有大量的软件测试工具存在。 正确性测试工具往往是针对某些系统的,它们的能力和通用性有限。 健壮性和压力测试工具更有可能成为通用工具。 191 | 192 | 193 | Mothora [ DeMillo91]是突变测试普渡大学研发的一种自动化工具集。 使用 Mothora,测试人员可以创建和执行测试用例,测量测试用例的充分性,确定输入输出正确性,定位和删除错误或 bug,并控制和记录测试。 194 | 195 | 它们是运行时检查和调试辅助工具。 它们可以检查和防止内存泄漏和指针问题。 196 | 197 | 198 | 199 | Ballista COTS 软件健壮性测试线束[ Ballista99]。 Ballista 测试工具是一个全面的自动健壮性测试工具。 第一个版本支持在 UNIX 操作系统中测试多达233个 POSIX 函数调用。 第二个版本还支持测试用户函数,前提是测试服务器能够识别数据类型。 Ballista 测试工具提供了跨操作系统的健壮性比较的定量度量。 目标是针对健壮性故障自动测试和强化商用现成软件(Commercial off-The-shelf,COTS)。 200 | 201 | 202 | # 结论 203 | 软件测试是一门艺术。 大多数的测试方法和实践与20年前没有太大的不同。 204 | 虽然有许多工具和技术可供使用,但它还远远不够成熟。 205 | 好的测试还需要测试人员的创造力、经验和直觉,以及适当的技术. 206 | 测试不仅仅是调试。 测试不仅用于定位缺陷并纠正它们。 207 | 它也用于验证,验证过程和可靠性测量. 测试是昂贵的。 自动化是降低成本和时间的好方法。 208 | 测试效率和有效性是基于覆盖率的测试技术的标准. 完整的测试是不可行的。 复杂性是问题的根源。 209 | 在某种程度上,软件测试必须停止,产品必须发货。 停车时间可以通过时间和预算的权衡来决定。 或者软件产品的可靠性估计是否满足要求,测试可能不是提高软件质量的最有效方法。 210 | 其他的方法,如检查和无尘室工程,可能会更好. 211 | 212 | 213 | 214 | 215 | -------------------------------------------------------------------------------- /01_Basic/02_01_什么是测试用例.md: -------------------------------------------------------------------------------- 1 | > 文章来自国外网站:https://blog.testlodge.com/what-is-a-test-case-in-software-testing/ 2 | 3 | 4 | Software terminology can be confusing. Test case, test script, test scenario, test plans; they all sound kind of similar and it’s easy to get lost in the mix of all the lingo. Whether you’re an experienced tester or someone new to testing, it’s important to avoid uncertainties in software testing terminology. That’s why in this post, we’re going to take a look at “test case”. So, what is a test case in software testing? 5 | 6 | 软件术语可能会令人困惑。 测试用例、测试脚本、测试场景、测试计划; 它们听起来都有点类似,很容易迷失在所有行话的混合中。 无论您是一个有经验的测试人员还是一个新的测试人员,避免软件测试术语中的不确定性是很重要的。 这就是为什么在这篇文章中,我们要看一下“测试用例”。 那么,什么是软件测试中的测试用例呢? 7 | 8 | 9 | ![Pasted Graphic 1.png](http://q5di0i4jy.bkt.clouddn.com/picgovPasted Graphic 1.png) 10 |  11 | 12 | # 定义-什么是软件测试中的测试用例? 13 | In the simplest form, a test case is a set of conditions or variables under which a tester determines whether the software satisfies requirements and functions properly. 14 | 15 | 在最简单的形式中,测试用例是一组条件或变量,测试人员在这些条件或变量下确定软件是否满足要求和功能。 16 | 17 | A test case is a single executable test which a tester carries out. It guides them through the steps of the test. You can think of a test case as a set of step-by-step instructions to verify something behaves as it is required to behave. 18 | 19 | 测试用例是测试人员执行的单个可执行测试。 它引导他们通过测试的步骤。 您可以将测试用例看作是一组逐步指令,用于验证某些行为是否符合其行为要求。 20 | 21 | 22 | # 一个测试用例通常包含: 23 | Title 标题 24 | Description 描述 25 | Test steps 测试步骤 26 | Expected result 预期结果 27 | Actual result (once tested) 实际结果(一次测试) 28 | 29 | # 谁编写测试用例? 30 | Typically, someone from the QA team writes the test cases. This doesn’t include unit tests, which are written by the development team, but we won’t be getting into unit tests in this post. Make sure whoever is writing test cases has decent writing skills and understands the purpose and value that test cases provide. 31 | 32 | 通常,QA 团队中的某个人编写测试用例。 这不包括由开发团队编写的单元测试,但是我们在这篇文章中不会涉及单元测试。 确保编写测试用例的人有良好的编写技巧,并理解测试用例提供的目的和价值。 33 | 34 | 35 | # 价值何在? 36 | Test cases have a great impact on the testing phase. Writing test cases is almost as important as the testing process itself. The activity of writing test cases helps you think through the details and ensures you’re approaching the tests from as many angles as possible. 37 | 38 | 测试用例对测试阶段有很大的影响。 编写测试用例几乎和测试过程本身一样重要。 编写测试用例的活动可以帮助您通过细节进行思考,并确保您从尽可能多的角度来处理测试。 39 | 40 | The value of having test cases long-term is that anyone can go in and retest using the test case. Test cases are powerful artifacts that are beneficial to future teammates, as well as a good source of truth for how a system and particular feature work. In short, test cases provide the following value: 41 | 42 | 长期拥有测试用例的价值在于,任何人都可以使用测试用例进行重新测试。 测试用例是对未来的队友有益的强大工件,也是了解系统和特定特性如何工作的良好来源。 简而言之,测试用例提供了以下值: 43 | 44 | Ensures good test coverage (key functionality isn’t missed in the testing process). 确保良好的测试覆盖率(在测试过程中不会遗漏关键功能) 45 | Allows the tester to think thoroughly through different ways of validating features. 允许测试人员彻底地思考验证特性的不同方法 46 | Negative test cases 阴性测试案例 are also documented, which can often be overlooked. 也被记录在案,这常常被忽视 47 | They are reusable for the future – anyone can reference them and execute the test. 它们在未来是可重用的——任何人都可以引用它们并执行测试 48 | 49 | # 何时使用测试用例? 50 | Test cases are used after development finishes a feature or a set of features. While development is being done, or immediately thereafter, the testing team can prepare test cases for the upcoming tests to be run. The goal is to have test cases ready by the time testing is able to begin. 51 | 52 | 测试用例在开发完成一个特性或一组特性之后使用。 在开发完成时,或者在完成之后,测试团队可以为即将运行的测试准备测试用例。 目标是在测试能够开始之前准备好测试用例。 53 | 54 | When testing begins, the testing team follows the test cases or “scripts” they wrote in order to execute the tests and verify the software. The sequence or group of test cases is called a test suite. 55 | 56 | 当测试开始时,测试团队遵循他们编写的测试用例或“脚本” ,以便执行测试并验证软件。 测试用例的顺序或组称为测试套件。 57 | 58 | 59 | # 测试用例最佳实践 60 | When writing test cases, consider these things: 61 | 62 | 在编写测试用例时,考虑以下事项: 63 | 64 | Keep the title short. 标题要简短 65 | Include a strong description. 包括一个强有力的描述 66 | Be clear and concise. 简明扼要 67 | Include the expected result. 包括预期的结果 68 | You’ll also want to try to make each test case reusable, so that you can conduct tests using it again in the future. Learn more about how to write test cases and see an example in this earlier post. 69 | 70 | 您还需要尝试使每个测试用例都可重用,以便将来可以再次使用它来进行测试。 了解更多关于如何编写测试用例的信息,并在前面的文章中看到一个示例。 71 | 72 | While writing test cases can add to your overall testing efforts, it can provide a lot of value to your testing process and in the end improve the quality of your software. 73 | 74 | 虽然编写测试用例可以增加您的整体测试工作,但它可以为您的测试过程提供很多价值,并最终提高软件的质量。 -------------------------------------------------------------------------------- /01_Basic/03_好的测试用例是什么样的.md: -------------------------------------------------------------------------------- 1 | # todo 2 | 3 | http://www.kaner.com/pdfs/GoodTest.pdf -------------------------------------------------------------------------------- /02_Framework/01_什么是自动化框架.md: -------------------------------------------------------------------------------- 1 | 网上对于「自动化框架」有很多说法,基本上都说的很长明白了,我就简单的总结下。 2 | 3 | ## 自动化测试 4 | 自动化测试框架来源于自动化测试。什么是自动化测试?`使用独立于被测试软件的软件来控制测试的执行,以及将实际结果与预测结果进行比较。`自动化测试的方法也有很多,有GUI、API驱动、interface等等,目前基本上大部分软件公司都有自己的测试。所以自动化的类型也是多种多样,对于自己的产品是否有必要进行自动化也是非常关键的。最常见的几个原因:`回归测试需求、经济因素、SUT的成熟度。` 5 | 6 | 一些软件测试任务(例如大量的低级接口回归测试)手工完成可能是`费时费力`的。 此外,手工方法在查找某些类的缺陷时可能并不总是有效的。 测试自动化提供了有效执行这些类型测试的可能性。 7 | 8 | 一旦自动化测试被开发出来,它们就可以`快速而重复`地运行。 很多时候,对于维护`寿命较长`的软件产品来说,这是一种具有成本效益的回归测试。 在应用程序的生命周期中,即使是很小的补丁也可能导致现有的特性中断,而这些特性在更早的时候还在工作。 9 | 10 | 测试自动化工具可能很昂贵,并且通常与手动测试结合使用。 从长远来看,测试自动化可以`提高成本效益`,尤其是在回归测试中重复使用时。 测试自动化的一个好的候选者是一个应用程序公共流程的测试用例,因为每次在应用程序中进行增强时都需要执行(回归测试)。 测试自动化`减少了与手动测试相关的工作量`。 `开发和维护自动检查以及审查测试结果都需要人工的努力`。 11 | 12 | ## 自动化框架 13 | 14 | 自动化测试框架是`一个集成系统`,它为特定产品的自动化制定规则。 该系统集成了`功能库、测试数据源、对象细节和各种可重用模块`。 这些组件充当需要组装以表示业务流程的小型构建块。 该框架提供了测试自动化的基础,并简化了自动化工作。 15 | 16 | 支持自动化软件测试的假设、概念和工具框架的主要优点是`维护成本低`。 如果任何测试用例有变化,那么只有测试用例文件需要更新,并且驱动程序脚本和启动脚本将保持不变。 理想情况下,不需要在应用程序发生更改时更新脚本。 17 | 18 | 19 | `选择正确的框架 / 脚本技术有助于保持较低的成本`。 与测试脚本相关的成本是由开发和维护工作造成的。 在测试自动化过程中使用的脚本编写方法对成本有影响。 20 | 21 | 通常使用多种框架 / 脚本技术: 22 | 1. 线性-- 注重过程 23 | 2. 结构化-- 控制结构 24 | 3. 数据驱动-- 数据保存在数据库、excel等 25 | 4. 关键字驱动 26 | 5. 敏捷自动化框架 27 | 6. 以上混合 28 | 29 | 30 | 测试框架负责: 31 | 1. 定义表达期望的方式 32 | 2. 创建一个机制来注入或驱动被测试的应用程序 33 | 3. 执行测试 34 | 4. 报告结果 35 | 36 | 37 | 参考: 38 | 39 | https://en.wikipedia.org/wiki/Test_automation 40 | 41 | https://en.wikipedia.org/wiki/Software_framework 42 | 43 | https://www.jianshu.com/p/9a5760251004 -------------------------------------------------------------------------------- /02_Framework/02_好的自动化框架有哪些特性.md: -------------------------------------------------------------------------------- 1 | #todo -------------------------------------------------------------------------------- /03_Language/Java/Jupyter Notebook工具的优势.md: -------------------------------------------------------------------------------- 1 | 2 | ## Jupyter notebook 3 | 4 | ## 优点 5 | 6 | - 整合了所有的资源,不管是图片代码,文档都可以放在notebook里面 7 | - 还有一个就是交互性的编程体验。写的代码不管是多少,还是一个cl,都可以在短时间在notebook上运行起来,让我们更专注于代码本身,问题本身不再是复杂的供应链 8 | - 结果是非常显然的,一目了然,只要一运行,结果就马上显示在下方。 9 | 10 | ## 安装 11 | 安装的话非常简单,用Python上的 pip 资源包管理,直接输入以下命令,如果网速好的话,或者是更改了派送员的话,可回国内原的话应该是一分钟都不到就会安装完成。 12 | ``` 13 | pip install jupyter 14 | ``` 15 | Jupyter notebook大概依赖30~40个依赖包。 16 | ![部分依赖包](https://gitee.com/chasays/mdPic/raw/master/uPic/3XLaIQ.png) 17 | 18 | ## 运行 19 | 安装完之后在任意目录执行。命令`jupyter notebook`,然后就会在浏览器打开这个链接。 20 | ![运行图](https://gitee.com/chasays/mdPic/raw/master/uPic/EPIjPE.png) 21 | 22 | 打开连接之后可以看到效果图如下。 23 | ![效果](https://gitee.com/chasays/mdPic/raw/master/uPic/G6dN3b.png) 24 | 25 | 那么可以看到执行后的效果里面,就是当前运行目录里面的所有内容,如果当前目录有Python等其他的可执行文件,那么就可以直接执行。速度非常的快。 -------------------------------------------------------------------------------- /03_Language/Python/Jupyter Notebook工具的优势.md: -------------------------------------------------------------------------------- 1 | 2 | ## Jupyter notebook 3 | 4 | ## 优点 5 | 6 | - 整合了所有的资源,不管是图片代码,文档都可以放在notebook里面 7 | - 还有一个就是交互性的编程体验。写的代码不管是多少,还是一个cl,都可以在短时间在notebook上运行起来,让我们更专注于代码本身,问题本身不再是复杂的供应链 8 | - 结果是非常显然的,一目了然,只要一运行,结果就马上显示在下方。 9 | 10 | ## 安装 11 | 安装的话非常简单,用Python上的 pip 资源包管理,直接输入以下命令,如果网速好的话,或者是更改了派送员的话,可回国内原的话应该是一分钟都不到就会安装完成。 12 | ``` 13 | pip install jupyter 14 | ``` 15 | Jupyter notebook大概依赖30~40个依赖包。 16 | ![部分依赖包](https://gitee.com/chasays/mdPic/raw/master/uPic/3XLaIQ.png) 17 | 18 | ## 运行 19 | 安装完之后在任意目录执行。命令`jupyter notebook`,然后就会在浏览器打开这个链接。 20 | ![运行图](https://gitee.com/chasays/mdPic/raw/master/uPic/EPIjPE.png) 21 | 22 | 打开连接之后可以看到效果图如下。 23 | ![效果](https://gitee.com/chasays/mdPic/raw/master/uPic/G6dN3b.png) 24 | 25 | 那么可以看到执行后的效果里面,就是当前运行目录里面的所有内容,如果当前目录有Python等其他的可执行文件,那么就可以直接执行。速度非常的快。 -------------------------------------------------------------------------------- /03_Language/Python/Python-formart用法.md: -------------------------------------------------------------------------------- 1 | 2 | >也可以参考的语雀空间。 3 | 4 | 5 | 6 | 7 | # 建议使用format()方法 8 | 字符串操作 对于 `%`, 官方以及给出这种格式化操作已经过时,在 `Python` 的未来版本中可能会消失。 在新代码中使用新的字符串格式。因此推荐大家使用`format()`来替换 %. 9 | 10 | 11 | format 方法系统复杂变量替换和格式化的能力,因此接下来看看都有哪些用法。 12 | 13 | # format() 14 | 这个方法是来自 `string` 模块的`Formatter`类里面的一个方法,属于一个内置方法。因此可以在属于 string 对象的范畴都可以调用这个方法。 15 | 16 | # 语法结构 17 | 18 | 这个方法太强大了,官方的用户是。 19 | 20 | ``` 21 | replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}" 22 | field_name ::= arg_name ("." attribute_name | "[" element_index "]")* 23 | arg_name ::= [identifier | integer] 24 | attribute_name ::= identifier 25 | element_index ::= integer | index_string 26 | index_string ::= + 27 | conversion ::= "r" | "s" | "a" 28 | format_spec ::= 29 | ``` 30 | 针对 format_spec 的用法如下 31 | ``` 32 | format_spec ::= [[fill]align][sign][#][0][width][,][.precision][type] 33 | fill ::= 34 | align ::= "<" | ">" | "=" | "^" 35 | sign ::= "+" | "-" | " " 36 | width ::= integer 37 | precision ::= integer 38 | type ::= "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%" 39 | ``` 40 | 说明: 41 | - `<` 强制字段在可用空间内左对齐 42 | - `>` 强制字段在可用空间内右对齐 43 | - `=` 填充位于符号(如果有的话)之后,但位于数字之前 44 | - `^` 强制场位于可用空间的中心 45 | 46 | 常用的方法有下面几个,format()方法中<模板字符串>的槽除了包括参数序号,还可以包括格式控制信息。此时,槽的内部样式如下: 47 | >{<参数序号>: <格式控制标记>} 48 | 49 | "{" [[identifier | integer]("." identifier | "[" integer | index_string "]")*]["!" "r" | "s" | "a"] [":" format_spec] "}" 50 | 51 | 其中,<格式控制标记>用来控制参数显示时的格式,包括:<填充><对齐><宽度>,<.精度><类型>6 个字段,这些字段都是可选的,可以组合使用,逐一介绍如下。 52 | 53 | 54 | # 常用表达 55 | - 指定位置 56 | ```python 57 | >>> '{0}, {1}, {2}'.format('a', 'b', 'c') 58 | 'a, b, c' 59 | >>> '{}, {}, {}'.format('a', 'b', 'c') # 3.1+ only 60 | 'a, b, c' 61 | >>> '{2}, {1}, {0}'.format('a', 'b', 'c') 62 | 'c, b, a' 63 | >>> '{2}, {1}, {0}'.format(*'abc') # unpacking argument sequence 64 | 'c, b, a' 65 | >>> '{0}{1}{0}'.format('abra', 'cad') # arguments' indices can be repeated 66 | 'abracadabra' 67 | ``` 68 | 如果要显示 `{` `}` 69 | 70 | ```python 71 | >>> '{{}}, {}, {}'.format('b', 'c') 72 | '{}, b, c' 73 | ``` 74 | 75 | - 指定名称 76 | ```py 77 | >>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W') 78 | 'Coordinates: 37.24N, -115.81W' 79 | >>> coord = {'latitude': '37.24N', 'longitude': '-115.81W'} 80 | >>> 'Coordinates: {latitude}, {longitude}'.format(**coord) 81 | 'Coordinates: 37.24N, -115.81W' 82 | ``` 83 | 84 | - 指定属性 85 | 对于复数来说,有2个属性。如果不知道属性具体名字是什么,可以用`dir`来查看。 86 | 87 | 88 | ```py 89 | >>> c = 3-5j 90 | >>> dir(c) 91 | [....... 'imag', 'real'] 92 | >>> ('The complex number {0} is formed from the real part {0.real} ' 93 | ... 'and the imaginary part {0.imag}.').format(c) 94 | 'The complex number (3-5j) is formed from the real part 3.0 and the imaginary part -5.0.' 95 | >>> class Point: 96 | ... def __init__(self, x, y): 97 | ... self.x, self.y = x, y 98 | ... def __str__(self): 99 | ... return 'Point({self.x}, {self.y})'.format(self=self) 100 | ... 101 | >>> str(Point(4, 2)) 102 | 'Point(4, 2)' 103 | ``` 104 | - 访问数组之类 105 | ```py 106 | >>> coord = (3, 5) 107 | >>> 'X: {0[0]}; Y: {0[1]}'.format(coord) 108 | 'X: 3; Y: 5' 109 | ``` 110 | - !s 区别 !r 111 | ```py 112 | >>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2') 113 | "repr() shows quotes: 'test1'; str() doesn't: test2" 114 | ``` 115 | 116 | - 文本对齐 117 | 118 | 下面文本居中和左有对齐 119 | ```py 120 | >>> '{:<30}'.format('left aligned') 121 | 'left aligned ' 122 | >>> '{:>30}'.format('right aligned') 123 | ' right aligned' 124 | >>> '{:^30}'.format('centered') 125 | ' centered ' 126 | >>> '{:*^30}'.format('centered') # use '*' as a fill char 127 | '***********centered***********' 128 | ``` 129 | - 指定类型 130 | 131 | `b`: 输出整数的二进制方式; 132 | `c`: 输出整数对应的 Unicode 字符; 133 | `d`: 输出整数的十进制方式; 134 | `o`: 输出整数的八进制方式; 135 | `x`: 输出整数的小写十六进制方式; 136 | ` X`: 输出整数的大写十六进制方式; 137 | 138 | ```py 139 | >>> '{:+f}; {:+f}'.format(3.14, -3.14) # show it always 140 | '+3.140000; -3.140000' 141 | >>> '{: f}; {: f}'.format(3.14, -3.14) # show a space for positive numbers 142 | ' 3.140000; -3.140000' 143 | >>> '{:-f}; {:-f}'.format(3.14, -3.14) # show only the minus -- same as '{:f}; {:f}' 144 | '3.140000; -3.140000' 145 | ``` 146 | 147 | - 逗号作为数千个分隔符: 148 | ```py 149 | >>> '{:,}'.format(1234567890) 150 | '1,234,567,890' 151 | ``` 152 | 153 | - 表示百分比 154 | ```py 155 | >>> points = 19 156 | >>> total = 22 157 | >>> 'Correct answers: {:.2%}.'.format(points/total) 158 | 'Correct answers: 86.36%' 159 | ``` 160 | 161 | - 特定格式,比如日期 162 | ```py 163 | >>> import datetime 164 | >>> d = datetime.datetime(2010, 7, 4, 12, 15, 58) 165 | >>> '{:%Y-%m-%d %H:%M:%S}'.format(d) 166 | '2010-07-04 12:15:58' 167 | ``` 168 | 169 | 170 | # 骚操作 171 | 可以用来输出一个表格,有点类似三方库prettytable的效果 172 | 173 | ```py 174 | >>> width = 5 175 | >>> for num in range(5,12): 176 | ... for base in 'dXob': # 分别为10/16/8/2进制 177 | ... print('{0:{width}{base}}'.format(num, base=base, width=width), end=' ') 178 | ... print() 179 | ... 180 | 5 5 5 101 181 | 6 6 6 110 182 | 7 7 7 111 183 | 8 8 10 1000 184 | 9 9 11 1001 185 | 10 A 12 1010 186 | 11 B 13 1011 187 | ``` 188 | # 高级用法 - 模板字符串 189 | 如果你是一个看Python语言工具的源码的话,会发现这么一个用法 - 模板字符串,比如`robot`里面`__init__.py`里面就有这么一个用法。先看例子 190 | ```py 191 | from string import Template 192 | 193 | errorMessageTemplate = Template("""$reason 194 | RIDE depends on wx (wxPython). .....""") 195 | 196 | .... 197 | 198 | print(errorMessageTemplate.substitute(reason="wxPython not found.")) 199 | ``` 200 | 如果是有问题就会打印 201 | ```py 202 | wxPython not found. 203 | RIDE depends on wx (wxPython). ..... 204 | ``` 205 | 首先要导入模板`Template`,看看里面有哪些属性 206 | ```py 207 | >>> from string import Template as t 208 | >>> dir(t) 209 | [.....'braceidpattern', 'delimiter', 'flags', 'idpattern', 'pattern', 'safe_substitute', 'substitute'] 210 | 211 | >>> s = Template('$who likes $what') 212 | >>> s.substitute(who='tim', what='kung pao') 213 | 'tim likes kung pao' 214 | 215 | 216 | >>> d = dict(who='tim') 217 | >>> Template('Give $who $100').substitute(d) 218 | Traceback (most recent call last): 219 | [...] 220 | ValueError: Invalid placeholder in string: line 1, col 10 221 | 222 | 223 | >>> Template('$who likes $what').substitute(d) 224 | Traceback (most recent call last): 225 | [...] 226 | KeyError: 'what' 227 | >>> Template('$who likes $what').safe_substitute(d) 228 | 'tim likes $what' 229 | ``` 230 | 231 | ## 相关阅读 232 | https://stackoverflow.com/questions/5082452/string-formatting-vs-format 233 | 234 | https://www.python.org/dev/peps/pep-3101 235 | 236 | https://blog.csdn.net/i_chaoren/article/details/77922939 237 | 238 | https://docs.python.org/release/3.1.5/library/stdtypes.html#old-string-formatting-operations 239 | 240 | https://docs.python.org/release/3.1.5/library/string.html#string-formatting 241 | 242 | 看完了是不是对 format 已经有很深的认识了吧。赶紧动起来,实践一下。 243 | 244 | Hi,Sup,如果觉得我写的不错,不妨帮个忙 245 | 246 | >1、可以关注我的公众号「程序员汇聚地」,每天分享互联网前沿技术,让你的琐碎时间不在无聊,听说关注了的人越来越优秀。 247 | 248 | 249 | > 2、顺手点个赞呗,可以让更多的人看到这篇文章,顺便激励下我,嘻嘻。 250 | 251 | -------------------------------------------------------------------------------- /03_Language/Python/Python-基础.md: -------------------------------------------------------------------------------- 1 | ## 实战项目 2 | 下图来自极客学院 Python核心技术与实战 3 | 4 | ![o3oaRD](https://gitee.com/chasays/mdPic/raw/master/uPic/o3oaRD.png) 5 | 6 | 7 | ## 列表和元组 8 | 9 | ## 字典和集合 -------------------------------------------------------------------------------- /03_Language/Python/Python-学习资源.md: -------------------------------------------------------------------------------- 1 | ## 了解 PYTHON 的必要资源 2 | 3 | 4 | 是目前世界上最受欢迎的编程语言。 正如2019年 Stack Overflow Survey 所指出的,它是第二受欢迎的编程语言,也是第四受欢迎的编程语言。 5 | >https://insights.stackoverflow.com/survey/2019#most-loved-dreaded-and-wanted 6 | 7 | 8 | 是一个简单易学,多才多艺的软件,并且被广泛应用于各种领域,从机器学习到数据科学到网络应用。 这就是为什么我们编制了一个 Python 资源列表供您阅读、聆听或订阅。 9 | 10 | # 10本学习 Python 的好书 11 | 12 | Python 是首先学习的最佳语言之一。 没有比读一本好书更好的深入钻研一门新语言的方法了。 这十本关于 Python 的书会让你从一个没有编程经验的人变成一个 Python 专家。 13 | 14 | ### 速成课程: 基于项目的动手编程导论(第二版) 15 | 16 | 17 | 18 | 对 Python 编程核心的简单介绍和适合初学者的完美书籍。 作者 Eric Matthes 提供了一般编程概念、 Python 基础和问题解决的基础知识。 本书第二部分的三个真实世界的项目允许读者以有用的方式应用他们的知识。 您将学习如何创建一个简单的视频游戏,如何使用数据可视化技术制作图表,以及如何构建和部署一个交互式 web 应用程序。 19 | 20 | ### Learn Python 3 the Hard Way : 计算机和代码的可怕美丽世界简介 21 | 22 | 23 | 这本书采取了不同的方法。 在《学 Python 3 the Hard Way 》一书中,你将通过52个精心制作的练习来学习 Python。 阅读它们。 精确地输入他们的代码(禁止复制和粘贴!) . 然后你会改正你的错误。 观看程序运行。 当你这样做的时候,你会学到计算机是如何工作的; 好的程序是什么样子的; 以及如何阅读、编写和思考代码。 24 | 25 | ### Python Programming Python : 《计算机科学概论》(第三版) 26 | 27 | 28 | 29 | 另一本免费的书(点击标题中的链接下载) ,Python 编程被设计用作大学级别计算第一课程的主要教科书。 它采用相当传统的方法,强调问题解决、设计和编程是计算机科学的核心技能。 然而,这些想法都是用 Python 来说明的。 是 Python 的创造者,他说这本书“实际上是对编程艺术的一个入门吉多·范罗苏姆,仅仅把 Python 作为初学者的首选媒介。” 30 | >ftp://140.118.199.9:2100/public9/2018_CE2002/W9Python/FOCUS/3ed-Zelle--PPTX/Python%20Programming--3ed.pdf 31 | 32 | ### Learning Python : 强大的面向对象程序设计 33 | 34 | 35 | 通过这本手把手的书,您可以获得对核心 Python 语言的全面、深入的介绍。 基于作者 Mark Lutz 广受欢迎的培训课程,这个更新的第五版将帮助您使用 Python 快速编写高效、高质量的代码。 无论你是编程新手还是精通其他语言的专业开发人员,这都是一个理想的开始方式。 36 | 37 | ### Python Cookbook (3rd ed.) (第三版) 38 | 39 | 这本独一无二的烹饪书收录了用 Python 3.3编写和测试的实用菜谱,是为有经验的 Python 程序员编写的,他们希望专注于现代工具和习惯用法。 在内部,您将找到十多个主题的完整配方,包括核心 Python 语言以及各种应用程序域的共同任务。 每个配方都包含您可以在项目中立即使用的代码示例,以及关于解决方案如何以及为什么工作的讨论。 40 | 41 | ### Learning With Python : 如何像计算机科学家一样思考(第三版) 42 | 43 | 44 | 一本免费的书(点击 PDF 标题上的链接) ,《用 Python 学习》讨论了编程的基础知识以及程序的组成。 然后,它继续介绍 Python 的基本概念,例如变量、函数、条件、富有成效的函数和迭代。 最后,本书讨论了对象、继承、列表、堆栈、队列、树和调试等核心概念。 45 | >https://buildmedia.readthedocs.org/media/pdf/howtothink/latest/howtothink.pdf 46 | 47 | ### Fluent Python 清晰、简洁、有效的程序设计 48 | 49 | 50 | Python 的简单性使您能够迅速变得高效,但这通常意味着您没有使用它所提供的所有功能。 通过这个实践指南,您将学习如何利用 Python 最好的、可能最容易被忽视的特性来编写有效的、惯用的 Python 代码。 许多经验丰富的程序员试图使 Python 适应他们从其他语言中学到的模式,并且从未在他们的经验之外发现 Python 特性。 在本书中,这些 Python 程序员将彻底学习如何精通 Python 3。 51 | 52 | ### Introduction to Machine Learning With Python : 数据科学家指南 53 | 54 | 55 | 56 | 机器学习已经成为许多商业应用和研究项目中不可或缺的一部分,但这个领域并不仅限于拥有广泛研究团队的大公司。 如果您使用 Python,即使是初学者,本书将教您构建自己的机器学习解决方案的实用方法。 现在有了这么多的数据,机器学习的应用程序只会受到你想象力的限制。 57 | 58 | ### Python Tricks: 特性自助餐 59 | 60 | 使用 Python Tricks,您将通过简单的示例和逐步的叙述了解 Python 的最佳实践和优美的 Python 代码的威力。 您离掌握 Python 又近了一步,因此您可以编写自然而然的优美惯用代码。 有了这本书,你将能够专注于真正重要的实践技能。 发现 Python 标准库中的“隐藏的黄金” ,并从今天开始编写干净的 Python 代码。 61 | 62 | ### Effective Python 63 | 64 | 65 | 66 | 这本书有59个 Python 最佳实践、技巧和快捷方式,并用实际的代码示例解释了它们。 凭借在 Google 构建 Python 基础设施的多年经验,Brett Slatkin 揭示了一些鲜为人知的怪癖和习惯,这些怪癖和习惯对代码行为和性能有很大的影响。 您将学习完成关键任务的最佳方法,因此您可以编写更容易理解、维护和改进的代码。 67 | 68 | # 推荐几个 Python 博客 69 | 70 | 订阅这8个博客,了解最新的 Python 新闻,发现新的 Python 框架,学习新的 Python 技巧,使您更有效率和效率。 71 | 72 | 73 | ### Planet Python 74 | >https://planetpython.org/ 75 | 76 | Planet Python 是一个 Python 博客聚合器,可用于查找与 Python 相关的新博客或快速浏览来自多个博客的最新 Python 文章。 77 | 78 | 79 | 80 | ### 巨蟒大师 81 | >https://thepythonguru.com/ 82 | 83 | 是一个学习 Python 的网站,也是一个介绍 Python 最新更新的博客。 它的教程涵盖了成为一个熟练的 Python 开发人员所需的一切知识。 84 | 85 | ### 真正的 Python 86 | >https://realpython.com/ 87 | 88 | 是另一个学习 Python 的网站,也有一个优秀的时事通讯。 它有针对 Python 特定应用的教程、交互式视频、小测验和学习路径(例如数据科学、机器学习、 DevOps)。 89 | 90 | ### Python 小技巧 91 | >https://pythontips.com/ 92 | 93 | 是 Yasoob Khalid 的博客,它的博客专门围绕一些小技巧和窍门来提高你的 Python 体验。 你也可以订阅 Yasoob 的时事通讯,它有将近40000个追随者。 94 | 95 | ### 全堆栈 Python 96 | >https://www.fullstackpython.com/ 97 | 98 | 全堆栈 Python 是为那些已经有点熟悉 Python 并希望用新学习的语言实现某些东西的程序员准备的。 全堆栈 Python 是一个网站,旨在帮助您学习创建、部署和操作 Python 驱动的应用程序所需的一切。 99 | 100 | 101 | >https://x-team.com/blog/essential-python-resources/ -------------------------------------------------------------------------------- /04_CI_CD/01_什么是CICD.md: -------------------------------------------------------------------------------- 1 | #todo -------------------------------------------------------------------------------- /05_Others/01_博客.md: -------------------------------------------------------------------------------- 1 | 2 | http://kaner.com/?page_id=11 3 | -------------------------------------------------------------------------------- /05_Others/02_测试书籍.md: -------------------------------------------------------------------------------- 1 | Google 测试之道 2 | 3 | ![JI5bb1](https://gitee.com/chasays/mdPic/raw/master/uPic/JI5bb1.jpg) 4 | 5 | ![WechatIMG6](https://gitee.com/chasays/mdPic/raw/master/uPic/WechatIMG6.jpeg) -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令01 - cd.md: -------------------------------------------------------------------------------- 1 | 2 | 在 linux 中,`cd `命令被称为修改目录命令,用来修改当前的工作目录。 3 | 4 | # 帮助 5 | 用 `man` 命令可以看到其帮助信息。我本地是macOS看到是下面这个,只是提示了是内建builtin命令。 6 | ![A1owWD](https://gitee.com/chasays/mdPic/raw/master/uPic/A1owWD.png) 7 | 8 | `cd `是一个 shell 内置的,它的行为可能因 shell 而略有不同。 它使用 shell 环境变量来确定执行所需的信息。 9 | 10 | 11 | 12 | 这个是centos系统看到的man信息。 13 | ![hcZ3cI](https://gitee.com/chasays/mdPic/raw/master/uPic/hcZ3cI.png) 14 | 15 | # 语法 16 | 17 | 命令的语法如下: 18 | ``` 19 | cd [OPTIONS] directory 20 | 21 | ``` 22 | # 参数 23 | 该命令只接受两个很少使用的选项。 24 | 25 | ``` 26 | −L 这个是默认的,跟随符号链接。 27 | −P 当指定此选项并试图导航到指向某个目录的符号链接时。 28 | ``` 29 | 30 | - 在最简单的形式下,当不带任何参数地使用时,cd 会将您带到您的家目录。 31 | - 在浏览文件系统时,可以使用 Tab 键自动完成目录的名称。 在目录名的末尾添加一个斜杠是可选的。 32 | - 若要切换到某个目录,必须具有该目录的可执行权限。 33 | - pwd 命令允许您查找当前所在的目录。 34 | 35 | 36 | # 绝对路径和相对路径 37 | 38 | 指定要更改为的目录时,可以使用绝对路径名或相对路径名。 绝对路径或完整路径从系统根 / 开始,相对路径从工作目录 / 开始。 39 | 40 | 默认情况下,当您登录到 Linux 系统时,您当前的工作目录文件夹设置为您的主目录。 假设 Downloads 目录存在于您的主目录中,您可以通过使用该目录的相对路径导航到它: 41 | 42 | ![1fFrei](https://gitee.com/chasays/mdPic/raw/master/uPic/1fFrei.png) 43 | 44 | 45 | 比如 46 | ``` 47 | ➜ ~ cd Music 48 | ``` 49 | 上面这个命令和下面这个命令是一样的效果 50 | ``` 51 | cd /home/admin/Music 52 | ``` 53 | 54 | 简而言之,如果路径以斜杠(/)开头,那么它就是目录的绝对路径。 55 | 56 | # 父目录 57 | 58 | 在类 unix 操作系统上,当前的工作目录用一个点表示 `.` 两个点 `..` ,表示父目录,其实父目录就是该目录的上一级目录。编程中,有很多这样的,都是由「parent」翻译过来的。还有父类、父类的父类、超类等。 59 | 60 | 如果你输入 `cd .` ,你会变成工作目录,换句话说,命令什么都不会做。 61 | 假设您当前位于 /usr/local/share 目录中,要切换到 /usr/local 目录(比工作目录目录高一级) ,您需要输入: 62 | 63 | ``` 64 | $ cd ../ 65 | 66 | ``` 67 | 68 | 要向上移动两级到 /usr 目录(父目录的父目录) ,可以运行以下命令: 69 | 70 | ``` 71 | $ cd ../.. 72 | 73 | ``` 74 | 75 | 76 | 这是另一个例子。 假设您位于 /usr/local/share 目录中,希望切换到 /usr/local/src。 你可以通过输入 77 | 78 | ``` 79 | $ cd ../src 80 | ``` 81 | # 切换到上一个工作目录 82 | 83 | 要更改回前一个工作目录,将 dash (-)字符作为参数传递给 cd 命令: 84 | 85 | ``` 86 | $ cd - 87 | ``` 88 | 89 | # 切换到家目录 90 | 91 | 要导航到您的假目录,只需键入 cd。 另一种直接返回家目录的方法是使用波浪号(~)字符,如下所示: 92 | 93 | ``` 94 | $ cd ~ 95 | ``` 96 | 97 | # 有空格的目录 98 | 99 | 如果要更改的目录名称中有空格,则应在路径周围加上引号,或使用反斜杠(\\)字符转义空格: 100 | 比如我要切换到带有空格的目录。 101 | ``` 102 | $ cd Creative\ Cloud\ Files 103 | ``` 104 | Note: 也可以敲完第一个单词直接` tab` 键,自动补全。 105 | ![bctyuQ](https://gitee.com/chasays/mdPic/raw/master/uPic/bctyuQ.png) 106 | # 小结 107 | 108 | 现在,您应该已经很好地理解了什么是当前的工作目录`/`目录,以及如何使用` cd` 命令切换到不同的目录。 109 | 110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令02 - mv.md: -------------------------------------------------------------------------------- 1 | 移动文件和目录是您在 Linux 系统上经常需要执行的最基本的任务之一。 2 | 3 | `mv` 命令(简称 move)用于将文件和目录从一个位置重命名并移动到另一个位置。 命令的语法如下: 4 | 5 | ``` 6 | mv [OPTIONS] SOURCE DESTINATION 7 | 8 | ``` 9 | Source `可以是一个或多个文件或目录`,DESTINATION `只能是是单个文件或目录`。 10 | 11 | - 当`多个文件`或目录作为SOURCE, the 、`DESTINATION必须是一个目录`。所以文件被移动到目标目录 12 | - 如果将单个文件指定为SOURCE, 目标是一个现有的目录,然后该文件被移动到指定的目录。 13 | - 如果将单个文件指定为SOURCE, 一个单一的文件作为那么你就是目标`重命名文件`. 14 | - 当SOURCE是一个目录,DESTINATION 根本不存在,SOURCE将被改名为DESTINATION. 反之,它被移动到`内部DESTINATION目录` 15 | 16 | Note: 要移动文件或目录,您需要对 SOURCE 和 DESTINATION 都具有写权限。 否则,您将收到一个被拒绝的权限错误。 17 | 18 | # Talk is cheap 19 | 20 | # 简单用法 21 | 22 | 例如,要将文件 file1从当前工作目录文件夹移动到 / tmp 目录,您可以运行: 23 | 24 | ``` 25 | 26 | mv file1 /tmp 27 | ``` 28 | 29 | 要重命名一个文件,你需要指定目标文件名: 30 | 31 | 32 | ``` 33 | mv file1 file2 34 | 35 | ``` 36 | 37 | 移动目录的语法与移动文件时相同。 在下面的示例中,如果 dir2目录存在,则该命令将 dir1移动到 dir2中。 如果 dir2不存在,dir1将被重命名为 dir2: 38 | ``` 39 | mv dir1 dir2 40 | ``` 41 | 42 | ## 移动多个文件和目录 43 | 44 | 若要移动多个文件和目录,请指定要移动的文件作为源文件。 例如,要将 file1和 file2文件移动到 dir1目录,您可以输入: 45 | ``` 46 | mv file1 file2 dir1 47 | ``` 48 | 49 | 命令也允许你使用模式匹配。 例如,要将所有 pdf 文件从工作目录目录移动到 ~ / Documents 目录,你可以使用: 50 | ``` 51 | mv *.pdf ~/Documents 52 | ``` 53 | 54 | ## 参数 55 | 56 | `mv` 命令接受几个影响默认命令行为的选项。 57 | 58 | 在某些 Linux 发行版中,mv 可能是 mv 命令的别名,并带有一组自定义选项。 例如,在 CentOS 中,mv 是 mv-i 的别名。 您可以使用 type 命令查看 mv 是否是别名: 59 | ``` 60 | type mv 61 | ``` 62 | ![aF0FBl](https://gitee.com/chasays/mdPic/raw/master/uPic/aF0FBl.png) 63 | 64 | 如果 mv 是别名,输出结果如下: 65 | ``` 66 | mv is aliased to `mv -i' 67 | ``` 68 | 69 | 如果给出了冲突的选项,则最后一个选项优先。 70 | 71 | ## 覆盖前的提示符 72 | 73 | 默认情况下,如果目标文件存在,它将被覆盖。要提示确认,使用-i 选项: 74 | ``` 75 | mv -i file1 /tmp 76 | ``` 77 | 78 | 返回结果就是 79 | ``` 80 | mv: overwrite '/tmp/file1'? 81 | 82 | ``` 83 | 覆盖文件类型 y 或 Y。 84 | 85 | ## 强制覆盖 86 | 87 | 88 | 如果您尝试覆盖只读文件,mv 命令将提示您是否要覆盖该文件: 89 | 90 | ``` 91 | mv -i file1 /tmp 92 | mv: replace '/tmp/file1', overriding mode 0400 (r--------)? 93 | ``` 94 | 为了避免被提示,请使用-f 选项: 95 | ``` 96 | mv -f file1 /tmp 97 | 98 | ``` 99 | 100 | 当您需要覆盖多个只读文件时,此选项特别有用。 101 | 102 | ## 不要覆盖现有的文件 103 | 104 | n 选项告诉 mv 永远不要覆盖任何现有文件: 105 | ``` 106 | mv -f file1 /tmp 107 | ``` 108 | 109 | 如果文件1存在,上面的命令将不执行任何操作,否则它将把文件移动到 / tmp 目录。 110 | 111 | ## 备份文件 112 | 113 | 如果目标文件存在,您可以使用-b 选项创建它的备份: 114 | ``` 115 | mv -b file1 /tmp 116 | ``` 117 | 备份文件将具有与原始文件相同的名称,并附加一个波浪号(~)。 118 | 119 | 120 | 使用 ls 命令验证备份是否已创建: 121 | 122 | ```ls /tmp/file1* 123 | /tmp/file1 /tmp/file1~ 124 | ``` 125 | ## 详细输出 126 | 127 | 另一个可能有用的选项是-v。 当使用此选项时,命令输出每个移动文件的名称: 128 | ``` 129 | mv -i file1 /tmp 130 | renamed 'file1' -> '/tmp/file1' 131 | ``` 132 | 133 | ## 小结 134 | 135 | `mv` 命令用于移动和重命名文件和目录。 136 | 有关 mv 命令的详细信息,请查看手册页或在终端中键入` man mv`。 137 | ![zquN8k](https://gitee.com/chasays/mdPic/raw/master/uPic/zquN8k.png) 138 | 被命令行吓到的新 Linux 用户可以使用 GUI 文件管理器来移动他们的文件。 139 | 140 | -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令03 - grep.md: -------------------------------------------------------------------------------- 1 | 2 | grep 命令代表“全局正则表达式 print” ,它是 Linux 中最强大和最常用的命令之一。 3 | 4 | ![1mxfNj](https://gitee.com/chasays/mdPic/raw/master/uPic/1mxfNj.png) 5 | grep 在一个或多个输入文件中搜索与给定模式匹配的行,并将每个匹配行写入标准输出。 如果没有指定文件,`grep` 将从标准输入读取,这通常是另一个命令的输出。 6 | 7 | 在本文中,我们将通过实例和对最常见的 GNU `grep` 选项的详细说明,向您展示如何使用 `grep` 命令。 8 | ![Bm1gUK](https://gitee.com/chasays/mdPic/raw/master/uPic/Bm1gUK.png) 9 | 10 | 11 | ## `grep` 命令语法 12 | 13 | grep 命令的语法如下: 14 | ``` 15 | grep [OPTIONS] PATTERN [FILE...] 16 | ``` 17 | 方括号中的项目是可选的。 18 | 19 | OPTIONS - 既然可选,就是可以要可不要。 20 | PATTERN - 搜寻模式 21 | FILE - 零个或多个输入文件名 22 | 23 | >为了能够搜索该文件,运行该命令的用户必须具有对该文件的读访问权。 24 | 25 | ## 搜索文件中的字符串 26 | grep 命令最基本的用法是在文件中搜索字符串(文本)。 27 | 28 | For example, to display all the lines containing the string bash from the /etc/passwd file, you would run the following command: 29 | 30 | 例如,要显示/etc/passwd 文件中包含字符串 bash 的所有行,可以运行以下命令: 31 | ``` 32 | grep bash /etc/passwd 33 | ``` 34 | 输出应该是这样的: 35 | ``` 36 | root:x:0:0:root:/root:/bin/bash 37 | linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash 38 | ``` 39 | 如果字符串包含空格,需要用单引号或双引号将其括起来: 40 | ``` 41 | grep "Gnome Display Manager" /etc/passwd 42 | ``` 43 | ## 反相匹配(排除) 44 | 45 | 若要显示与模式不匹配的行,请使用-v (或 --invert-match)选项。 46 | 47 | 例如,要打印不包含字符串 nologin 的行,可以使用: 48 | 49 | ``` 50 | grep -v nologin /etc/passwd 51 | root:x:0:0:root:/root:/bin/bash 52 | colord:x:124:124::/var/lib/colord:/bin/false 53 | git:x:994:994:git daemon user:/:/usr/bin/git-shell 54 | linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash 55 | ``` 56 | ## 使用 `grep` 筛选命令的输出 57 | 58 | 命令的输出可以通过管道使用 `grep` 进行过滤,并且只有与给定模式匹配的行才会打印在终端上。 59 | 60 | 61 | 例如,要查找系统中作为用户 www-data 运行的进程,可以使用以下 ps 命令: 62 | ``` 63 | ps -ef | grep www-data 64 | www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www 65 | root 18272 17714 0 16:00 pts/0 00:00:00 `grep` --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data 66 | www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process 67 | www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process 68 | ``` 69 | 您还可以根据命令连接多个管道。 正如您在上面的输出中看到的,还有一行包含 `grep` 进程。 如果不希望显示该行,则将输出传递给另一个 `grep` 实例,如下所示。 70 | ``` 71 | ps -ef | grep www-data | grep -v grep 72 | www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www 73 | root 18272 17714 0 16:00 pts/0 00:00:00 `grep` --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data 74 | www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process 75 | www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process 76 | ``` 77 | ## 递归搜索 78 | 要递归搜索模式,可以使用 -r 选项(或 --recursive)调用 `grep`。 当使用此选项时,`grep` 将搜索指定目录中的所有文件,递归地跳过遇到的符号链接。 79 | 80 | 81 | 若要跟踪所有符号链接,请使用-R 选项,而不是-r。 82 | 83 | 84 | 下面的示例演示如何在/etc 目录中的所有文件中搜索字符串 chasays.github.io: 85 | ``` 86 | grep -r chasays.github.io /etc 87 | ``` 88 | 输出将包括以文件的完整路径为前缀的匹配行: 89 | ``` 90 | /etc/hosts:127.0.0.1 node2.chasays.github.io 91 | /etc/nginx/sites-available/chasays.github.io: server_name chasays.github.io www.chasays.github.io; 92 | ``` 93 | 如果使用-r 选项,`grep` 将跟随所有符号链接: 94 | `` 95 | grep -R chasays.github.io /etc 96 | `` 97 | 注意下面输出的最后一行。 当使用-rmr 调用 `grep` 时,不会打印该行,因为 Nginx 启用站点的目录中的文件是到 sites-available 目录中的配置文件的符号链接。 98 | 99 | ``` 100 | /etc/hosts:127.0.0.1 node2.chasays.github.io 101 | /etc/nginx/sites-available/chasays.github.io: server_name chasays.github.io chasays.github.io; 102 | /etc/nginx/sites-enabled/chasays.github.io: server_name chasays.github.io chasays.github.io; 103 | ``` 104 | ## 只显示文件名 105 | 若要禁止默认 `grep` 输出并只打印包含匹配模式的文件名,请使用-l (或 --files-with-matches)选项。 106 | 107 | 108 | 下面的命令搜索所有以。 在当前工作目录中输出包含字符串 linuxize. com 的文件名: 109 | ``` 110 | grep -l chasays.github.io *.conf 111 | ``` 112 | 输出结果如下: 113 | ``` 114 | tmux.conf 115 | haproxy.conf 116 | ``` 117 | The -l option is usually used in combination with the recursive option -R: 118 | 119 | -l 选项通常与递归选项 -R 结合使用: 120 | ``` 121 | grep -Rl chasays.github.io /tmp 122 | ``` 123 | ## 不区分大小写的搜索 124 | 125 | 默认情况下,`grep` 区分大小写,这意味着大小写字符被视为不同字符。 126 | 127 | 128 | 若要在搜索时忽略大小写,请使用-i 选项(或 --ignore-case)调用 `grep`。 129 | 130 | 131 | 例如,当搜索没有任何选项的 Zebra 时,下面的命令不会显示任何输出,即有匹配的行: 132 | ``` 133 | grep Zebra /usr/share/words 134 | ``` 135 | 但是如果使用-i 选项执行不区分大小写的搜索,它将匹配大小写字母: 136 | ``` 137 | grep -i Zebra /usr/share/words 138 | ``` 139 | 指定“ Zebra”将匹配“ Zebra”、“ Zebra”或该字符串的任何其他大小写字母组合。 140 | ``` 141 | zebra 142 | zebra's 143 | zebras 144 | ``` 145 | 146 | ## 搜索全文 147 | 在搜索字符串时,`grep` 将显示字符串嵌入较大字符串中的所有行。 148 | 149 | 150 | 例如,如果搜索“ gnu” ,所有“ gnu”嵌入在较大单词中的行,如“ cygnus”或“ magnum”将被匹配: 151 | ``` 152 | grep gnu /usr/share/words 153 | 154 | cygnus 155 | gnu 156 | interregnum 157 | lgnu9d 158 | lignum 159 | magnum 160 | magnuson 161 | sphagnum 162 | wingnut 163 | ``` 164 | 165 | 若要仅返回指定字符串为整个单词(由非单词字符括起来)的那些行,请使用-w (或 --word-regexp)选项。 166 | 167 | >字符包括字母数字字符(a-z, A-Z, and ,及0-9) ( )及下划线(_). 所有其他字符都视为非字符 168 | 169 | 如果您运行与上面相同的命令(包括 -w 选项) ,`grep` 命令将只返回 gnu 作为单独的单词包含的那些行。 170 | ``` 171 | grep -w gnu /usr/share/words 172 | gnu 173 | ``` 174 | 175 | ## 显示行号 176 | 177 | -n (或 --line-number)选项告诉 `grep` 显示包含与模式匹配的字符串的行的行号。 使用此选项时,`grep` 将匹配内容打印到以行号为前缀的标准输出。 178 | 179 | 180 | 例如,要显示/etc/services 文件中包含以匹配行号作为前缀的字符串 bash 的行,可以使用以下命令: 181 | ``` 182 | grep -n 10000 /etc/services 183 | ``` 184 | 下面的输出显示匹配项在第10423和10424行。 185 | ``` 186 | 10423:ndmp 10000/tcp 187 | 10424:ndmp 10000/udp 188 | ``` 189 | 190 | ## 计数匹配 191 | 192 | 若要将匹配行数打印到标准输出,请使用 -c (或 --count)选项。 193 | 194 | 195 | 在下面的示例中,我们计算了将/usr/bin/zsh 作为 shell 的帐户数量。 196 | ``` 197 | grep -c '/usr/bin/zsh' /etc/passwd 198 | 199 | 4 200 | ``` 201 | 202 | ## 安静模式 203 | 204 | Q (或 --quiet)告诉 `grep` 在安静模式下运行,不要在标准输出上显示任何内容。 如果找到匹配项,则该命令退出状态为0。 在 shell 脚本中使用 `grep` 时,这非常有用,您希望检查文件是否包含字符串,并根据结果执行特定操作。 205 | 206 | 207 | 下面是一个在静默模式下使用 `grep` 作为 if 语句中的测试命令的示例: 208 | ``` 209 | if `grep` -q PATTERN filename 210 | then 211 | echo pattern found 212 | else 213 | echo pattern not found 214 | fi 215 | ``` 216 | 217 | 218 | 219 | ## 基本正则表达式 220 | 221 | Gnu`grep` 有三个正则表达式特性集,Basic、 Extended 和 perl 兼容。 222 | 223 | 224 | 默认情况下,`grep` 将模式解释为基本正则表达式,其中除元字符外的所有字符实际上都是匹配自身的正则表达式。 225 | 226 | 227 | 下面是最常用的元字符列表: 228 | 229 | 230 | 使用 ^ (插入符号)符号来匹配行开头的表达式。 在下面的示例中,只有当字符串 kangaroo 出现在行的开头时,它才会匹配。 231 | ``` 232 | grep "^kangaroo" file.txt 233 | ``` 234 | 使用 $(dollar)符号来匹配行尾的表达式。 在下面的示例中,只有当字符串 kangaroo 出现在行的末尾时,它才会匹配。 235 | ``` 236 | grep "kangaroo$" file.txt 237 | ``` 238 | 239 | 使用。 (句号)符号来匹配任何单个字符。 例如,要匹配以 kan 开头,然后有两个字符和以字符串 roo 结尾的任何内容,您可以使用以下模式: 240 | ``` 241 | grep "kan..roo" file.txt 242 | ``` 243 | 244 | 使用[](方括号)匹配括在方括号中的任何单个字符。 例如,找到包含 accept 或者 accent 的行,你可以使用以下模式: 245 | ``` 246 | grep "acce[np]t" file.txt 247 | ``` 248 | 249 | 使用[ ^ ](方括号)匹配括在方括号中的任何单个字符。 下面的模式将匹配包含 co (除了 l 以外的任何字母) a 的任何字符串组合,如可可、钴等,但不匹配包含可乐的线, 250 | ``` 251 | grep "co[^l]a" file.txt 252 | 253 | ``` 254 | 若要转义下一个字符的特殊含义,请使用(反斜杠)符号。 255 | 256 | ## 扩展的正则表达式 257 | 258 | 若要将模式解释为扩展正则表达式,请使用-e (或 --extended-regexp)选项。 扩展的正则表达式包括所有基本元字符,以及用于创建更复杂、更强大的搜索模式的附加元字符。 以下是一些例子: 259 | 260 | 261 | 匹配并提取给定文件中的所有电子邮件地址: 262 | ``` 263 | grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt 264 | ``` 265 | 匹配并提取给定文件中的所有有效 IP 地址: 266 | ``` 267 | grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt 268 | ``` 269 | O 选项仅用于打印匹配的字符串。 270 | 271 | ## 搜索多个字符串(模式) 272 | 可以使用 OR 操作符 | 连接两个或多个搜索模式。 273 | 274 | 275 | 默认情况下,`grep` 将模式解释为一个基本的正则表达式,其中 | 等元字符失去了它们的特殊含义,必须使用它们的反斜线版本。 276 | 277 | 278 | 在下面的例子中,我们正在 Nginx 日志错误文件中搜索出现的词汇 fatal,error,critical: 279 | ``` 280 | grep 'fatal\|error\|critical' /var/log/nginx/error.log 281 | ``` 282 | 如果使用扩展正则表达式选项-e,则不应转义运算符 | ,如下所示: 283 | ``` 284 | grep -E 'fatal|error|critical' /var/log/nginx/error.log 285 | ``` 286 | ## 在匹配之前打印行 287 | 288 | 若要在匹配行之前打印特定行数,请使用-b (或 --before-context)选项。 289 | 290 | 291 | 例如,要在匹配行之前显示五行前导上下文,可以使用以下命令: 292 | ``` 293 | grep -B 5 root /etc/passwd 294 | ``` 295 | ![zwEsXm](https://gitee.com/chasays/mdPic/raw/master/uPic/zwEsXm.png) 296 | ## 匹配后打印行 297 | 298 | 若要在匹配行之后打印特定行数,请使用 -a (或 --after-context)选项。 299 | 300 | 301 | 例如,要在匹配行之后显示五行尾随上下文,可以使用以下命令: 302 | ``` 303 | grep -A 5 root /etc/passwd 304 | ``` 305 | ![hnWXx0](https://gitee.com/chasays/mdPic/raw/master/uPic/hnWXx0.png) 306 | ## 小结 307 | 308 | grep 命令允许您在文件内搜索模式。 如果找到匹配项,`grep` 将打印包含指定模式的行。 309 | 在 `grep` 用户手册页面上有很多关于 `grep` 的信息。 310 | 311 | 312 | 313 | >https://www.gnu.org/software/`grep`/manual/`grep`.html -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令04 - ls.md: -------------------------------------------------------------------------------- 1 | `ls` 命令是任何 Linux `用户都应该知道的基本命令之一`。 它用于列出有关文件系统中的文件和目录的信息。 `ls` 实用程序是安装在所有 Linux 发行版上的 Linux/Linux/Linux GNU核心工具组包的一部分。 2 | 3 | 4 | 在本教程中,我们将通过实际例子和最常见的 ls 选项的详细说明,向您展示如何使用 ls 命令。 5 | 6 | ## 如何使用ls Command 命令 7 | 8 | `ls` 命令的语法如下: 9 | ``` 10 | ls [OPTIONS] [FILES] 11 | ``` 12 | ![2b98f2](https://gitee.com/chasays/mdPic/raw/master/uPic/2b98f2.png) 13 | 当没有选项和参数时,ls 会显示当前工作目录中所有文件的名称列表: 14 | ``` 15 | ls 16 | ``` 17 | 这些文件被列在字母顺序文档中: 18 | 19 | 20 | 若要列出特定目录中的文件,请将路径作为参数传递给 ls 命令。 例如,要列出/etc 目录的内容,您可以键入: 21 | ``` 22 | ls /etc 23 | ``` 24 | 您还可以将多个目录和文件传递给以空格分隔的 ls 命令: 25 | ``` 26 | ls /etc/var /etc/passwd 27 | ``` 28 | 29 | 如果你登录的用户没有读取该目录的权限,你会得到一条消息说 ls 不能打开该目录: 30 | ``` 31 | ls /root 32 | ls: cannot open directory '/root': Permission denied 33 | ``` 34 | 35 | `ls` 命令有许多选项。在下面的部分中,我们将探讨最常用的选项。 36 | 37 | ## 单纯的list 38 | 39 | `ls` 命令的默认输出只显示文件和目录的名称,这没有提供很多信息。 40 | 41 | 42 | -l (小写l)选项使 ls 以长列表格式打印文件。 43 | 44 | 当使用长列表格式时,ls 命令将显示以下文件信息: 45 | 46 | ## 文件类型 47 | - 文件权限 48 | - 指向文件的硬链接数 49 | - 文件所有者 50 | - 文件组 51 | - 文件大小 52 | - 日期及时间 53 | - 档案名称 54 | - 55 | 考虑下面的例子: 56 | ``` 57 | ls -l /etc/hosts 58 | -rw-r--r-- 1 root wheel 372 3 7 23:56 /etc/hosts 59 | ``` 60 | ![fKIfjQ](https://gitee.com/chasays/mdPic/raw/master/uPic/fKIfjQ.png) 61 | 让我们解释一下输出中最重要的列。 62 | 63 | 64 | 第一个字符显示文件类型。 在我们的示例中,第一个字符是-,表示一个常规文件。 其他文件类型的值如下: 65 | 66 | - `-` 普通档案 67 | b - 阻塞特殊文件 68 | c - 字符特殊文件 69 | d - 目录 70 | l - 符号链接 71 | n - 网络档案 72 | 73 | p - 先进先出法 74 | s - 插座 75 | 76 | 接下来的九个字符显示文件权限。 前三个字符用于用户,后三个字符用于组,最后三个字符用于其他用户。 您可以使用 chmod 命令更改文件权限。 权限字符可以具有以下值: 77 | 78 | r - 读取文件的权限 79 | w - 写入文件的权限 80 | x - 执行文件的权限 81 | s - setgid 位 82 | t - 粘性钻头 83 | 84 | 在我们的示例中,rw-r -- r -- 意味着用户可以读写文件,组和其他用户只能读取文件。 权限字符后面的数字1是指向该文件的硬链接的数量。 85 | 86 | 87 | 接下来的两个字段 root 显示文件所有者和组,后面是文件的大小(337) ,以字节为单位显示。 如果要以人类可读的格式打印大小,请使用 -h 选项。 您可以使用 chown 命令更改文件所有者。 88 | 89 | 10月4日11:31是最后一次修改文件的日期和时间。 90 | 91 | 最后一列是文件的名称。 92 | 93 | ## 显示隐藏文件 94 | 95 | 默认情况下,ls 命令不会显示隐藏文件。 在 Linux 中,隐藏文件是任何以点(.)开头的文件 . 96 | 97 | 要显示包括隐藏文件在内的所有文件,请使用-a 选项: 98 | ``` 99 | ls -la ~/ 100 | drwxr-x--- 10 linuxize linuxize 4096 Feb 12 16:28 . 101 | drwxr-xr-x 18 linuxize linuxize 4096 Dec 26 09:21 .. 102 | -rw------- 1 linuxize linuxize 1630 Nov 18 2017 .bash_history 103 | drwxr-xr-x 2 linuxize linuxize 4096 Jul 20 2018 bin 104 | drwxr-xr-x 2 linuxize linuxize 4096 Jul 20 2018 Desktop 105 | drwxr-xr-x 4 linuxize linuxize 4096 Dec 12 2017 .npm 106 | drwx------ 2 linuxize linuxize 4096 Mar 4 2018 .ssh 107 | ``` 108 | ## 对输出进行排序 109 | 110 | 如前所述,默认情况下 ls 命令列出了字母顺序文件。 111 | 112 | 排序选项允许你根据扩展、大小、时间和版本对输出进行排序: 113 | 114 | --sort=extension(或-X ) 按扩展名的字母顺序排序 115 | --sort=size /(或-S) 按文件大小排序 116 | --sort=time (或-t)按修改时间排序 117 | --sort=version /(或-v) 版本号自然排序 118 | 119 | 如果希望以相反的排序顺序获得结果,请使用-r 选项。 120 | 121 | 例如,根据修改时间对/var 目录中的文件按相反的排序顺序进行排序: 122 | ``` 123 | ls -ltr /var 124 | ``` 125 | ![UCDB6B](https://gitee.com/chasays/mdPic/raw/master/uPic/UCDB6B.png) 126 | 值得一提的是,ls 命令没有显示目录内容占用的总空间。 使用 du 命令获取目录的大小。 127 | 128 | ## 递归列出子目录 129 | 130 | R 选项告诉 ls 命令递归地显示子目录的内容: 131 | ``` 132 | ls -R 133 | ``` 134 | ![lONFXk](https://gitee.com/chasays/mdPic/raw/master/uPic/lONFXk.png) 135 | 136 | ## 小结 137 | 138 | `ls` 命令列出有关文件和目录的信息。 139 | 有关 ls 的详细信息,请访问 GNU Coreutils 页面或在终端中键入 man ls。 140 | 141 | >https://www.gnu.org/software/coreutils/manual/html_node/ls-invocation.html#ls-invocation -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令05 - 文本追加到文件中.md: -------------------------------------------------------------------------------- 1 | 在 `Bash` 中,有多种将文本附加到文件的方法。 2 | 3 | 4 | 要将文本附加到文件,您需要对其具有写权限。 否则,您将收到一个被拒绝的权限错误。 5 | 6 | ## ( 使用重定向操作符(>>) 7 | 8 | 重定向允许您捕获命令的输出,并将其作为输入发送到另一个命令或文件。 重定向运算符将输出追加到给定文件。 9 | 10 | 11 | 您可以使用许多命令将文本打印到标准输出并将其重定向到文件,其中 `echo` 和 `printf` 是最常用的命令。 12 | 13 | 若要将文本附加到文件,请在重定向操作符后指定文件名: 14 | ``` 15 | echo "this is a new line" >> file.txt 16 | ``` 17 | ![RRU1LT](https://gitee.com/chasays/mdPic/raw/master/uPic/RRU1LT.png) 18 | 当与 `-e` 选项一起使用时,`echo `命令解释反斜杠转义字符,如换行 `\n`: 19 | ``` 20 | echo -e "this is a new line \nthis is another new line" >> file.txt 21 | ``` 22 | 23 | ![TFLfuC](https://gitee.com/chasays/mdPic/raw/master/uPic/TFLfuC.png) 24 | 25 | 如果你想生成更复杂的输出,可以使用 `printf` 命令来指定输出的格式: 26 | 27 | ``` 28 | printf "Hello, I'm %s.\n" $USER >> file.txt 29 | ``` 30 | ![jogmpf](https://gitee.com/chasays/mdPic/raw/master/uPic/jogmpf.png) 31 | 32 | 另一种将文本附加到文件的方法是使用 Here 文档(Heredoc)。 它是一种重定向类型,允许您将多行输入传递给命令。 33 | 34 | 35 | 例如,您可以将内容传递给 `cat` 命令,并将其附加到文件中: 36 | 37 | cat « EOF » file.txt The current working directory is: $PWD You are logged in as: $(whoami) EOF 38 | ``` 39 | cat filename > file.txt 40 | ``` 41 | 42 | 43 | 你可以将任何命令的输出附加到文件中: 44 | ``` 45 | date +"Year: %Y, Month: %m, Day: %d" >> file.txt 46 | 47 | ``` 48 | 49 | ![MDiTEX](https://gitee.com/chasays/mdPic/raw/master/uPic/MDiTEX.png) 50 | 当使用重定向附加到文件时,请注意不要使用操作符覆盖重要的现有文件。 51 | ## 方法附加到文件中tee Command 命令 52 | 53 | `tee` 是 Linux 中的命令行实用程序,它从标准输入读取数据,并同时写入标准输出和一个或多个文件。 54 | 55 | 56 | 默认情况下,tee 命令覆盖指定的文件。 要将输出附加到文件中,可以使用 tee 和 -a (--append)选项: 57 | ``` 58 | echo "this is a new line" | tee -a file.txt 59 | ``` 60 | ![J3UYRm](https://gitee.com/chasays/mdPic/raw/master/uPic/J3UYRm.png) 61 | 62 | 63 | 如果您不希望 `tee` 写入标准输出,可以将其重定向到 /dev/null: 64 | ``` 65 | echo "this is a new line" | tee -a file.txt >/dev/null 66 | ``` 67 | 68 | 使用 tee 命令优于操作符的优点是,tee 允许您将文本一次追加到多个文件,并将其他用户拥有的文件与 sudo 一起写入。 69 | 70 | 71 | 要将文本附加到没有写权限的文件,请在 tee 之前预置 sudo,如下所示: 72 | ``` 73 | echo "this is a new line" | sudo tee -a file.txt 74 | ``` 75 | ![VzQBPs](https://gitee.com/chasays/mdPic/raw/master/uPic/VzQBPs.png) 76 | 77 | tee 接收 echo 命令的输出,提高 sudo 权限,并写入文件。 78 | 79 | 80 | 要将文本附加到多个文件,请将这些文件指定为 tee 命令的参数: 81 | ``` 82 | echo "this is a new line" | tee -a file1.txt file2.txt file3.txt 83 | ``` 84 | ![EFeqzz](https://gitee.com/chasays/mdPic/raw/master/uPic/EFeqzz.png) 85 | ## 小结 86 | 87 | 在 Linux 中,要将文本附加到文件中,可以使用重定向操作符「>」或 tee 命令。 88 | 89 | -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令06 - ps.md: -------------------------------------------------------------------------------- 1 | 在 Linux 中,程序的运行实例称为进程。 有时候,在 Linux 机器上工作时,您可能需要了解当前正在运行的进程。 2 | 3 | 4 | 您可以使用许多命令来查找正在运行的进程的信息,其中 ps、 pstree 和 top 是最常用的命令。 5 | 6 | 7 | 本文说明如何使用 ps 命令列出当前正在运行的进程并显示有关这些进程的信息。 8 | 9 | ## 如何使用 ps 命令 10 | 11 | `ps` 命令的一般语法如下: 12 | ``` 13 | ps [OPTIONS] 14 | ``` 15 | 出于历史和兼容性原因,`ps` 命令接受几种不同类型的选项: 16 | 17 | - 样式选项,前面加一个破折号 18 | - 风格的选项,使用无破折号 19 | - 长选项,前面加两个破折号 20 | 21 | 22 | 不同的选项类型可以混合使用,但在某些特定情况下,可能会出现冲突,因此最好坚持使用一种选项类型。 23 | 24 | 可以对 BSD 和 UNIX 选项进行分组。 25 | 26 | 27 | 在最简单的形式中,当不使用任何选项时,ps 将为当前 shell 中运行的至少两个进程、 shell 本身以及调用命令时在 shell 中运行的进程打印四列信息。 28 | 29 | ## ps 30 | 31 | 输出包括有关 shell (bash)和在此 shell 中运行的进程的信息(ps,您键入的命令) : 32 | ``` 33 | PID TTY TIME CMD 34 | 1809 pts/0 00:00:00 bash 35 | 2043 pts/0 00:00:00 ps 36 | 37 | 这四列分别标记为 PID、 TTY、 TIME 和 CMD。 38 | ``` 39 | PID - 进程 ID。通常,当运行ps 命令时,用户寻找的最重要的信息是进程阻止一个故障进程. 40 | TTY - 进程控制终端的名称 41 | TIME - 进程的累计 CPU 时间,以分钟和秒表示 42 | CMD - 用于启动进程的命令的名称 43 | 44 | 上面的输出不是很有用,因为它不包含很多信息。 ps 命令的真正威力来自于附加选项的启动。 45 | 46 | `ps` 命令接受大量的选项,这些选项可用于显示特定的一组进程和关于进程的不同信息,但是在日常使用中只需要少量的选项。 47 | 48 | 49 | `ps` 最常用于以下组合选项: 50 | 51 | 52 | ## BSD 表格: 53 | ``` 54 | ps aux 55 | ``` 56 | a - 这个 `a` 参数显示所有用户的进程。 只有与终端和组长的进程没有关联的进程没有显示 57 | u - 代表一种面向用户的格式,它提供有关流程的详细信息 58 | x - 列出没有控制终端的进程。这些进程主要是在启动时启动的running in the background 在后台运行. 59 | 60 | 该命令在十一列中显示信息,分别标记为 USER、 PID、% CPU、% MEM、 VSZ、 RSS、 STAT、 START、 TTY、 TIME 和 CMD。 61 | ``` 62 | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 63 | root 1 0.0 0.8 77616 8604 ? Ss 19:47 0:01 /sbin/init 64 | root 2 0.0 0.0 0 0 ? S 19:47 0:00 [kthreadd] 65 | ... 66 | ``` 67 | 68 | 我们已经解释了 PID、 TTY、 TIME 和 CMD 标签,下面是其他标签的说明: 69 | 70 | - USER - 运行进程的用户 71 | - %CPU - CPU 进程的利用 72 | - %MEM - 进程的驻留设置大小占计算机上物理内存的百分比 73 | - VSZ - KiB 中进程的虚拟内存大小 74 | - RSS - 这个过程正在使用物理内存大小 75 | - STAT - 进程状态代码,例如Z (zombie), (僵尸),S (sleeping), and (休眠) ,以及R (running). (运行) 76 | - START - 命令开始的时间 77 | 78 | 选项告诉 ps 显示父进程到子进程的树视图: 79 | ``` 80 | ps auxf 81 | ``` 82 | The ps command also allows you to sort the output. For example, to sort the output based on the memory usage, you would use: 83 | 84 | `ps` 命令还允许对输出进行排序。 例如,要根据内存使用情况对输出进行排序,可以使用: 85 | ``` 86 | ps aux --sort=-%mem 87 | ``` 88 | 89 | ## Unix 格式: 90 | ``` 91 | ps -ef 92 | ``` 93 | 94 | - -e 显示所有进程 95 | - -f 列出了完整格式的列表,它提供了有关进程的详细信息 96 | 97 | 该命令以八列显示信息,分别标记为 UID、 PID、 PPID、 c、 STIME、 TIME 和 CMD。 98 | ``` 99 | UID PID PPID C STIME TTY TIME CMD 100 | root 1 0 0 19:47 ? 00:00:01 /sbin/init 101 | root 2 0 0 19:47 ? 00:00:00 [kthreadd] 102 | ... 103 | ``` 104 | 105 | 上面没有提到的标签有以下含义: 106 | 107 | - UID 运行进程的用户 108 | - PPID 父进程的 ID 109 | - C 进程 CPU 利用率 110 | - STIME 当命令开始的时候 111 | 112 | 若要只查看作为特定用户运行的进程,请键入以下命令,其中 linuxize 是用户名: 113 | ``` 114 | ps -f -U linuxize -u linuxize 115 | ``` 116 | 117 | ## 自定义格式 118 | 119 | O 选项允许您指定在运行 ps 命令时显示哪些列。 120 | 121 | 122 | 例如,为了只打印关于 PID 和 COMMAND 的信息,你可以运行以下命令之一: 123 | ``` 124 | ps -efo pid,comm 125 | ps auxo pid,comm 126 | ``` 127 | 128 | ![2OZIr6](https://gitee.com/chasays/mdPic/raw/master/uPic/2OZIr6.png) 129 | 130 | ## 使用其他命令 131 | 132 | `ps` 可以通过管道与其他命令组合使用。 133 | 134 | 如果你想显示 ps 命令的输出,一次一页,通过管道将它传送到 less 命令: 135 | ``` 136 | ps -ef | less 137 | ``` 138 | ![4Z1rEY](https://gitee.com/chasays/mdPic/raw/master/uPic/4Z1rEY.png) 139 | 140 | `ps` 命令的输出可以用 grep 进行过滤。 例如,为了只显示属于 root 用户的进程,你可以运行: 141 | ``` 142 | ps -ef | grep root 143 | ``` 144 | ![3p1Yi8](https://gitee.com/chasays/mdPic/raw/master/uPic/3p1Yi8.png) 145 | 146 | ## 小结 147 | `ps` 命令是解决 Linux 系统问题时最常用的命令之一。 它有许多选项,但通常大多数用户使用 ps aux 或 ps-ef 来收集有关正在运行的进程的信息。 148 | 149 | 有关 `ps` 的详细信息,请在终端中键入 `man ps`。 150 | ![kXnTbz](https://gitee.com/chasays/mdPic/raw/master/uPic/kXnTbz.png) -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令07 - rm.md: -------------------------------------------------------------------------------- 1 | `rm` 是一个命令行工具,用于删除文件和目录。 这是每个 Linux 用户都应该熟悉的基本命令之一。 2 | 3 | 4 | 在本指南中,我们将通过最常见的 rm 选项的示例和说明来解释如何使用 rm 命令。 5 | 6 | ## 如何使用 `rm ` 命令 7 | 8 | `rm` (remove)命令的一般语法如下: 9 | ``` 10 | rm [OPTIONS]... FILE... 11 | ``` 12 | ![H9a2mr](https://gitee.com/chasays/mdPic/raw/master/uPic/H9a2mr.png) 13 | 14 | 默认情况下,当在没有任何选项的情况下执行时,rm 不删除目录,也不提示用户是否继续删除给定的文件。 15 | 16 | 若要删除单个文件,请使用 rm 命令后跟文件名作为参数: 17 | ``` 18 | rm filename 19 | ``` 20 | 21 | 如果您在父目录上没有写权限,将会出现“ Operation not permitted”错误。 22 | 23 | 如果文件没有写保护,它将在没有通知的情况下删除。 在成功时,该命令不产生任何输出,并返回零。 24 | 25 | 26 | 当删除写保护文件时,命令会提示您进行确认,如下所示: 27 | ``` 28 | rm: remove write-protected regular empty file 'filename'? 29 | ``` 30 | 31 | 键入` y `并按回车键可以删除该文件。 32 | 33 | 34 | `-f `选项告诉 rm 永远不要提示用户并忽略不存在的文件和参数。 35 | ``` 36 | rm -f filename 37 | 38 | ``` 39 | 40 | 如果您想获得有关正在删除的内容的信息,请使用-v (verbose)选项: 41 | ``` 42 | rm -v filename 43 | 'filename' 44 | ``` 45 | ![Hg72Uy](https://gitee.com/chasays/mdPic/raw/master/uPic/Hg72Uy.png) 46 | ## 删除多个文件 47 | 与 unlink 命令不同,rm 允许您一次删除多个文件。 为此,将文件名作为空格分隔的参数传递: 48 | ``` 49 | rm filename1 filename2 filename3 50 | ``` 51 | 52 | 您可以使用正则表达式来匹配多个文件。 例如,删除所有。 在 png 文件的工作目录中,你可以输入: 53 | ``` 54 | rm *.png 55 | ``` 56 | 57 | 使用正则表达式时,在运行 rm 命令之前。 使用 ls 命令列出文件始终是一个好主意,这样可以看到哪些文件将被删除。 58 | 59 | ## 删除目录(文件夹) 60 | 61 | 要删除一个或多个空目录,请使用 -d 选项: 62 | ``` 63 | rm -d dirname 64 | ``` 65 | 66 | `rm` -d 在功能上与 `rmdir` 命令相同。 67 | 68 | 69 | 要递归地删除非空目录及其中的所有文件,请使用 -r (递归)选项: 70 | ``` 71 | rm -r dirname 72 | ``` 73 | ## 移除前提示 74 | 75 | `-i` 选项告诉 rm 在删除每个文件之前提示用户: 76 | ``` 77 | rm -i filename1 filename2 78 | ``` 79 | 80 | 要确认类型 y 并按回车键: 81 | ``` 82 | rm: remove regular empty file 'filename1'? 83 | rm: remove regular empty file 'filename2'? 84 | ``` 85 | 86 | 87 | 当移除三个以上的文件或递归移除一个目录时,为了得到整个操作的单个提示,使用-i 选项: 88 | ``` 89 | rm -i filename1 filename2 filename3 filename4 90 | ``` 91 | ![dSjnFp](https://gitee.com/chasays/mdPic/raw/master/uPic/dSjnFp.png) 92 | 您将被要求确认删除所有给定的文件和目录: 93 | ``` 94 | rm -rf 95 | ``` 96 | 如果给定的目录或目录中的文件是写保护的,rm 命令将提示您确认操作。 若要在没有提示的情况下删除目录,请使用-f 选项: 97 | ``` 98 | rm -rf dirname 99 | ``` 100 | 101 | `rm -rf` 命令非常危险,应该非常谨慎地使用! 102 | 103 | ## 小结 104 | 105 | 我们已经向您展示了如何使用 linuxrm 命令从 Linux 系统中删除文件和目录。 106 | 107 | `删除重要文件或目录时要格外小心,因为一旦文件被删除,就无法轻易恢复`。 108 | 109 | -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令08 - curl.md: -------------------------------------------------------------------------------- 1 | `curl` 是一个命令行实用程序,用于将数据从服务器或传输到服务器,该服务器设计用于在没有用户交互的情况下工作。 使用 `curl`,您可以使用支持的协议(包括 HTTP、 HTTPS、 SCP、 SFTP 和 FTP)下载或上传数据。 `curl` 提供了许多选项,允许您恢复传输、限制带宽、代理支持、用户认证等等。 2 | 3 | 4 | 下面就介绍常见的用法, 将通过实际例子和最常见的 `curl` 选项的详细说明,向您展示如何使用 curl 工具。 5 | 6 | ## 安装 curl 7 | 8 | 现在大多数 Linux 发行版都预先安装了 curl 包。 9 | 10 | 11 | 12 | 要检查 `curl` 包是否已安装在系统上,请打开控制台,键入 curl,然后按回车键。 如果您安装了 curl,系统将打印 curl: 尝试‘curl --help’或‘ curl --manual’获取更多信息。 否则,您将看到类似 curl 命令的内容没有被找到。 13 | ![dsjqSu](https://gitee.com/chasays/mdPic/raw/master/uPic/dsjqSu.png) 14 | 15 | 如果没有安装 curl,您可以使用发行版的包管理器轻松地安装它。 16 | 17 | ### 在 Ubuntu 和 Debian 上安装 curl 18 | ``` 19 | sudo apt update 20 | sudo apt install curl 21 | ``` 22 | ### 在 CentOS 和 Fedora 上安装 curl 23 | ``` 24 | sudo yum install curl 25 | ``` 26 | ## 如何使用 curl 27 | 28 | curl 命令的语法如下: 29 | ``` 30 | curl [options] [URL...] 31 | ``` 32 | 在其最简单的形式中,当不使用任何选项调用时,curl 将指定的资源显示到标准输出。 33 | 34 | 35 | 例如,要检索示例网站的主页,你可以运行: 36 | ``` 37 | curl chasays.github.io 38 | ``` 39 | ![eqklbA](https://gitee.com/chasays/mdPic/raw/master/uPic/eqklbA.png) 40 | 41 | 该命令将在您的终端窗口中打印示例.com 主页的源代码。 42 | 43 | 44 | 如果没有指定协议,curl 会尝试猜测您想要使用的协议,它将默认为 HTTP。 45 | ## 将输出保存到文件中 46 | 47 | 若要保存 curl 命令的结果,请使用-o 或-O 选项。 48 | 49 | Lowercase -o 使用一个预定义的文件名保存文件,在下面的示例中是 vue-v2.6.10. js: 50 | ``` 51 | curl -o vue-v2.6.10.js https://cdn.jsdelivr.net/npm/vue/dist/vue.js 52 | ``` 53 | 54 | 55 | 大写 -O 保存文件和它的原始文件名: 56 | ``` 57 | curl -O https://cdn.jsdelivr.net/npm/vue/dist/vue.js 58 | ``` 59 | 60 | ![cbHQFb](https://gitee.com/chasays/mdPic/raw/master/uPic/cbHQFb.png) 61 | 62 | ## 下载多个文件 63 | 64 | 要一次下载多个文件,请使用多个 -O 选项,后跟要下载的文件的 URL。 65 | 66 | 67 | 在下面的例子中,我们正在下载 Arch Linux 和 Debian iso 文件: 68 | 69 | ``` 70 | curl -O http://mirrors.edge.kernel.org/archlinux/iso/2018.06.01/archlinux-2018.06.01-x86_64.iso \ 71 | -O https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-9.4.0-amd64-netinst.iso 72 | ``` 73 | 74 | ## 恢复下载 75 | 您可以使用 `-C` 选项恢复下载。 如果您的连接在下载一个大文件期间断开,而且您可以继续前一个文件而不是从头开始下载,那么这将非常有用。 76 | 77 | 78 | 例如,如果你正在下载 Ubuntu 18.04 iso 文件,使用以下命令: 79 | ``` 80 | curl -O https://updates.cdn-apple.com/2020/macos/061-44388-20200128-3badc52c-6391-412c-86d9-fc2aaf9514e0/macOSUpd10.15.3.dmg 81 | ``` 82 | 然后你的连接突然断开,你可以用以下命令继续下载: 83 | ``` 84 | curl -C - -O https://updates.cdn-apple.com/2020/macos/061-44388-20200128-3badc52c-6391-412c-86d9-fc2aaf9514e0/macOSUpd10.15.3.dmg 85 | ``` 86 | ![AFXvTE](https://gitee.com/chasays/mdPic/raw/master/uPic/AFXvTE.png) 87 | 88 | ## 获取 URL 的 HTTP 头 89 | 90 | Http 头是冒号分隔的键值对,包含用户代理、内容类型和编码等信息。 头文件通过请求或响应在客户端和服务器之间传递。 91 | 92 | 93 | 使用 -I 选项仅获取指定资源的 HTTP 标头: 94 | ``` 95 | curl -I --http2 https://www.apple.com/ 96 | ``` 97 | 98 | ![b8dqcw](https://gitee.com/chasays/mdPic/raw/master/uPic/b8dqcw.png) 99 | ## 测试网站是否支援 http/2 100 | 101 | 要检查某个特定的 URL 是否支持新的 HTTP/2协议,请使用-i 和 --http2选项获取 HTTP header: 102 | ``` 103 | curl -I --http2 -s https://apple.com/ | grep HTTP 104 | ``` 105 | ![9JSwNl](https://gitee.com/chasays/mdPic/raw/master/uPic/9JSwNl.png) 106 | S 选项告诉 curl 以静音(quiet)运行,并隐藏进度表和错误消息。 107 | 108 | 109 | 如果远程服务器支持 http/2,curl 打印 http/2.0200: 110 | ``` 111 | HTTP/2 200 112 | ``` 113 | 否则,回复就是 http/1.1200: 114 | ``` 115 | HTTP/1.1 200 OK 116 | ``` 117 | 如果您使用的是 curl 版本7.47.0或更高版本,则不需要使用 -- http2选项,因为所有 HTTPS 连接都默认启用了 http/2。 118 | 119 | ## 遵循重定向 120 | 默认情况下,curl 不遵循 HTTP Location 头。 121 | 122 | 123 | 如果你尝试检索非 www 版本的 google. com,你会注意到,你不但没有获得页面的来源,反而会被重定向到 www 版本: 124 | ``` 125 | curl baidu.com 126 | ``` 127 | 128 | 选项指示 curl 跟踪任何重定向,直到它到达最终目的地: 129 | `` 130 | curl -L baidu.com 131 | `` 132 | ![nITkGy](https://gitee.com/chasays/mdPic/raw/master/uPic/nITkGy.png) 133 | 134 | ## 更改用户代理 135 | 136 | 有时在下载文件时,远程服务器可能被设置为阻止 curl User-Agent,或者根据访问者设备和浏览器返回不同的内容。 137 | 138 | 139 | 在这种情况下模拟不同的浏览器,使用 -a 选项。 140 | 141 | 例如,要模拟 Firefox 60,你可以使用: 142 | ``` 143 | curl -A "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0" https://baidu.org/ 144 | ``` 145 | 146 | ## 指定最大传输速率 147 | 148 | --limit-rate 选项允许您限制数据传输速率。 该值可以用字节表示,k 后缀为千字节,m 后缀为兆字节,g 后缀为千字节。 149 | 150 | 151 | 在下面的例子中 curl 将下载 Go 二进制文件,并将下载速度限制在1 mb: 152 | ``` 153 | curl --limit-rate 1m -O https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz 154 | ``` 155 | 此选项有助于防止 curl 占用所有可用带宽。 156 | ## 通过 FTP 传输文件 157 | 158 | 要使用 curl 访问受保护的 FTP 服务器,请使用-u 选项并指定用户名和密码,如下所示: 159 | ``` 160 | curl -u FTP_USERNAME:FTP_PASSWORD ftp://ftp.baidu.com/ 161 | ``` 162 | 登录后,该命令列出用户主目录中的所有文件和目录。 163 | 164 | 165 | 你可以使用以下语法从 FTP 服务器下载一个文件: 166 | ``` 167 | curl -u FTP_USERNAME:FTP_PASSWORD ftp://ftp.example.com/file.tar.gz 168 | ``` 169 | 要将文件上传到 FTP 服务器,请使用-t 后跟要上传的文件的名称: 170 | ```` 171 | curl -T newfile.tar.gz -u FTP_USERNAME:FTP_PASSWORD ftp://ftp.example.com/ 172 | ```` 173 | ## 使用cookies 174 | 175 | 有时您可能需要使用特定的 cookie 发出 HTTP 请求以访问远程资源或调试问题。 176 | 177 | 178 | 默认情况下,当使用 curl 请求资源时,不会发送或存储 cookie。 179 | 180 | 181 | 若要将 cookie 发送到服务器,请使用-b 开关,后跟包含 cookie 或字符串的文件名。 182 | 183 | 184 | 例如,下载 oraclejavajdkrpm 文件 JDK-10.0.2 linux-x64 bin。 Rpm 你需要传递一个值为 a 的名为 oraclericense 的 cookie: 185 | ``` 186 | curl -L -b "oraclelicense=a" -O http://download.oracle.com/otn-pub/java/jdk/10.0.2+13/19aef61b38124481863b1413dce1855f/jdk-10.0.2_linux-x64_bin.rpm 187 | ``` 188 | 189 | ## 使用代理 190 | 191 | 支持不同类型的代理,包括 HTTP、 HTTPS 和 SOCKS。 若要通过代理服务器传输数据,请使用-x (-- proxy)选项,后跟代理 URL。 192 | 193 | 194 | 下面的命令使用代理在192.168.44.1 port 8888上下载指定的资源: 195 | ``` 196 | curl -x 192.168.44.1:8888 http://google.com/ 197 | ``` 198 | 199 | 200 | 如果代理服务器需要身份验证,请使用-u (-- proxy-user)选项,后跟用户名和密码,用冒号分隔(user: password) : 201 | ``` 202 | curl -U username:password -x 192.168.44.1:8888 http://google.com/ 203 | ``` 204 | ## 小结 205 | 206 | `curl `是一个命令行工具,它允许您从远程主机或向远程主机传输数据。 它对于故障排除、下载文件等非常有用。 207 | 我只是做了一些简单的实例,但是演示了最常用的 `curl` 选项,这些示例旨在帮助您理解 curl 命令的工作原理。 -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令09 - sed.md: -------------------------------------------------------------------------------- 1 | 在处理文本文件时,通常需要在一个或多个文件中查找和替换文本字符串。 2 | 3 | 4 | `sed` 是一个流编辑器。 它可以对文件和输入流(如管道)执行基本的文本操作。 使用 `sed,您可以搜索、查找和替换、插入和删除单词和行。` 它支持基本的和扩展的正则表达式,允许您匹配复杂的模式。 5 | 6 | 7 | 接下来, 我将使用 sed 查找和替换字符串。 我还将向您展示如何执行递归搜索和替换。 8 | 9 | ## 查找和替换字符串sed 10 | 11 | sed 有几个版本,它们之间有一些函数上的差异。 Macos 使用的是 BSD 版本,而且大多数 Linux 发行版默认都预装了 GNU。 下面默认的是 GNU 版本。 12 | 13 | 使用 sed 搜索和替换文本的一般形式如下: 14 | ``` 15 | sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE 16 | ``` 17 | 18 | - -i 将其输出写入标准输出sed 19 | - s 替代命令,可能是 sed 中使用最多的命令 20 | -/分隔符字符。它可以是任何字符,但通常是斜杠(/) 字符 21 | - SEARCH_REGEX 要搜索的普通字符串或正则表达式 22 | - REPLACEMENT 替换字符串 23 | - g 全局替换标志。默认情况下一行一行地读取文件,只更改第一次出现的SEARCH_REGEX,当提供替换标志时,所有出现的情况都将被替换 24 | - INPUTFILE 要在其上运行命令的文件名 25 | 最好在参数周围加上引号,这样 shell 元字符就不会扩展。 26 | 27 | 28 | 让我看一些示例,说明如何使用 sed 命令搜索文件中的文本,并使用其中一些最常用的选项和标志替换文件中的文本。 29 | 30 | 31 | 为了便于演示,我将使用以下文件 file.txt: 32 | ``` 33 | 34 | 123 Foo foo foo 35 | foo /bin/bash Ubuntu foobar 456 36 | ``` 37 | 38 | 39 | 如果省略了` g` 标志,那么每行中搜索字符串的第一个实例将被替换: 40 | ``` 41 | sed -i '' 's/foo/linux/' file.txt 42 | 43 | 123 Foo linux foo 44 | 45 | linux /bin/bash Ubuntu foobar 456 46 | ``` 47 | ![I1CZtI](https://gitee.com/chasays/mdPic/raw/master/uPic/I1CZtI.png) 48 | 使用全局替换标志 sed 替换所有出现的搜索模式: 49 | ``` 50 | sed -i '' 's/foo/linux/g' file.txt 51 | 123 Foo linux linux 52 | linux /bin/bash Ubuntu linuxbar 456 53 | ``` 54 | ![XSP3mF](https://gitee.com/chasays/mdPic/raw/master/uPic/XSP3mF.png) 55 | 56 | 57 | 正如您可能已经注意到的,在前面的示例中,foobar 字符串中的子字符串 foo 也被替换了。 如果这不是想要的行为,请在搜索字符串的两端使用单词边界表达式(\b)。 这将确保部分词不匹配。 58 | ``` 59 | sed -i 's/\bfoo\b/linux/g' file.txt 60 | 123 Foo linux linux 61 | linux /bin/bash Ubuntu foobar 456 62 | ``` 63 | 64 | ![lCjovE](https://gitee.com/chasays/mdPic/raw/master/uPic/lCjovE.png) 65 | 66 | 若要使模式匹配不区分大小写,请使用 I 标志。 在下面的例子中,我同时使用了 g 和 I 标志: 67 | ``` 68 | sed -i 's/foo/linux/gI' file.txt 69 | 123 linux linux linux 70 | linux /bin/bash Ubuntu linuxbar 456 71 | ``` 72 | 73 | 74 | 75 | 如果要查找和替换包含分隔符(/)的字符串,则需要使用反斜杠(\\)来转义斜杠。 例如,用/usr/bin/zsh 替换/bin/bash 76 | ``` 77 | sed -i '' 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt 78 | ``` 79 | 80 | 81 | 更简单和更易读的选项是使用另一个分隔符字符。 大多数人使用竖线(|)或冒号(:) ,但你可以使用任何其他字符: 82 | ``` 83 | sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt 84 | 123 Foo foo foo 85 | foo /usr/bin/zsh Ubuntu foobar 456 86 | ``` 87 | 88 | 89 | 您还可以使用正则表达式。 例如,搜索所有的3位数字,并将它们替换为您将使用的字符串数字: 90 | ``` 91 | sed -i 's/\b[0-9]\{3\}\b/number/g' file.txt 92 | number Foo foo foo 93 | foo /bin/bash demo foobar number 94 | ``` 95 | sed 的另一个有用特性是,您可以使用与匹配模式相对应的 & 符号。 该字符可以被多次使用。 96 | 97 | 98 | 例如,如果要在每个3位数字周围加上大括号{} ,请键入: 99 | ``` 100 | sed -i 's/\b[0-9]\{3\}\b/{&}/g' file.txt 101 | {123} Foo foo foo 102 | foo /bin/bash demo foobar {456} 103 | ``` 104 | 105 | 106 | 最后但并非最不重要的一点是,在使用 sed 编辑文件时进行备份总是一个好主意。 要做到这一点,只需要为 -i 选项提供一个扩展。 例如,要编辑 file.txt 并将原始文件保存为 file.txt.bak,可以使用: 107 | ``` 108 | sed -i.bak 's/foo/linux/g' file.txt 109 | ``` 110 | 111 | 112 | 如果你想确保备份已经创建,用 ls 命令列出文件: 113 | ``` 114 | ls 115 | file.txt file.txt.bak 116 | ``` 117 | 118 | ## 递归查找和替换 119 | 120 | 有时,您希望递归地搜索目录中包含字符串的文件,并替换所有文件中的字符串。 这可以通过使用 find 或 grep 等命令递归地查找目录中的文件并将文件名管道化为 sed 来实现。 121 | 122 | 下面的命令将递归搜索当前工作目录文件夹中的文件,并将文件名传递给 sed。 123 | ``` 124 | find . -type f -exec sed -i 's/foo/bar/g' {} + 125 | ``` 126 | 127 | 为了避免文件名中包含空格的问题,可以使用-print0选项,它告诉 find 打印文件名,然后使用空字符,并使用 xargs-0将输出管道传送到 sed: 128 | ``` 129 | find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g' 130 | ``` 131 | 132 | 133 | 要排除目录,请使用非路径选项。 例如,如果您正在替换本地 git repo 中的字符串,以排除所有以点(.)开头的文件 、使用: 134 | ``` 135 | find . -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g' 136 | ``` 137 | 138 | 如果你只想搜索和替换具有特定扩展名的文件中的文本,你可以使用: 139 | ``` 140 | find . -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g' 141 | ``` 142 | 143 | 144 | 另一种选择是使用 grep 命令递归地查找包含搜索模式的所有文件,然后将文件名通过管道传递给 sed: 145 | ``` 146 | grep -rlZ 'foo' . | xargs -0 sed -i.bak 's/foo/bar/g' 147 | ``` 148 | ## 小结 149 | 虽然它看起来复杂和复杂,但实际上,用 sed 在文件中搜索和替换文本非常简单。 -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令10 - unzip.md: -------------------------------------------------------------------------------- 1 | `zip` 是最广泛使用的归档文件, 除了linux,windows也是非常的广泛。,支持无损数据压缩。 zip 文件是包含一个或多个压缩文件或目录的数据容器。 2 | 3 | 4 | 接下来,我将解释如何使用 `unzip` 命令通过命令行解压缩 Linux 系统中的文件。 5 | 还有与之对应就是 zip。 6 | ![0FPVdt](https://gitee.com/chasays/mdPic/raw/master/uPic/0FPVdt.png) 7 | 8 | ## 安装unzip 9 | 在大多数 Linux 发行版中,unzip 不是默认安装的,但是您可以使用您的发行版的包管理器轻松地安装它。 10 | 11 | - 在 Ubuntu 和 Debian 上 12 | ``` 13 | sudo apt install unzip 14 | ``` 15 | - Fedora 和 Fedora 16 | ``` 17 | sudo yum install unzip 18 | ``` 19 | ## 如何解压 `ZIP` 文件 20 | 21 | 最简单的形式是,当不带任何选项使用时,unzip 命令将指定 `ZIP` 归档文件中的所有文件解压缩到工作目录文件夹中。 22 | 23 | 24 | 举个例子,假设你下载了 Wordpress 安装 `ZIP` 文件。 要将这个文件解压到工作目录文件夹,你只需运行以下命令: 25 | ``` 26 | unzip latest.zip 27 | ``` 28 | 29 | zip 文件不支持 linux 样式的所有权信息。提取的文件属于运行命令的用户。 30 | 31 | 32 | 您必须对解压压缩 `ZIP` 归档文件的目录具有写权限。 33 | 34 | ## 静默运行 35 | 36 | 默认情况下,解压缩将打印所提取的所有文件的名称,并在提取完成时打印一个摘要。 37 | 38 | 39 | 使用 -q 开关禁止打印这些消息。 40 | ``` 41 | unzip -q filename.zip 42 | ``` 43 | 44 | ## 将 `ZIP` 文件解压缩到另一个目录 45 | 46 | 要将 `ZIP` 文件解压缩到与当前目录不同的目录,请使用 -d 开关: 47 | ``` 48 | unzip filename.zip -d /path/to/directory 49 | ``` 50 | 51 | 52 | 例如,要将 WordPress 归档 latest.zip 解压缩到/var/www/目录,可以使用以下命令: 53 | ``` 54 | sudo unzip latest.zip -d /var/www 55 | ``` 56 | 在上面的命令中,我使用 sudo 是因为我登录的用户通常没有对/var/www 目录的写权限。 当使用 sudo 对 `ZIP` 文件进行解压缩时,提取的文件和目录归用户根所有。 57 | 58 | ## 解压密码保护的 `ZIP` 文件 59 | 60 | 61 | 要解压缩受密码保护的文件,请调用 unzip 命令,并在 -P 选项后面加上密码: 62 | ``` 63 | unzip -P PasswOrd filename.zip 64 | ``` 65 | 66 | 67 | 在命令行中键入密码是不安全的,应该避免。 一个更安全的选择是正常地提取文件而不提供密码。 如果 `ZIP` 文件是加密的,解压缩会提示你输入密码: 68 | ``` 69 | unzip filename.zip 70 | archive: filename.zip 71 | [filename.zip] file.txt password: 72 | ``` 73 | 74 | 只要是正确的,unzip 将对所有加密文件使用相同的密码。 75 | 76 | ## 解压缩 `ZIP` 文件时排除文件 77 | 要排除特定的文件或目录进行解压缩,请使用-x 选项,然后使用空格分隔的存档文件列表排除解压缩: 78 | ``` 79 | unzip filename.zip -x file1-to-exclude file2-to-exclude 80 | ``` 81 | 82 | 83 | 在下面的示例中,我将从 `ZIP` 归档文件中提取除. git 目录以外的所有文件和目录: 84 | ``` 85 | unzip filename.zip -x "*.git/*" 86 | ``` 87 | 88 | ## 覆盖现有文件 89 | 90 | 假设您已经解压缩了一个 `ZIP` 文件,并且再次运行相同的命令: 91 | ``` 92 | unzip latest.zip 93 | ``` 94 | 95 | 96 | 默认情况下,解压缩将询问您是否只覆盖当前文件、覆盖所有文件、跳过当前文件的提取、跳过所有文件的提取,或者重命名当前文件。 97 | ``` 98 | Archive: latest.zip 99 | replace wordpress/xmlrpc.php? [y]es, [n]o, [A]ll, [N]one, [r]ename: 100 | ``` 101 | 102 | 103 | 如果您想在没有提示的情况下覆盖现有文件,请使用-o 选项: 104 | ``` 105 | unzip -o filename.zip 106 | ``` 107 | 108 | 谨慎使用此选项。如果对文件做了任何更改,更改将丢失。 109 | 110 | ## 解压 `ZIP` 文件而不改写现有文件 111 | 假设您已经解压缩了一个 `ZIP` 文件,并且对一些文件进行了更改,但是不小心删除了一些文件。 您希望保留更改并从 `ZIP` 归档文件中还原已删除的文件。 112 | 113 | 114 | 在这种情况下,使用-n 选项强制 unzip 跳过提取已经存在的文件: 115 | ``` 116 | unzip -n filename.zip 117 | ``` 118 | ## 解压多个 `ZIP` 文件 119 | 120 | 您可以使用正则表达式来匹配多个归档文件。 121 | 122 | 123 | 例如,如果你当前的工作目录文件夹中有多个 `ZIP` 文件,你可以只用一个命令解压所有文件: 124 | ``` 125 | unzip '*.zip' 126 | ``` 127 | 128 | 注意 * 旁边的单引号。 如果你忘记引用参数,shell 会展开通配符,你会得到一个错误。 129 | 130 | ## 列出 zip 文件的内容 131 | 132 | 若要列出 `ZIP` 文件的内容,请使用-l 选项: 133 | ``` 134 | unzip -l filename.zip 135 | ``` 136 | 137 | 138 | 在下面的例子中,我列出了所有的 WordPress 安装文件: 139 | ``` 140 | unzip -l latest.zip 141 | ``` 142 | 143 | 144 | 输出结果如下: 145 | 146 | Archive: latest.zip 147 | Length Date Time Name 148 | --------- ---------- ----- ---- 149 | 0 2019-08-02 22:39 test/ 150 | 3065 2019-08-31 18:31 test/xmlrpc.php 151 | 364 2019-12-19 12:20 test/wp-blog-header.php 152 | 7415 2019-03-18 17:13 test/readme.html 153 | ... 154 | ... 155 | 21323 2019-03-09 01:15 test/wp-admin/themes.php 156 | 8353 2019-09-10 18:20 test/wp-admin/options-reading.php 157 | 4620 2019-10-24 00:12 test/wp-trackback.php 158 | 1889 2019-05-03 00:11 test/wp-comments-post.php 159 | --------- ------- 160 | 27271400 1648 files 161 | 162 | ## 小结 163 | 164 | Unzip 是一个实用工具,可以帮助您列出、测试和解压缩 `ZIP` 文档。 165 | 166 | 要在 Linux 系统上创建 `ZIP` 归档文件,您需要使用 `ZIP` 命令。 167 | 168 | ![ZCoBLj](https://gitee.com/chasays/mdPic/raw/master/uPic/ZCoBLj.png) -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令11 - xargs.md: -------------------------------------------------------------------------------- 1 | xargs 实用程序允许您从标准输入构建和执行命令。 它通常通过管道与其他命令组合使用。 2 | 3 | 4 | 使用 xargs,可以将标准输入作为参数提供给 mkdir 和 rm 等命令行实用程序。 5 | 6 | 7 | ## 如何使用 xargs 命令 8 | 9 | xargs 从标准输入中读取参数(由空格或换行符分隔) ,并使用输入作为命令的参数执行指定的命令。 如果没有提供命令,则默认为/bin/echo。 10 | 11 | xargs 命令的语法如下: 12 | ``` 13 | xargs [OPTIONS] [COMMAND [initial-arguments]] 14 | ``` 15 | 16 | 使用 xargs 的最基本示例是使用管道向 xargs 传递以空格分隔的几个字符串,并运行一个将这些字符串用作参数的命令。 17 | ``` 18 | echo "file1 file2 file3" | xargs touch 19 | ``` 20 | 21 | 22 | 23 | 在上面的示例中,接下来将标准输入管道输送到 xargs,并为每个参数运行 touch 命令,创建三个文件。 这和你跑步的时候是一样的: 24 | ``` 25 | touch file1 file2 file3 26 | ``` 27 | 28 | ### 如何查看命令和提示用户 29 | 30 | 要在执行命令之前在终端上打印该命令,请使用-t (--verbose)选项: 31 | ``` 32 | echo "file1 file2 file3" | xargs -t touch 33 | ``` 34 | ``` 35 | touch file1 file2 file3 36 | ``` 37 | 38 | 39 | 如果您希望得到一个提示,在执行每个命令之前是否运行它,请使用-p (--interactive)选项: 40 | ``` 41 | echo "file1 file2 file3" | xargs -p touch 42 | ``` 43 | 44 | 键入 y 或 Y 以确认并运行命令: 45 | ``` 46 | touch file1 file2 file3 ?...y 47 | ``` 48 | 49 | 此选项在执行破坏性命令时非常有用, 比如 `rm`,还有这个命令千万不要在服务器上运行 50 | 51 | ## 如何限制参数的数量 52 | 默认情况下,传递给命令的参数数量由系统的限制决定。 53 | 54 | 55 | - n (--max-args)选项指定传递给给定命令的参数数目。 xargs 根据需要多次运行指定的命令,直到所有参数都用完为止。 56 | 57 | 58 | 在下面的示例中,从标准输入中读取的参数数目被限制为1。 59 | ``` 60 | echo "file1 file2 file3" | xargs -n 1 -t touch 61 | ``` 62 | 63 | 从下面的详细输出中可以看到,touch 命令针对每个参数分别执行: 64 | ``` 65 | touch file1 66 | touch file2 67 | touch file3 68 | ``` 69 | 70 | ## 如何运行多个命令 71 | 要使用 xargs 运行多个命令,请使用-i 选项。 它通过在-i 选项后定义一个 replace-str 来工作,并且所有 replace-str 的出现都被传递给 xargs 的参数替换。 72 | 73 | 74 | 下面的 xargs 示例将运行两个命令,首先使用 touch 创建文件,然后使用 ls 命令列出文件: 75 | ``` 76 | echo "file1 file2 file3" | xargs -t -I % sh -c '{ touch %; ls -l %; }' 77 | -rw-r--r-- 1 linuxize users 0 May 6 11:54 file1 78 | -rw-r--r-- 1 linuxize users 0 May 6 11:54 file2 79 | -rw-r--r-- 1 linuxize users 0 May 6 11:54 file3 80 | ``` 81 | 82 | `需要注意的是在MacOS上并没有-i这个参数,只有-I,用法差不多。` 83 | Replace-str 的一个常见选择是% 。但是,您可以使用另一个占位符,例如 ARGS: 84 | ``` 85 | echo "file1 file2 file3" | xargs -t -I ARGS sh -c '{ touch ARGS; ls -l ARGS; }' 86 | ``` 87 | 88 | ## 如何指定分隔符 89 | 90 | 使用-d (--delimiter)选项设置自定义分隔符,可以是单个字符,也可以是以开始的转义序列。 91 | 92 | 93 | 接下来正在使用下面的示例作为分隔符: 94 | ``` 95 | echo "file1;file2;file3" | xargs -d \; -t touch 96 | ``` 97 | ``` 98 | touch file1 file2 file3 99 | ``` 100 | ## 如何从文件中读取项目 101 | xargs 命令还可以从文件而不是标准输入中读取项。 为此,请使用-a (--arg-file)选项后跟文件名。 102 | 103 | 104 | 在下面的示例中,xargs 命令将读取 ips.txt 文件并 ping 每个 IP 地址。 105 | ``` 106 | ips.txt 107 | 8.8.8.8 108 | 1.1.1.1 109 | ``` 110 | 111 | 112 | 接下来还使用-l1选项,它指示 xargs 一次读取一行。 如果省略此选项,xargs 将把所有 ip 传递给单个 ping 命令。 113 | ``` 114 | xargs -t -L 1 -a ips.txt ping -c 1 115 | ping -c 1 8.8.8.8 116 | PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 117 | 64 bytes from 8.8.8.8: icmp_seq=1 ttl=50 time=68.1 ms 118 | 119 | ... 120 | ping -c 1 1.1.1.1 121 | PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data. 122 | 64 bytes from 1.1.1.1: icmp_seq=1 ttl=59 time=21.4 ms 123 | 124 | ``` 125 | ## 使用xargs 与find 126 | 127 | xargs 最常与 find 命令结合使用。 您可以使用 find 搜索特定的文件,然后使用 xargs 对这些文件执行操作。 128 | 129 | 130 | 为了避免包含换行符或其他特殊字符的文件名出现问题,始终使用 find-print0选项,这会导致 find 打印完整的文件名后面跟一个空字符。 xargs 可以使用-0,(-null)选项正确地解释这个输出。 131 | 132 | 在下面的示例中,find 将打印/var/www/中所有文件的完整名称。 Cache directory 和 xargs 将把文件路径传递给 rm 命令: 133 | ``` 134 | find /var/www/.cache -type f -print0 | xargs -0 rm -f 135 | ``` 136 | ## 使用 xargs 修剪空白字符 137 | 138 | xargs 还可以用作从给定字符串的两侧删除空格的工具。 只需通过管道将字符串传递给 xargs 命令,它就会执行修整操作: 139 | ``` 140 | echo " Long line " | xargs 141 | Long line 142 | ``` 143 | 这在比较 shell 脚本中的字符串时非常有用。 144 | ``` 145 | #!/bin/bash 146 | VAR1=" chasays " 147 | VAR2="chasays" 148 | 149 | if [[ "$VAR1" == "$VAR2" ]]; then 150 | echo "Strings are equal." 151 | else 152 | echo "Strings are not equal." 153 | fi 154 | ## Using xargs to trim VAR1 155 | if [[ $(echo "$VAR1" | xargs) == "$VAR2" ]]; then 156 | echo "Strings are equal." 157 | else 158 | echo "Strings are not equal." 159 | fi 160 | ``` 161 | 162 | ``` 163 | Strings are not equal. 164 | Strings are equal. 165 | ``` 166 | ## 小结 167 | xargs 是 Linux 上的命令行实用工具,能够搭配其他命令,使用出惊人的效果。 -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令12 - vi.md: -------------------------------------------------------------------------------- 1 | vim 是许多在命令行上 Linux 下首选文本编辑器。 与其他编辑器不同,vim 有几种操作模式,这对于新用户来说有点吓人。 2 | 3 | ![F8J93X](https://gitee.com/chasays/mdPic/raw/master/uPic/F8J93X.png) 4 | 它的前身 vi 预装在 macOS 和几乎所有的 Linux 发行版上。 了解 vim 的基本知识将帮助您在遇到您最喜欢的编辑器不可用的情况时。 5 | 6 | 7 | 用法很多,在这里就简单说下常用的操作,如何在 vim / vi 中保存文件并退出编辑器。 8 | 9 | 10 | ## vim 模式 11 | 启动 vim 编辑器时,处于正常模式。 在这种模式下,您可以使用 vim 命令并在文件中导航。 12 | 13 | 14 | 为了能够输入文本,您需要进入插入模式按下 `i` 键。 这种模式允许您以在常规文本编辑器中相同的方式插入和删除字符。左下角会提示一个 `insert`。 15 | ![kBrTGY](https://gitee.com/chasays/mdPic/raw/master/uPic/kBrTGY.png) 16 | 17 | 要从任何其他模式回到正常模式,只需按 `Esc` 键。 18 | 19 | ## 打开文件 20 | 21 | 使用 vim 打开文件,后面跟着要编辑或创建的文件的名称: 22 | ``` 23 | vim file.text 24 | ``` 25 | 26 | 27 | ## 保存文件 28 | 29 | 在 vim 中保存文件的命令是:`w`。 30 | 31 | 32 | 要在不退出编辑器的情况下保存文件,请按 Esc 键切换回正常模式,输入:w 并按 `Enter` 键。 33 | 34 | 35 | 1. 按键盘最左上角 Esc 36 | 2. :w 37 | 3. 按下 Enter 38 | 39 | 还有一个 update 命令:up,它只在文件中有未保存的更改时才将缓冲区写入文件。 40 | 41 | 42 | 要以不同的名称保存文件,输入:w new filename,然后按 Enter 键。 43 | 44 | ## 保存文件并退出 45 | 在 vim 中保存文件并退出编辑器的命令是:wq。 46 | 47 | 48 | 要保存文件并同时退出编辑器,请按 Esc 切换到正常模式,键入:wq 并按 Enter。 49 | 50 | 1. 按键盘最左上角 Esc 51 | 2. :wq 52 | 3. 按下 Enter 53 | 54 | ![IXQ5nI](https://gitee.com/chasays/mdPic/raw/master/uPic/IXQ5nI.png) 55 | 56 | 另一个保存文件并退出 vim 的命令是:x。 57 | 58 | 这两个命令之间的区别在于:x 只在有未保存的更改时才将缓冲区写入文件,而:wq 总是将缓冲区写入文件并更新文件修改时间。 59 | 60 | ![H0QQTG](https://gitee.com/chasays/mdPic/raw/master/uPic/H0QQTG.png) 61 | 62 | ## 退出不保存文件 63 | 64 | 若要退出编辑器,不保存更改,请按 Esc 切换到正常模式,键入:q! 并按回车键。感叹号是强制的意思。 65 | 66 | 1. 按键盘最左上角 Esc 67 | 2. :q! 68 | 3. 按下 Enter 69 | 70 | ![RFMvov](https://gitee.com/chasays/mdPic/raw/master/uPic/RFMvov.png) 71 | 72 | ## 小结 73 | 74 | 简单的展示了如何在 vim 中保存文件并退出编辑器。 如果您是 vim 的新手,推荐一个在线的体验 vim编辑。 75 | >https://www.openvim.com/ 76 | 77 | ![N4R1hX](https://gitee.com/chasays/mdPic/raw/master/uPic/N4R1hX.png) 78 | -------------------------------------------------------------------------------- /06_Attachments/01_Linux/Linux常用命令13 - echo.md: -------------------------------------------------------------------------------- 1 | `echo` 命令是 Linux 中`最基本和最常用`的命令之一。 传递给 echo 的参数被打印到标准输出中。 2 | 3 | 4 | `echo` 通常用于 shell 脚本中,用于显示消息或输出其他命令的结果。 5 | 6 | ## echo 命令 7 | `echo` 是 Bash 和其他大多数流行的 shell,如 Zsh 和 Ksh 中的一个 shell 内置程序。 它的行为在不同的 shell 中略有不同。 8 | 9 | 10 | 还有一个独立的/usr/bin/echo 实用程序,但通常会优先使用 shell 内置版本。 我们将介绍 Bash 内置版本的 echo。 11 | 12 | ![wNoubz](https://gitee.com/chasays/mdPic/raw/master/uPic/wNoubz.png) 13 | 14 | `echo` 命令的语法如下: 15 | ``` 16 | echo [-neE] [ARGUMENTS] 17 | ``` 18 | 19 | - 当-n 选项,则取消尾随换行符 20 | - 如果-e 选项,则将解释以下反斜杠转义字符: 21 | - \\ 显示反斜杠字符 22 | - \a 警报(BEL) 23 | - \b 显示退格字符 24 | - \c 禁止任何进一步的输出 25 | - \e 显示转义字符 26 | - \f 显示窗体提要字符 27 | - \n 显示新行 28 | - \r 显示回车 29 | - \t 显示水平标签 30 | - \v 显示垂直标签 31 | - 这个-E 项禁用转义字符的解释。这是默认值 32 | 33 | 在使用 echo 命令时`,不过有几点需要考虑`。 34 | 35 | 方法传递参数之前,shell 将替换所有变量、通配符匹配和特殊字符echo. 命令 36 | 虽然没有必要,但是将传递给的参数包含起来是一个很好的编程实践双引号或单引号 37 | 当使用单引号时`''` 将保留引号内每个字符的字面值。不展开变量和命令 38 | ## 举个栗子 39 | 40 | 下面的例子展示了如何使用 echo 命令: 41 | 42 | 43 | 在标准输出上显示一行文本。 44 | ``` 45 | echo Hello, World! 46 | Hello, World! 47 | ``` 48 | 49 | 显示一行包含双引号的文本。 50 | 51 | 52 | 若要打印双引号,请将其包含在单引号内,或用反斜杠字符进行转义。 53 | ``` 54 | echo 'Hello "Linuxize"' 55 | echo "Hello \"Linuxize\"" 56 | Hello "Linuxize" 57 | ``` 58 | 59 | 60 | 显示一行包含单引号的文本。 61 | 62 | 63 | 要打印单引号,请将其包含在双引号内或使用 ANSI-C 引号。 64 | ``` 65 | echo "I'm a Linux user." 66 | echo $'I\'m a Linux user.' 67 | I'm a Linux user 68 | ``` 69 | 70 | 显示包含特殊字符的消息。 71 | 72 | 73 | 使用-e 选项启用转义字符的解释。 74 | ``` 75 | echo -e "You know nothing, Jon Snow.\n\t- Ygritte" 76 | You know nothing, Jon Snow. 77 | - Ygritte 78 | ``` 79 | 80 | 模式匹配字符。 81 | 82 | 83 | `echo` 命令可以与模式匹配字符一起使用,比如通配符。 例如,下面的命令将返回所有。 工作目录中的 php 文件。 84 | ``` 85 | echo The PHP files are: *.php 86 | The PHP files are: index.php contact.php functions.php 87 | ``` 88 | 89 | 90 | 重定向到一个文件 91 | 92 | 93 | 您可以使用,操作符将输出重定向 > 或者 >> 到一个文件,而不是显示在屏幕上。 94 | 95 | ``` 96 | echo -e 'The only true wisdom is in knowing you know nothing.\nSocrates' >> /tmp/file.txt 97 | ``` 98 | 99 | 如果 file.txt 不存在,命令将创建它。 当使用该文件时将被覆盖,而将把输出附加到该文件。 100 | 101 | 102 | 使用 cat 命令查看文件内容: 103 | ``` 104 | cat /tmp/file.txt 105 | The only true wisdom is in knowing you know nothing. 106 | Socrates 107 | ``` 108 | Displaying variables 109 | 110 | 显示变量 111 | 112 | 113 | `echo` 还可以显示变量。在下面的示例中,我们将输出当前登录用户的名称: 114 | ``` 115 | echo $USER 116 | admin 117 | ``` 118 | ![ZR4XQn](https://gitee.com/chasays/mdPic/raw/master/uPic/ZR4XQn.png) 119 | 120 | $USER 是一个保存用户名的 shell 变量。 121 | 122 | 123 | 显示命令的输出 124 | 125 | 126 | 使用 $(command)表达式将命令输出包含在 echo 的参数中。 下面的命令将显示当前日期: 127 | ``` 128 | echo "The date is: $(date +%D)" 129 | The date is: 04/01/20 130 | ``` 131 | ![gVMB8U](https://gitee.com/chasays/mdPic/raw/master/uPic/gVMB8U.png) 132 | 133 | 以彩色显示 134 | 135 | 136 | 使用 ANSI 转义序列更改前景色和背景色或设置文本属性,如下划线和粗体。 137 | 138 | - echo -e "\033[1;37mWHITE" 139 | - echo -e "\033[0;30mBLACK" 140 | - echo -e "\033[0;34mBLUE" 141 | - echo -e "\033[0;32mGREEN" 142 | - echo -e "\033[0;36mCYAN" 143 | - echo -e "\033[0;31mRED" 144 | - echo -e "\033[0;35mPURPLE" 145 | - echo -e "\033[0;33mYELLOW" 146 | - echo -e "\033[1;30mGRAY" 147 | 148 | ## 小结 149 | By now, you should have a good understanding of how the echo command works. 150 | 151 | 现在,您应该已经很好地理解了 echo 命令是如何工作的。 -------------------------------------------------------------------------------- /06_Attachments/02_Docker/Docker带来哪些好处.md: -------------------------------------------------------------------------------- 1 | 2 | ## 什么是 `Docker` 3 | 4 | 在容器中而不是在虚拟机中运行应用程序在 IT 界越来越流行。 这项技术被认为是软件工业近代史上增长最快的技术之一。 它的核心是 `Docker`,一个允许用户在容器中轻松打包、分发和管理应用程序的平台。 换句话说,它是一个开源项目,可以自动化在软件容器中部署应用程序。 5 | 6 | 7 | 通过使用容器和容器,`Docker` 实际上使得创建、部署和运行应用程序变得更加容易,容器允许开发人员将应用程序与它所需的所有部件打包,比如库和其他依赖项,并将它们作为一个包发布。 通过这样做,开发人员可以确保应用程序将运行在任何其他 Linux 机器上,而不管这台机器可能具有的任何定制设置可能与用于编写和测试代码的机器不同。 8 | 9 | ## `Docker` 现实情况 10 | `Docker`统计数据与事实 11 | 2/3的公司尝试使用 `Docker`,采用它。 大多数将要采用这种技术的公司在最初生产使用的30天内就已经这样做了。 12 | 13 | 为什么像 ING,Paypal,ADP 和 Spotify 这样的大公司一直在使用 `Docker`? 为什么`Docker`的应用增长如此之快? 让我们讨论一下 docker 的最大优点,以便更好地理解它。 14 | 15 | ## 效率 16 | 17 | 使用 docker 的第一个优点是 ROI。 在选择新产品时,大多数管理决策的最大驱动力是投资回报。 一个解决方案越能在提高利润的同时降低成本,它就越能成为一个更好的解决方案,尤其是对于那些需要长期产生稳定收入的大型知名公司而言。 18 | 19 | 20 | 从这个意义上说,`Docker` 可以通过显著减少基础设施资源来帮助实现这种类型的节约。 `Docker` 的本质是运行相同的应用程序所需的资源更少。 由于 `Docker` 减少了对基础设施的需求,组织能够节省从服务器成本到维护它们所需的员工的所有费用。 多克允许工程团队变得更小更有效率。 21 | 22 | ## 标准化与生产力 23 | 24 | `Docker` 容器确保跨多个开发和发布周期的一致性,使您的环境标准化。 基于 docker 的体系结构的最大优势之一实际上是标准化。 `Docker` 提供了可重复的开发、构建、测试和生产环境。 对整个流水线上的服务基础设施进行标准化,使得每个团队成员都可以在一个生产平价环境中工作。 通过这样做,工程师可以更有效地分析和修复应用程序中的错误。 这减少了在缺陷上浪费的时间,并增加了可用于特性开发的时间。 25 | 26 | 27 | 正如我们提到的,`Docker` 容器允许您提交对 `Docker` 映像的更改并进行版本控制。 例如,如果您执行的组件升级破坏了您的整个环境,那么回滚到以前版本的 `Docker` 映像是非常容易的。 整个过程可以在几分钟内进行测试。 `Docker` 速度很快,允许您快速进行复制并实现冗余。 此外,启动 `Docker` 映像的速度与运行机器进程的速度一样快。 28 | 29 | ## Ci 效率 30 | 31 | `Docker` 允许您构建容器映像,并在部署过程的每个步骤中使用相同的映像。 这样做的一个巨大好处是能够分离不依赖的步骤并且并行地运行它们。 从建设到生产的时间长度可以显著加快。 32 | 33 | ## 兼容性和可维护性 34 | 35 | 彻底消除“它在我的机器上工作”的问题。 整个团队都会感激的好处之一就是平价。 就 `Docker` 而言,奇偶校验意味着无论在哪台服务器或哪台笔记本电脑上运行,图像都运行相同的内容。 对于您的开发人员来说,这意味着花在设置环境、调试特定于环境的问题上的时间更少,并且代码库更具可移植性和易于设置。 奇偶校验还意味着您的生产基础设施将更可靠,更易于维护。 36 | 37 | ## 简单快速的配置 38 | 39 | `Docker` 的一个主要优点是它简化事情的方式。 用户可以使用自己的配置,将其放入代码中,并毫无问题地部署它。 由于 `Docker` 可以在各种各样的环境中使用,基础结构的需求不再与应用程序的环境联系起来。 40 | 41 | ## 快速部署 42 | 43 | `Docker` 设法将部署时间减少到秒。 这是因为它为每个进程创建一个容器,而不引导操作系统。 可以创建和销毁数据,而不用担心再次提取数据的成本会高于负担得起的成本。 44 | 45 | ## 持续部署和测试 46 | 47 | `Docker` 确保了从开发到生产的一致环境。 `Docker` 容器被配置为在内部维护所有配置和依赖关系; 您可以从开发到生产使用相同的容器,以确保没有任何差异或人工干预。 48 | 49 | 50 | 如果您需要在产品的发布周期中执行升级,您可以轻松地对 `Docker` 容器进行必要的更改、测试它们,并对现有容器实现相同的更改。 这种灵活性是使用 `Docker` 的另一个关键优势。 `Docker` 实际上允许您构建、测试和发布可以跨多个服务器部署的映像。 即使提供了新的安全补丁,过程也是一样的。 您可以应用这个补丁,测试它,并将其发布到生产环境中。 51 | 52 | ## 跨平台 53 | 54 | `Docker`最大的优点之一是便携性。 在过去的几年里,所有主要的云计算供应商,包括亚马逊网络服务(AWS)和谷歌计算平台(GCP) ,都已经接受了 `Docker` 的可用性并增加了单独的支持。 `Docker` 容器可以在 Amazon EC2实例、 Google Compute Engine 实例、 Rackspace 服务器或 VirtualBox 中运行,前提是主机操作系统支持 `Docker`。 如果是这样的话,运行在 Amazon EC2实例上的容器可以很容易地在环境之间移植,例如移植到 VirtualBox,从而实现类似的一致性和功能。 此外,`Docker` 与其他提供商如微软 Azure 和 OpenStack 合作得非常好,并且可以与各种配置管理器如 Chef、 Puppet 和 Ansible 等一起使用。 55 | 56 | ## 独立 57 | 58 | `Docker` 确保您的应用程序和资源是隔离的。 `Docker` 确保每个容器都有自己独立于其他容器的资源。 您可以为运行完全不同堆栈的独立应用程序使用各种容器。 因为每个应用程序都在自己的容器上运行,所以 `Docker` 可以帮助您确保清除应用程序。 如果您不再需要应用程序,您可以简单地删除它的容器。 它不会在你的主机操作系统上留下任何临时或配置文件。 59 | 60 | 61 | 除了这些好处之外,`Docker` 还确保每个应用程序只使用分配给它们的资源。 特定的应用程序不会使用所有可用资源,这通常会导致其他应用程序的性能下降或完全停机。 62 | 63 | ## 安全 64 | 65 | 使用 docker 的最后一个好处是安全性。 从安全的角度来看,`Docker` 确保在容器上运行的应用程序是完全隔离和彼此隔离的,使您能够完全控制流量流和管理。 任何 `Docker` 容器都不能查看在另一个容器中运行的进程。 从体系结构的角度来看,每个容器都有自己的一组资源,范围从处理到网络堆栈。 66 | 67 | 68 | 作为结论,我想说 `Docker` 容器共享它们的操作系统,因此它们作为独立的进程运行,而不管主机操作系统如何。 正如多克自豪地承认的那样,这意味着它的容器可以“在任何计算机、任何基础设施和任何云中运行” 它所具有的可移植性、灵活性和简单性是 `Docker` 能够产生如此强劲势头的一个关键原因。 我们是在 Apiumhub 使用 `Docker` 的忠实粉丝,我们相信它将继续增长。 69 | 70 | 译文来自: https://dzone.com/articles/difference-between-deveops-and-mobile-devops-lifecycle -------------------------------------------------------------------------------- /06_Attachments/GoodTest.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chasays/Advanced-Test/bca3d30f3cc89be0ae91b4e3d0407bf82fb1c615/06_Attachments/GoodTest.pdf -------------------------------------------------------------------------------- /06_Attachments/LP87w0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chasays/Advanced-Test/bca3d30f3cc89be0ae91b4e3d0407bf82fb1c615/06_Attachments/LP87w0.png -------------------------------------------------------------------------------- /06_Attachments/学习路径.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 人在学习成长的过程中,最重要的就是学会去迁移去学习,去`复制`别人的成功。怎么去复制别人的成功呢?所以首先得有个mentor。 4 | 5 | 6 | 比如屌丝逆袭成为拉风大侠几乎是武侠小说的主旋律,之所以他们能够逆袭,大都因为遭遇了离奇的经历,或遇高人,或吃灵药,或得秘籍。大部分人初入职场之时都是没有背景从零起步,数年过后总会有少数人快速上升成为中高层。好导师的意义等同于郭靖碰到了洪七公。江南七怪使再大劲花再多时间,远不如人家传授一招半式管用。 7 | 8 | 9 | 如果你是一个爱好学习的人,一定会看到许多这样的目录 content。只有目录还不够,怎么去获取学习内容细节。如果是有钱人,为了节约自己的时间,肯定不用多说,直接掏钱买大佬总结的课程就完了。但是还有一部分人,对于高额费用,望而却步,选择自学。因此我再次`复制`了`思涵`大佬的在线课程。 10 | 11 | ## Linux基础 12 | - 常用命令 13 | - 脚本知识 14 | 15 | ## Docker 16 | - 安装 17 | - 使用 18 | 19 | ## SQL 20 | - 基础语法 21 | - 进阶知识点 22 | 23 | ## Python 24 | - 环境管理 25 | - 语法 26 | - 常用数据结构 27 | - 脚本执行 28 | - 面向对象编程 29 | 30 | ## Python 测试框架 31 | - Unittest 单元测试 32 | - PyTest 框架 33 | - 测试报告框架 Allure2 34 | - 参数化与数据驱动 35 | 36 | ## Selenium 框架 37 | - Selenium 安装 38 | - 用例写作 39 | - 元素定位 40 | - 输入滑动等常见交互 41 | - 执行JS脚本 42 | - upload and dialog 43 | 44 | ## web实战测试 45 | - 设计模式 46 | - 原则 47 | - 演练 48 | 49 | 50 | ## Android 自动化 51 | - Appium 安装 52 | - 用例写作 53 | - 常用API 54 | - 高级定位 55 | - UI属性断言和断言机制 56 | - 参数化 57 | 58 | ## Appium 高级应用 59 | - 小程序测试 60 | - 交互API 61 | - 原理和协议分析 62 | - 二次封装 63 | 64 | ## App自动化实战 65 | - 设计模式 66 | - 原则 67 | - 演练 68 | 69 | 70 | ## Mobile性能测试 71 | 72 | ## 安全测试 73 | 74 | ## CI 75 | - Jenkins安装 76 | - Job机制 77 | - 节点管理 78 | - 权限控制 79 | - 高级插件 80 | - 邮件报警 81 | - 父子Job 82 | - 参数化Job 83 | 84 | ## CD 85 | - 远程调用API 86 | - web Hook机制 87 | - pipeline机制 88 | - Jenkinsfile语法 89 | - 接口结合测试 90 | - 与UI结合测试 91 | 92 | 93 | 94 | ![20200301233743.png](https://raw.githubusercontent.com/rikiesxiao/mdPicGo/master/20200301233743.png) 95 | 96 | ![20200301233802.png](https://raw.githubusercontent.com/rikiesxiao/mdPicGo/master/20200301233802.png) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Advanced-Test 2 | 3 | [![TesterHome](https://img.shields.io/badge/TTF-TesterHome-2955C5.svg)](https://testerhome.com/github_statistics) 4 | 5 | 6 | :chart_with_upwards_trend: 互联网测试程序员的进阶之路。涵盖测试基础知识、框架、工具、接口、Web、移动App、性能测试等,既然是进阶,有这些肯定还是不够的,补充算法、开发语言、集成。 7 | 8 | 9 | 10 | 11 | 在这份指南里,根据市面上非常热门的测试相关培训资料为依据,尽可能地综合客观的看法,为大家提供一份详尽的`测试工程师进阶`指南,真心希望本指南能给你带来一点小小的帮助。 12 | 13 | # 大纲 14 | 15 | ## 01_Basic :notebook_with_decorative_cover: 16 | #todo 怎么了解测试,测试是什么 17 | 18 | - [01_什么是软件测试-01](https://github.com/rikiesxiao/Advanced-Test/blob/master/01_Basic/01_%E4%BB%80%E4%B9%88%E6%98%AF%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95-01.md) 19 | - [01_什么是软件测试-02](https://github.com/rikiesxiao/Advanced-Test/blob/master/01_Basic/01_%E4%BB%80%E4%B9%88%E6%98%AF%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95-02.md) 20 | - [02_01_什么是测试用例](https://github.com/rikiesxiao/Advanced-Test/blob/master/01_Basic/02_01_%E4%BB%80%E4%B9%88%E6%98%AF%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B.md) 21 | - [03_好的测试用例是什么样的](https://github.com/rikiesxiao/Advanced-Test/blob/master/01_Basic/03_%E5%A5%BD%E7%9A%84%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E6%98%AF%E4%BB%80%E4%B9%88%E6%A0%B7%E7%9A%84.md) 22 | 23 | 24 | ## 02_Framework :house: 25 | #todo 按应用场景分 26 | - [01_什么是自动化框架.md](https://github.com/rikiesxiao/Advanced-Test/blob/master/02_Framework/01_%E4%BB%80%E4%B9%88%E6%98%AF%E8%87%AA%E5%8A%A8%E5%8C%96%E6%A1%86%E6%9E%B6.md) 27 | - [02_好的自动化框架有哪些特性.md](https://github.com/rikiesxiao/Advanced-Test/blob/master/02_Framework/02_%E5%A5%BD%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8C%96%E6%A1%86%E6%9E%B6%E6%9C%89%E5%93%AA%E4%BA%9B%E7%89%B9%E6%80%A7.md) 28 | 29 | ## 03_Language :bicyclist: 30 | #todo 开发、sql、linux等 31 | 32 | ### Python 33 | 34 | 学习Python是一个渐进的过程,不是一蹴而就的,不要一口吃成一个大胖子。对于市面上很多教材,像什么10天学会Python、学会英语一样一个道理,这就是一个噱头,其实都是教你一个怎么入门的一个过程或者一个学习的方法,其实自己要掌握更深的,跟广的东西去精通,那还是要`通过自己去反复的练习`。我说这里推荐两个资料。 35 | 1. 我建议先看[「简明Python」](https://learnku.com/docs/byte-of-python/2018) 36 | 2. 完了可以跟着这个repo-[「show-me-the-code」](https://github.com/Yixiaohan/show-me-the-code)一起学习 37 | 38 | 39 | ### Java 40 | 41 | `首先说一下为什么要学习Java`?Java工程师也是市场需求最大的软件工程师,主要是针对一线大厂BATTH,需要Java开发技能,所以学会Java也是非常关键的。目前我的Java技能也是很表面的一些东西,这里就推荐我正在学习的,我正在看了一些教程和一些资料。学习方法不是很多为主,主要是找到一个方法,然后坚持下去。也是推荐2个课程 42 | 43 | 1. [这是专门针对小白的零基础Java教程](https://www.liaoxuefeng.com/wiki/1252599548343744) 44 | 2. [互联网 Java 工程师进阶知识完全扫盲](https://doocs.github.io/advanced-java/#/) 45 | 46 | ### Linux 47 | 48 | 作为计算机行业,`这个是必要技能`。如果说Windows系统是一个小玩具,那么Linux`绝对`是一个挖掘机。应该有人反对,毕竟Linux打游戏还是比不过Windows的。 49 | 50 | 重点推荐2个教程. 51 | 1. [Runoob的Linux基础](https://www.runoob.com/linux/linux-tutorial.html) 52 | 53 | 学完上面这个,基本上对于Linux命令来说就没有太大的问题,主要就是应用。这个就是在工作和实战过程中去实际操练,以后就能慢慢的信手拈来。 54 | 55 | 2. [Linux 13个常用命令](https://github.com/chasays/Advanced-Test/tree/master/06_Attachments/01_Linux) 56 | 57 | ## 04_CI_CD :slot_machine: 58 | - [01_什么是CICD.md](https://github.com/rikiesxiao/Advanced-Test/blob/master/04_CI/CD/01_%E4%BB%80%E4%B9%88%E6%98%AFCICD.md) 59 | 60 | ## 05_Others :heavy_plus_sign: 61 | - [01_博客.md](https://github.com/rikiesxiao/Advanced-Test/blob/master/05_Others/01_%E5%8D%9A%E5%AE%A2.md) 62 | - [02_测试书籍.md](https://github.com/rikiesxiao/Advanced-Test/blob/master/05_Others/02_%E6%B5%8B%E8%AF%95%E4%B9%A6%E7%B1%8D.md) 63 | 64 | - [03_持续提升]() 65 | >可以关注我的微信公众号「chasays」,不定期分享干货。 66 | ![LP87w0](https://gitee.com/chasays/mdPic/raw/master/uPic/LP87w0.png) 67 | 68 | ## GitBook 链接 :end: 69 | 70 | #todo 71 | 72 | 73 | ## 协议/License :copyright: 74 | 75 | 知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。 76 | --------------------------------------------------------------------------------