Linux入门

本文详细介绍了Linux操作系统的基础知识,包括安装、启动流程、SSH远程连接,以及用户管理和权限管理。此外,讲解了Python的安装、虚拟环境管理,以及Git的使用,包括本地和远端仓库的操作。还涉及了Shell编程,包括分支、循环、函数等基本概念。文章适合初学者,帮助理解Linux系统和Python开发环境的搭建与管理。

视频在线学习地址:https://www.bilibili.com/video/BV1Az411q7BE

————————————————
——Python-Linux基础:BV1Az411q7BE

Linux入门

在本章节里,我们将要学习一下几部分内容:

  • 操作系统的概念
  • 什么是Linux系统
  • 安装使用Linux系统
  • Linux的启动流程
  • 使用ssh远程连接Linux

操作系统

我们说过,一台计算机是有硬件和软件两大部分组成,软件部分里又被分为系统软件和应用软件,而在系统软件里,又有一个操作系统。

没有安装操作系统的计算机,通常被称为 裸机

  • 如果想在 裸机 上运行自己所编写的程序,就必须用机器语言书写程序
  • 如果计算机上安装了操作系统,就可以在操作系统上安装支持的高级语言环境,用高级语言开发程序

什么是操作系统

操作系统:是一种方便用户管理和控制计算机软硬件资源的系统软件,同时也是一个大型的软件系统,其功能复杂,体系庞大,在整个计算机系统中具有承上启下的地位。我们操作计算机实际上是通过操作系统来进行的,它是所有软件的基础和核心。

  • 是现代计算机系统中 最基本和最重要 的系统软件
  • 是 配置在计算机硬件上的第一层软件,是对硬件系统的首次扩展
  • 主要作用是管理好硬件设备,并为用户和应用程序提供一个简单的接口,以便于使用
  • 而其他的诸如编译程序、数据库管理系统,以及大量的应用软件,都直接依赖于操作系统的支持

操作系统分类

  • 桌面操作系统
  • 服务器操作系统
  • 嵌入式操作系统
  • 移动设备操作系统

桌面操作系统

  • Windows 系列
    • 用户群体大
  • macOS
  • Linux
    • 应用软件少

服务器操作系统

  • Linux
    • 安全、稳定、免费
    • 占有率高
  • Windows Server
    • 付费
    • 占有率低

嵌入式操作系统

  • Linux

移动设备操作系统

  • Android、iOS、Symbian、WindowsMobile、BlackBerry

Linux系统介绍

Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统,继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。

严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。

 

Linux发展历史

Linux 操作系统的诞生、发展和成长过程始终依赖着五个重要支柱:

  • UNIX操作系统
  • MINIX操作系统
  • GNU计划
  • POSIX标准
  • Internet 网络

Unix操作系统

Unix 操作系统,是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统,最早由Ken Thompson、Dennis Ritchie 和 Douglas McIlroy于1969年在 AT&T 的贝尔实验室开发。

肯·汤普逊最初在 GE-645 机器上,写出了一个仿真器,可以让一个文件系统与内存分页机制运作起来。他同时也写了一个程序语言Bon,编写了一个太空旅行游戏。经过实际运行后,他发现游戏速度很慢而且耗费昂贵,每次运行会花费75美元。在 GE-645 被搬走后,肯·汤普逊在实验室中寻找没人使用的机器,找到了几台 PDP-7。丹尼斯·里奇的帮助下,汤普逊用 PDP-7 的汇编语言重写了这个游戏,并使其在 DEC PDP-7上运行起来。

1969年,肯·汤普逊开发了一个壳层(shell)与一些驱动程序,做出一个操作系统的雏形。在团队合作下,最终做出了一个分时多任务操作系统,成为第一版UNIX。

第一版 UNIX 是用PDP-7汇编语言编写的,一些应用是由叫做B语言的解释型语言和汇编语言混合编写的。

在进行系统编程时不够强大,所以汤普逊和里奇对其进行了改造,并于1971年共同发明了C语言。

1973年汤普逊和里奇用C语言重写了Unix,形成第三版UNIX。在当时,为了实现最高效率,系统程序都是由汇编语言编写,所以汤普逊和里奇此举是极具大胆创新和革命意义的。用C语言编写的Unix代码简洁紧凑、易移植、易读、易修改,为此后Unix的发展奠定了坚实基础。

此后的10年,Unix在学术机构和大型企业中得到了广泛的应用,当时的UNIX拥有者AT&T公司以低廉甚至免费的许可将Unix源码授权给学术机构做研究或教学之用,许多机构在此源码基础上加以扩展和改进,形成了所谓的“Unix变种”,这些变种反过来也促进了 Unix 的发展,其中最著名的变种之一是由加州大学柏克莱分校开发的伯克利软件套件(BSD)产品。

后来AT&T意识到了Unix的商业价值,不再将Unix源码授权给学术机构,并对之前的Unix及其变种声明了著作权权利。BSD在Unix的历史发展中具有相当大的影响力,被很多商业厂家采用,成为很多商用Unix的基础。其不断增大的影响力终于引起了AT&T的关注,于是开始了一场持久的著作权官司,这场官司一直打到AT&T将自己的Unix系统实验室卖掉,新接手的Novell采取了一种比较开明的做法,允许柏克莱分校自由发布自己的Unix变种,但是前提是必须将来自于AT&T的代码完全删除,于是诞生了4.4 BSD Lite版,由于这个版本不存在法律问题,4.4 BSD Lite成为了现代柏克莱软件包的基础版本。尽管后来,非商业版的Unix系统又经过了很多演变,但其中有不少最终都是创建在BSD版本上(Linux、Minix等系统除外)。所以从这个角度上,4.4 BSD 又是所有自由版本Unix的基础,它们和System V及Linux等共同构成Unix操作系统这片璀璨的星空。

 

GNU

1983年,Richard Stallman发起了GNU项目,目标是创建一个完全自由且向下兼容UNIX的操作系统。

1991年,GNU计划已经开发出了许多工具软件,最受期盼的GNU C编译器已经出现,GNU的操作系统核心HURD一直处于实验阶段,没有任何可用性,实质上也没能开发出完整的GNU操作系统,但是GNU奠定了Linux用户基础和开发环境。

Minix&Linux

1991年初,林纳斯·托瓦兹开始在一台386sx兼容微机上学习minix操作系统。1991年4月,林纳斯·托瓦兹开始酝酿并着手编制自己的操作系统。

1991 年4 月13 日在comp.os.minix 上发布说自己已经成功地将bash 移植到了minix 上,而且已经爱不释手、不能离开这个shell软件了。

1991年7月3日,第一个与Linux有关的消息是在comp.os.minix上发布的(当然此时还不存在Linux这个名称,当时林纳斯·托瓦兹的脑子里想的可能是FREAX,FREAX的英文含义是怪诞的、怪物、异想天开等)。

1991年的10月5日,林纳斯·托瓦兹在comp.os.minix新闻组上发布消息,正式向外宣布Linux内核的诞生(Freeminix-likekernel sources for 386-AT)。

1993年,大约有100余名程序员参与了Linux内核代码编写/修改工作,其中核心组由5人组成,此时Linux 0.99的代码大约有十万行,用户大约有10万左右。

1994年3月,Linux1.0发布,代码量17万行,当时是按照完全自由免费的协议发布,随后正式采用GPL协议。

1995年1月,Bob Young创办了RedHat(小红帽),以GNU/Linux为核心,集成了400多个源代码开放的程序模块,搞出了一种冠以品牌的Linux,即RedHat Linux,称为Linux"发行版",在市场上出售。这在经营模式上是一种创举。

1996年6月,Linux 2.0内核发布,此内核有大约40万行代码,并可以支持多个处理器。此时的Linux 已经进入了实用阶段,全球大约有350万人使用。

1998年2月,以Eric Raymond为首的一批年轻的"老牛羚骨干分子"终于认识到GNU/Linux体系的产业化道路的本质,并非是什么自由哲学,而是市场竞争的驱动,创办了"Open Source Intiative"(开放源代码促进会)"复兴"的大旗,在互联网世界里展开了一场历史性的Linux产业化运动。

2001年1月,Linux 2.4发布,它进一步地提升了SMP系统的扩展性,同时它也集成了很多用于支持桌面系统的特性:USB,PC卡(PCMCIA)的支持,内置的即插即用,等等功能。

2003年12月,Linux 2.6版内核发布,相对于2.4版内核2.6在对系统的支持都有很大的变化。

2004年的第1月,SuSE嫁到了Novell,SCO继续顶着骂名四处强行“化缘”, Asianux, MandrakeSoft也在五年中首次宣布季度赢利。3月,SGI宣布成功实现了Linux操作系统支持256个Itanium 2处理器。

主要特征

基本思想 Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近。

完全免费

Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码。这是其他的操作系统所做不到的。正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大。

完全兼容POSIX1.0标准 这使得可以在Linux下通过相应的模拟器运行常见的DOS、Window的程序。这为用户从Windows转到Linux奠定了基础。许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。

多用户、多任务 Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立运行。

良好的界面 Linux同时具有字符界面和图形界面。在字符界面用户可以通过键盘输入相应的指令来进行操作。它同时也提供了类似Windows图形界面的X-Window系统,用户可以使用鼠标对其进行操作。在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。

支持多种平台 Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上。2001年1月份发布的Linux 2.4版内核已经能够完全支持Intel 64位芯片架构。同时Linux也支持多处理器技术。多个处理器同时工作,使系统性能大大提高

Linux启动流程(了解)

  • 加载BIOS(Basic Input Output System):BIOS是系统启动时加载的第一个软件。
    • 启动上电自检POST(Power-On-Self-Test),负责完成对CPU、主板、内存、软硬盘子系统、显示子系统(包括显示缓存)、串并行接口、键盘、CD-ROM光驱等的检测,主要检查硬件的好坏。
    • 对外部设备进行初始化,读取BIOS参数,并和实际的硬件进行比较,如果不符合,会影响系统启动。
    • 查找MBR(Master Boot Record,主引导分区)。如果未找到,会提示找不到硬盘。
  • 读取主引导分区(MBR):拷贝启动引导代码BootLoader
  • 启动引导代码(bootloader):当我们的硬盘上有多个操作系统时,可以用来选择进入到哪个操作系统。
  • 加载内核,进入操作系统:运行第一个程序 : /sbin/init
    • sbin/init 会读取相关的配置文件,来确定系统的运行级别。
      • 0: 关机
      • 1 : 单用户模式
      • 2 : 无网络支持的多用户模式
      • 3 : 有网络支持的多用户模式
      • 4 : 保留,未使用
      • 5 : 有网络支持,且有图形化界面的多用户模式
      • 6 : 重启
      • 切换运行级别: init 级别
    • 根据对应的运行级别,查找对应的脚本文件。例如,运行5级别,查找 /etc/rc5.d目录,启动该目录下的相关服务。
      • 这些文件夹下的init脚本都有一些特别的名字,命名都以S(start)、K(kill)或D(disable)开头,后面跟一个数字。当init进入一个运行等级的时候,它会按照数字顺序运行所有以K开头的脚本并传入stop参数,除非对应的init脚本在前一个运行等级中没有启动。然后init按照数字顺序运行所有以S开头的脚本并传入start参数。任何以D开头的init脚本都会被忽略—这让你可以在指定的运行等级禁止一个脚本,或者你也可以仅仅移除全部符号链接。
    • 解析用户自定义的启动脚本:/etc/rc.local(如果存在的话)
    • 进入用户界面。

远程连接Linux

在实际开发中,Linux服务器都是被放在服务器机房里的,我们不能直接进入到服务器机房去操作这台Linux服务器,而是通过一些远程链接工具,对Linux服务器进行管理。

SSH协议

SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。

Ubuntu默认没有安装ssh服务,需要我们使用代码手动的在Ubuntu服务器上安装ssh服务。

sudo yum install openssh
sudo systemctl start sshd

sudo yum install openssh
sudo systemctl start sshd

git的下载使用

在Windows系统上,我们不能直接使用SSH链接到一个远程服务器,需要使用SSH工具来实现远程链接。常见的SSH工具有XShell,putty等,也可以直接使用git bash来实现远程链接。我们这里主要给大家介绍使用git bash来实现远程链接。

 

 

git是一款源代码管理工具,它的作用和功能非常强大,后续我们会详细的介绍,在这里我们暂时先使用git的一个工具:git bash,它可以很方便的让我们在windows里执行Linux指令,实现SSH远程链接。

git下载地址

下载完成以后,双击 Git-2.21.0-64-bit.exe文件,安装git.安装完成以后,会多出两个应用程序,一个是git bash,另一个是git GUI.我们先关注git bash,它是一个命令行工具,可以让我们在Windows里执行很多的Linux指令。

使用 git bash实现SSH远程连接

 2.软件安装相关指令

在Linux中,很多功能需要使用命令行来实现,我们甚至可以不使用桌面,只使用终端命令在Linux里实现绝大多数功能。

指令的基本格式:

命令 [选项] [参数]
Copy

例如:

ls -a /   # 表示列出根目录下所有的文件及文件夹
Copy

软件管理相关指令

简单来说,Linux系统可以分为Debian和RedHat两大分支。基于Debian平台比较流行的操作系统是Ubuntu,基于RedHat平台比较流行的操作系统是fedora.两种不同的分支,它们所使用的软件管理命令也是不一样的。

基于Debian平台的操作系统,使用dpkg和apt指令管理软件,基于RedHat平台的操作系统,使用rpm和yum指令来管理软件。它们的命名方式不同,但是命令的执行效果大致相同,我们主要学习基于Fedora平台CentOS系统下的rpmyum指令。

rpm

rpm是“Red-Hat Package Manager”的简写,为 Red Hat专门开发的套件管理系统,方便软件的安装、更新及移除。所有源自Red Hat的“Linux ”发行版都可以使用 rpm.

命令行作用示例
rpm -ivh <.rpm file name>安装.rpm后缀名的软件,并显示安装详情rpm -ivh google-chrome-stable_current_x86_64.rpm
rpm -e <packagename>删除指定的软件rpm -r google-chrome-stable
rpm -qa列出电脑上安装的所有包rpm -qa

yum

yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

命令行作用示例
yum search <packagename>搜索软件包yum search python
yum list installed列出已经安装的软件包yum list installed
yum install <packagename>用来安装指定的软件包yum install vim
yum remove用来移除软件包yum remove vim
yum update <packagename>更新软件包yum updat tar
yum check-update检查更新yum check-update
yum info <packagename>列出指定软件包详情yum info python

区别

yum是基于rpm的,它的功能更加强大。

场景rpmyum
离线的.rpm安装包能够安装,但是不能自动下载安装依赖能够安装,并且能够自动安装下载安装依赖
在线安装不支持,只能把安装包下载到本地安装支持在线下载安装

3.文件系统

文件系统

操作系统中,用来管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。具体来说,这部分系统就是负责为用户建立、读取、修改和转储文件,控制文件的存取,当用户不再使用时撤销文件等。

常见的文件系统介绍:

  • FAT16

    MS-DOS6.X及以下版本使用。每个磁盘的分区最大只能达到2G,并且会浪费很多空间。在FAT16里有簇的概念,就相当于是图书馆里一格一格的书架,每个要存到磁盘的文件都必须配置足够数量的簇,才能存放到磁盘中,每个文件,无论大小,都至少要使用一个簇在保存。

    FAT16各分区与簇大小的关系如下表:

    分区大小FAT16簇大小
    16MB-127MB2KB
    128MB-255MB4KB
    256MB-511MB8KB
    512MB-1023MB16KB
    1024MB-2047MB32KB

    思考:如果一个1KB的文件,被保存到了一个1000M的分区,这个文件实际占用的空间是多少?

  • FAT32

    Windows95以后的系统都支持。

    FAT32具有一个最大的优点:在一个不超过8GB 的分区中,FAT32分区格式的每个簇容量都固定为4KB,与FAT16相比,可以大大地减少磁盘的浪费,提高磁盘利用率。

    突破了FAT16对每一个分区的容量只有2GB的限制,可以将一整个大硬盘定义成一个分区而不必分为几个分区使用,方便了对磁盘的管理。但是,FAT32里,无法存放大于4GB的单个文件,而且容易产生磁盘碎片,性能不佳。

    另外,FAT不支持长文件名,只能支持8个字符,而且后缀名最多只支持3个字符。

  • NTFS

    WindowsNT系列设计,用来取代FAT系统。每个簇的空间更小,磁盘的利用率更高,并且可以共享资源、文件夹以及对文件设置访问许可权限。

  • RAW

    RAW文件系统是一种磁盘未经处理或者未格式化产生的文件系统。一般来说有这几种可能造成正常文件系统变成RAW文件系统:

    • 没有格式化
    • 格式化中途取消
    • 硬盘出现坏道
    • 硬盘出现不可预知的错误
  • EXT

    EXT是扩展文件系统,目前最新的版本是5.0.

  • HFS(+)

    苹果电脑上的文件系统。

Linux里的文件系统

不同于Windows系统有盘符的概念(C盘、D盘等),Linux里只有一个盘符,是从 " / " 开始的,只有它是没有上级目录的。如果把整个应用目录系统看成一个树形结构," / " 表示相当于这个树形结构的根,我们可以将 " / " 称之为根目录。

在根目录里,有以下几个一级文件夹或文件,需要大家有所了解。

目录说明
/系统的根目录
/bin包含了一些二进制文件,即可执行文件。我们在命令行里执行的指令,例如 ls,rm,cp,mv等,其实都是执行的这个目录里的二进制文件。
/boot系统启动相关时所需的文件。(勿动)
/dev设备文件,其中许多都是在启动时或运行时生成的。例如,如果你将新的网络摄像头连接到机器中,会自动弹出一个新的设备条目
/etc用来存放所有的系统管理所需要的配置文件和子目录。(会经常使用)
/home用户的主目录,每一个用户都有自己的目录,所有的用户都存放在home目录下。
/lib(64)用来存放系统最基本的动态连接共享库,几乎所有的应用程序都需要用到这些共享库。
/lost+found这个目录一般情况下是空的,当系统非法关机后,这里会存放一些没来得及保存的文件。
/mediaLinux系统自动识别的一些设备,比如U盘、光驱等,当识别后,linux会把识别的设备挂载到这个目录下。
/mnt系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光盘挂载在/mnt/上,然后进入到该目录就可以查看光驱里的内容了。
mount /dev/cdrom /mnt/
umount /mnt/
/opt给额外安装软件所摆放的目录。比如你安装一个ORACLE数据库就可以把它放到这个目录下
/proc虚拟目录,它是系统内存的映射,可以通过直接访问这个目录来获取系统信息。
/proc/sys/net/ipv4/icmp_echo_ignore_all
/root超级用户目录
/run是一个临时文件,存储系统启动以来的信息,当系统重启时,这个目录下的文件会被删除。
/sbin超级用户使用的命令存放目录
/srv存放一些服务启动之后需要提取的数据
/sys映射内核设备
/tmp存放临时文件
/usr非常重要的目录,用来存放用户安装的应用程序和用户文件。
/var经常修改的数据,比如程序运行的日志文件
  • 以 " . " 开头的文件是隐藏文件。
  • " ./ " 表示的是当前目录; “ ../ ” 表示的上级目录
  • “ ~ ” 表示的当前用户的家目录

4.vim编辑器

vim的使用

Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性。

安装

sudo yum install vim
Copy

使用

vim 有三种工作模式:命令模式,输入模式和编辑模式。

!v : 打开最后使用vim打开的文件

vim filename : 打开/新建一个文件

  • 命令模式:按Esc键切换到命令模式
命令/操作说明
ZZ(shift + zz)保存退出
光标定位
vim filename +n打开文件,将光标定位到第n行
vim filename +打开文件,将光标定位到最后一行
gg定位到首行
G定位到尾行
ngg定位到第n行
^/0定位到行首
$定位到行尾
k
j
h
l
ctrl + f下翻一页
ctrl + b上翻一页
ctrl + d下翻半页
ctrl + u上翻半页
内容处理
x向右删除一个字符
nx向右删除n个字符,n表示个数
X向左删除一个字符
nX向左删除n个字符,n表示个数
dd删除光标所在行
ndd删除光标开始的n行
p粘贴剪切板中的内容
yy复制光标所在行
nyy复制光标开始的n行
u撤销
ctrl + r反撤销
  • 输入模式:
命令说明
i在光标位置插入
I在第一个非空字符插入
a在光标的下一个字符输入
A在行尾插入
o在光标所在的行下面插入空行
O在光标所在的行上面插入空行
s删除光标所在字符,并进入输入模式
S删除光标所在行,并进入输入模式
  • 编辑模式:在命令模式下,按 : 键进入到编辑模式。
命令说明
:w保存
:q退出
:wq保存退出
:x保存退出
:w!强制保存
:q!强制退出,不保存修改
:e!放弃修改,恢复到修改之前的状态
:w newfile文件另存为
:set nu[mber]显示行号
:set nonu[mber]隐藏行号
:set tabstop=4设置一个tab缩进4个字符
:set mouse=a启用鼠标的点击功能
[:]/内容查找指定内容,n下翻,N上翻
[:]?内容查找指定内容,N下翻,n上翻
:%s/原内容/新内容/[g]所有行内容替换,g表示全局(默认只能替换一行中第一处)
:m,ns/原内容/新内容/[g]m到n行内容替换,g用法同上
光标定位
:n将光标定位到第n行,n表示行号
  • 若非正常关闭了vim,可能会产生临时的交换文件,再次打开时会出现特定的界面,可以根据提示进行内容的恢复以及交换文件的删除,也可以手动将交换文件删除,下次就OK了。交换文件时隐藏的(ls -a)

配置

vim配置文件:打开文件后的配置是临时的,关闭后就失效了。

  • 配置方法一:

    直接修改 /etc/vim/vimrc文件。(vim安装好以后的默认配置,不推荐)

  • 方法二:自己创建文件进行配置

    • 在用户家目录创建一个文件.vimrc
    • 将vim相关的配置写在文件中
    • 若文件没有生效,需要重新加载一次source ~/.vimrc
set nocompatible " 关闭 vi 兼容模式
syntax on " 自动语法高亮
set number " 显示行号
set cursorline " 突出显示当前行
set ruler " 打开状态栏标尺
set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4
set softtabstop=4 " 使得按退格键时可以一次删掉 4 个空格
set tabstop=4 " 设定 tab 长度为 4
set nobackup " 覆盖文件时不备份
set autochdir " 自动切换当前目录为当前文件所在的目录
filetype plugin indent on " 开启插件
set backupcopy=yes " 设置备份时的行为为覆盖
set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感
set nowrapscan " 禁止在搜索到文件两端时重新搜索
set incsearch " 输入搜索内容时就显示搜索结果
set hlsearch " 搜索时高亮显示被找到的文本
set noerrorbells " 关闭错误信息响铃
set novisualbell " 关闭使用可视响铃代替呼叫
set t_vb= " 置空错误铃声的终端代码
set showmatch " 插入括号时,短暂地跳转到匹配的对应括号
set matchtime=2 " 短暂跳转到匹配括号的时间
set magic " 设置魔术
set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存
set guioptions-=T " 隐藏工具栏
set guioptions-=m " 隐藏菜单栏
set smartindent " 开启新行时使用智能自动缩进
set backspace=indent,eol,start "不设定在插入状态无法用退格键和 Delete 键删除回车符
set cmdheight=1 " 设定命令行的行数为 1
set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏)
set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\="" %0(%{&fileformat}\="" %{&encoding}\="" %c:%l="" %L%)\="" "="" 设置在状态行显示的信息="" set="" foldenable="" 开始折叠="" foldmethod="syntax" 设置语法折叠="" foldcolumn="0" 设置折叠区域的宽度="" setlocal="" foldlevel="1" 设置折叠层数为="" foldclose="all" 设置为自动关闭折叠="" nnoremap=""  @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo') " 用空格键来开关折叠

5.目录操作的常见指令

目录操作的常见指令

  • pwd:查看当前工作目录

  • cd:切换工作目录

符号说明
.当前目录
..上一级目录
~当前用户的家目录
-表示上次切换之前的目录
/表示根目录

1.使用cd时,不指定目标地址,会切换到家目录

2.凡是以/开头的目录都是绝对目录

3.凡是以.或..开头的目录都是相当目录

  • l:查看指定目录的内容,不指定目录时查看当前工作目录
选项说明
-a显示所有文件,包括隐藏文件
-l列表显示,详细信息
-h人性化的显示大小,如:K/M/G

-l选项显示的结果:类型及权限 | 连接数 | 用户 | 用户组 | 大小 | 月 | 日| 年/时间 | 名称

文件类型:(-l显示结果中的第一部分的第一列)

连接数:如果是文件,表示这个文件有多少个名字(硬链接);如果是目录,表示这个目录里有多少个子目录。

符号类型
-普通文件。包括纯文本文件(ASCII);二进制文件(binary);数据格式的文件(data);各种压缩文件等。
d目录文件。
l链接文件。类似于Windows里的快捷方式。
c字符设备文件。即串行端口的接口设备,例如键盘、鼠标等等。
b块设备文件。就是存储数据以供系统存取的接口设备,简单而言就是硬盘
s套接字文件。这类文件通常用在网络数据连接,最常在 /var/run目录中看到这种文件类型。
p管道文件。它主要的目的是,解决多个程序同时存取一个文件所造成的错误。
  • alias:给命令起别名。

    alias md=mkdir
    Copy

    相当于给mkdir命令起了一个别名,以后使用md即可创建一个文件夹。

    alias   # 不添加任何参数,表示列出所有的别名
    Copy

     

    unalias md   # 删除别名
    Copy

文件和目录的创建删除

命令说明
touch新建文件,可以是多个
rm删除文件或目录(删除目录时要传递'-r'选项)
cp拷贝文件或目录(拷贝目录是要传递'-r'选项)
mv移动文件或目录
mkdir创建目录,可以是多个
rmdir删除空目录
  • 选项说明

    • -r:删除或拷贝目录时需要添加,表示递归操作。

    • -f:表示强制操作,没有提示信息。

    • :表示模糊匹配,如:`rm .py`,表示删除所有的py文件。

    • -p:创建目录时若需要创建中间目录,可以添加此选项。

      mkdir -p  a/b/c
      Copy

查看文件

  • 相关命令
命令说明
cat从上到下,显示文件全部内容
tac从下到上,显示文件全部内容
head查看开头指定行数的内容,不指定时默认10行,如:head -20 filename
tail查看文件末尾指定行数的内容,不指定时默认10行,如:tail -5 filename
nl功能与cat相同,但是多显示了行号
wc统计显示,内容:行数 单词数 字符数 文件名
more一点一点查看内容
less一点一点查看内容
  • more/less使用说明

    • 显示一屏就停止
    • q退出查看
    • enter下翻一行
    • 空格下翻一屏
    • more查看完毕会自动退出,less不会
    • less可以使用上下按钮上下翻看,more不可以
    • 经常结合管道使用:ls /etc | more

6.用户管理相关指令

用户管理相关命令

用户管理

  • 相关命令
命令说明
whoami查看当前登录的用户名
useradd新建用户,-d指定家目录,-m创建家目录,-s指定shell
userdel删除用户,-r会删除用户家目录
passwd设置指定用户的密码,没有指定用户,是修改当前用户的密码
su -切换用户,一定要加上'-',否则只会切换家目录,但是环境没有切换,不指定用户时默认切换到root用户(记得先给root用户设置密码)
sudo以指定用户(root)身份执行命令。
visudo专门用于编辑/etc/sudoers文件的命令,需要将指定用户添加进去才可以使用sudo命令,如:test ALL=(ALL:ALL) ALL;使用sudo update-alternatives --config editor可以修改系统默认编辑器(nano)
groupadd新建用户组
groupdel删除用户组
gpasswd向指定组添加/删除指定的用户,如:gpasswd -a/-d user group
groups查看指定用户的组信息
chsh修改指定用户的shell解析器,如:sudo chsh test -s /usr/sbin/nologin (禁止登陆)
chown修改文件所属用户[及用户组],如: sudo chown test[:test] 1.py,递归操作需要加'-R'选项
chgrp修改文件所属用户组,如:sudo chgrp test 1.py
  • 涉及文件

    • /etc/passwd:系统中的用户信息

      chris:x:1000:1000:ubuntu,,,:/home/chris:/bin/bash
      Copy

      (1)chris:注册名(login_name),用于区分不同的用户。

      (2)x: 口令,系统用口令来验证用户的合法性。现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将/etc /shadow作为真正的口令文件,用于保存包括个人口令在内的数据。

      (3)1000:用户标识号(UID),是Linux系统中惟一的用户标识,用于区别不同的用户。

      (4)1000:组标识号(GID),具有相似属性的多个用户可以被分配到同一个组内,每个组都有自己的组名,且以自己的组标 识号相区分。

      (5)ubuntu:用户名(user_name):包含有关用户的一些信息,如用户的真实姓名、办公室地址、联系电话等。在Linux系统中,mail和finger等程序利用这些信息来标识系统的用户。

      (6)/home/chris:用户主目录(home_directory),该字段定义了个人用户的主目录,当用户登录后,他的Shell将把该目录作为用户的工作目录。

      (7)/bin/bash:命令解释程序(Shell)。

    • /etc/group:系统中的用户组信息。

      sudo:x:27:chris
      Copy
    • /etc/shadow:系统中的用户密码信息。

      root:$6$bb0OYU0t$jBtwXTLHRyDy3A/haZXB.SuKc2T5l3vKAv6LFShByiGWjzoUDGc690NXGETvoputySptRks2pe7e5OOjuuIyB1:17942:0:99999:7:::
      man:*:17379:0:99999:7:::
      chris:$1$EWDqAcYp$fE1hc1kwTtEKgtIgIdLwe0:17940:0:99999:7:::
      test:!:17942:0:99999:7:::
      Copy
      1. 账户名:账户名与/etc/passwd里面的账户名是一一对应的关系。
      2. 密码:空表示密码为空,不需要输入密码即登录;星号代表帐号被锁定;单叹号表示未设置密码;双叹号表示这个密码已经过期了;$1$ 表明是用MD5加密的;$2$ 是用Blowfish加密的;$5$是用 SHA-256加密的;以$6$开头的,表明是用SHA-512加密的。
      3. 修改日期:这个是表明上一次修改密码的日期与1970-1-1相距的天数
      4. 密码不可改的天数:假如这个数字是8,则8天内不可改密码,如果是0,则随时可以改。
      5. 密码需要修改的期限:如果是99999则永远不用改。如果是其其他数字比如12345,那么必须在距离1970-1-1的12345天内修改密码,否则密码失效。
      6. 修改期限前N天发出警告。
      7. 密码过期的宽限:假设这个数字被设定为M,那么帐号过期的M天内修改密码是可以修改的,改了之后账户可以继续使用。
      8. 帐号失效日期:假设这个日期为X,与第三条一样,X表示的日期依然是1970-1-1相距的天数,过了X之后,帐号失效。
      9. 保留:被保留项,暂时还没有被用上。
  • 相关名词

    • uid:用户唯一标识
    • gid:用户组唯一标识

7.权限管理

权限管理

  • 说明:在linux下,所有的文件都涉及权限,分为三组:所有者、所属组、其他

  • 权限:所有文件的权限可以分为:可读(r)、可写(w)、可执行(x),'-'表示没有改权限

  • 原理:ls -l的结果,三位一组,分为三组,刚好对应:所有者、所属组、其他

  • 修改权限:chmod,格式:chmod [身份] [操作] [权限] 文件

选项说明
身份
u所有者(user)
g所属组(group)
o其他(other)
a所有(all)
操作
+添加
-去掉
=设置
权限
r可读
w可写
x可执行

sudo chmod o+w 1.py,给其他用户添加可写的权限

  • 本质:使用一组(3位)八进制的数据来表示权限,如:0755,展开如下:

    转换为二进制:0755 => 111 101 101
    对应三组身份:     所有者 所属组 其他
    每一组的权限:都包括 可读、可写、可执行
    示例解析:所有者可读可写可执行,所属组可读可执行,其他可读可执行
    Copy
  • 简化操作:sudo chmod 0755 1.py

    若要进行递归操作,则需要添加'-R'操作

  • umask

    作用:用来限定新建文件的默认权限,权限与该值相反。
    命令:umask [value],查看或设置掩码
    分析:
        掩码:0002 => 000 000 010
        新建目录:     111 111 101
        新建文件:     110 110 100

8.压缩解压命令

压缩解压命令

  • zip/unzip,文件后缀名为zip

    压缩: 
        zip 123.zip *.txt   # 将所有的txt文件压缩成123.zip文件
        zip -r test.zip test # 将test文件夹打包成test.zip
    解压: unzip 123.zip
    Copy
  • gzip/gunzip,文件后缀名为gz

    压缩:  
        gzip 1.txt   # 将1.txt压缩成1.txt.gz
        gzip -r test # 将test文件夹里的每一个文件都打包成 .gz文件
    解压: 
        gunzip 1.txt.gz
        gzip -d 1.txt.gz
    Copy
  • bzip2/bunzip2,文件后缀名是bz2.

    压缩:  bzip2 1.txt # 将1.txt压缩成1.txt.bz2
    解压:
        bunzip2 1.txt.bz2
        bzip2 -d 1.txt.bz2
        bzip2 -dk 1.txt.bz2 # 解压1.txt.bz2文件,并且保留1.txt.bz2这个文件
    Copy

    注意: 无论是gzip,还是bzip2,都无法很方便的压缩和解压文件夹。

  • tar,打包解包工具,后缀名是tar.

    选项:
        -c:创建新的打包文件
        -x: 解包。
        -t: 不解包查看文件。
        注意:以上三个选项不能同时使用,因为功能冲突。
        -v: 显示详细信息。
        -f: 指定操作文件。
        -z: 调用gzip/gunzip进行压缩解压操作,后缀名是.tar.gz
        -j: 调用bzip2/bunzip2进行压缩解压操作,后缀名是.tar.bz2
    示例:
        tar -cvf test.tar test # 将test文件夹打包成test.jar文件,并显示打包信息
        tar -cvf 123.tar 1.txt 2.txt 3.txt # 将1.txt,2.txt和3.txt文件打包到123.tar文件
        tar -tf 123.tar   # 不解包查看123.tar文件里的内容
        tar -xvf 123.tar  # 解包123.tar文件,并显示详细信息
    
        tar -zcvf 12.tar.gz 1.txt 2.txt # 将1.txt和2.txt压缩并打包成12.tar.gz文件
        tar -jcvf 12.tar.bz2 1.txt 2.txt # 将1.txt和2.txt压缩并打包成12.tar.bz2文件
    
        tar -zxvf 12.tar.gz   # 解压并解包12.tar.gz文件
        tar -jxvf 12.tar.bz2  # 解压并解包12.tar.bz2文件。
    Copy

    注意:tar 只是用来打包和解包的工具,它本身是没有压缩和解压缩的功能。但是,通过添加参数,可以调用gzip或者bzip2进行压缩解压操作。

    • tar -z: 使用 gzip方式打包并压缩文件,后缀名为 .tar.gz,可以简写为 .tgz

    • tar -j: 使用 bzip2 方式打包并压缩文件,后缀名为 .tar.bzip2,可以简写为 .tbz2 或 .tbz

9.Nginx的安装和配置

Nginx的安装和配置

Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。在后续我们学习完Web框架以后,会教大家怎样将一个web应用程序部署到Nginx服务器上,这里我们只对Nginx做一个简单的了解。

使用源码安装软件

我们知道,在Linux平台里,我们可以下载一个rpm文件进行离线安装,也可以使用yum install 在线安装一个指定的软件。其实,除了这两种方式以外,我们还可以使用第三种方式,即源代码的形式安装软件

  • 使用源代码安装软件的基本步骤:
    • 配置:configure
    • 编译:make
    • 安装: make install
  • 执行命令
    • cmd1; cmd2 # 执行完cmd1后,执行cmd2,无论cmd1指令是否执行成功
    • cmd1 || cmd2 # 先执行cmd1,cmd1执行失败以后才会执行cmd2
    • cmd1 && cmd2 # 先执行cdm1,cmd1执行成功以后,才会执行cmd2

使用源码安装Nginx

  1. 使用wget命令下载Nginx源码,下载地址: http://nginx.org/download/nginx-1.16.0.tar.gz

  2. 解压软件压缩包: tar -zxvf nginx-1.16.0.tar.gz

  3. 编译前执行配置文件: ./configure

    • —prefix:用来配置Nginx服务器的安装目录
    • 配置出错多数是因为缺少相关的依赖库或者编译器
    • 需要安装相关的依赖。sudo yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

    • 运行 make && make install 命令来编译并安装软件

  4. Nginx介绍

    • 进入到/usr/local/nginx/sbin 安装目录,使用 ./nginx 命令启动nginx
    • html:默认站点目录
    • 测试:在浏览器中输入localhost,看到welcome to nginx即表示成功

10.安装python

安装Python

使用CentOS自带Python2版本,而我们日常开发中使用最多的却是Python3版本。使用CentOS的yum直接安装Python3会报错,因为Python3不在CentOS的默认安装源里。这种情况下,可以使用以下两种方法来安装Python3.

使用EPEL安装

EPEL即Extra Packages for Enterprise Linux的简称,是为企业级Linux提供的一组高质量的额外软件包。在这个额外的安装包里,我们能使用yum命令找到Python3.

  1. 使用 sudo yum install epel-release 命令安装 epel 扩展软件包。
  2. 使用 sudo yum install python3 安装Python3版本。

使用源码安装

除了EPEL额外安装包安装Python3以外,也可以使用源码的形式来安装Pythonp3.

  1. 使用wget命令下载Python3.7的源文件。

    wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz

  2. 使用tar命令解压下载后的压缩包。tar -zxvf Python3.7.5.tgz

  3. 进入到解压的文件夹,运行./configure命令,生成makefile文件。

  4. 运行 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xzdevel libffi-devel命令安装缺少的模块。

  5. 运行sudo make & sudo make install命令,安装Python.

  6. 运行ln -s /usr/local/bin/python3.7 /usr/bin/python3命令,在 /usr/bin目录下建立Python3.7的软连接。

  7. 运行python3命令可以打开python3.7

11.虚拟环境管理

管理虚拟环境

和其他大多数现代编程语言一样,Python对包和模块的下载、存储以及管理有其自己的一套方法。Python的包一般存在几个地方,使用sys.path可以查看python包和模块的存放路径。

import sys
print(sys.path)
Copy

输出结果:

['', 
 '/usr/lib/python36.zip',
 '/usr/lib/python3.6',
 '/usr/lib/python3.6/lib-dynload',
 '/usr/local/lib/python3.6/dist-packages',
 '/usr/lib/python3/dist-packages'
]
Copy

这里列出了python里查找包或者模块时的所有可用路径,其中''表示的是当前项目的目录,一般情况下,我们需要关注的是使用pip install指令下载的第三方资源包。这个第三方资源包被存放在了'/usr/local/lib/python3.6/dist-packages'目录下,这里就带来了一个问题,当我们同时开发多个工程时,不同的工程会将第三方的包存放在相同的路径下。这就意味着,如果有两个工程依赖同一个包,但是所需要的版本却不一样,比如工程A依赖v1.0.0,而工程B依赖v2.0.0。由于Python无法根据版本来区分包的安装路径,所以这里就会发生版本冲突。

安装virtualenv

virtualenv 是一个创建隔绝的Python环境的工具。virtualenv创建一个包含所有必要的可执行文件的文件夹,用来使用Python工程所需的包。

sudo pip install virtualenv
Copy

安装完成以后,可以使用命令快速的创建、激活虚拟环境。

cd my_project  # 进入到工程的工作目录
virtualenv test  # 创建虚拟环境,并命名为test.此时会在my_project下多出一个test的文件夹
source test/bin/activate # 激活虚拟环境。此时,如果使用pip install安装的插件,都会被安装到当前虚拟环境
pip install flask  # 测试安装flask. flask会被安装到当前虚拟环境,而不是全局环境
Copy

安装virtualenvwrapper

安装virtualenv以后,已经可以创建和激活虚拟环境了,但是使用起来却不是那么的方便。我们可以在安装一个virtualenvwrapper工具,它可以更加方便的帮我们管理虚拟环境。

sudo pip install virtualenvwrapper
Copy

安装完成以后,在~/.bashrc文件下添加以下内容:

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export WORKON_HOME=~/.envs
source /usr/local/bin/virtualenvwrapper.sh
Copy

保存以后,再执行以下指令:

source ~/.bashrc
Copy

下面我们就可以很方便的管理虚拟环境了。

mkvirtualenv test  # 创建并切换到test虚拟环境
deactivate  # 离开test虚拟环境
rmvirtualenv test # 删除test虚拟环境
workon demo # 切换到demo虚拟环境

12.服务监听

  • netstat:用来监听网络连接状态。

    参数:

    -a 显示所有socket,包括正在监听的。
    -n 以网络IP地址代替名称,显示出网络连接情形。
    -o 显示与与网络计时器相关的信息
    -t 显示TCP协议的连接情况
    -u 显示UDP协议的连接情况
    -p 显示建立相关连接的程序名和PID。
    Copy
  • ps

    • 作用:查看进程信息
    • 使用:
      • ps -ef
      • ps aux
    • 说明:经常在查询进程号的时候结合grep进行过滤
  • pstree

    • 作用:使用树形结构查看进程信息。
  • kill

    • 作用:杀死进程
    • 示例:kill -9 PID
    • 说明:强制杀死指定进程

13.管道和重定向

管道

管道的操作符是 " | ",它只能处理经由前面一个指令传出的正确输出信息,然后传递给下一个命令,作为下一个命令的标准输入。例如ps -ef|more

注意:

  • 管道命令只能处理前一个命令的正确输出,不能处理错误输出。
  • 管道命令的右边命令,必须要能够接收标准的输入流才行。

有些命令无法接受输入流,需要通过xargs来将输入流转换成为命令行参数。

如:find -name 2.txt | xargs rm -rf

重定向

标准输入(stdin)、标准输出(stdout)、标准错误(stderr)

  • 在linux中,创建任意进程,系统会自动创建上面三个数据流,其实就是三个文件

  • 三个文件的描述符分别是:0、1、2.其中,0默认指向键盘,1和2默认指向终端窗口。

  • 重定向就是改变原来默认的表现位置。

  • 演示:

输出重定向:
    ls > 1.txt        # 会新建文件,若文件已存在,会清空
    ls >> 1.txt        # 追加到文件末尾,若文件不存在则创建
错误重定向:
    ls /xxx 2> 1.txt    # 将标准错误重定向到1.txt
同时重定向输出和错误:
    ls /xxx /home &> 1.txt         # 将标准输出和错误同时重定向到1.txt文件

14.Git的使用

Git

git是一个开源的分布式版本控制系统,可以有效、高速地实现从很小到非常大的项目源代码管理。

为什么要进行源代码管理?

  • 方便多人协同开发
  • 方便版本控制

 

svn 和 git 区别

管理方式不一样

1.SVN 是集中式管理.就是版本控制都在服务器上. 缺点 : 万一服务器挂掉了,那么公司的多人协同开发和版本控制受阻

2.git 是分布式管理.服务器和客户端都有版本控制能力,都能进行代码的提交合并。

 

 

表现形式不一样

1.SVN 会在每个文件夹下面创建一个.svn的隐藏文件 项目体积相对git管理的项目要大 冲突相对git管理的项目要多

2.git 只会在根目录下创建一个.git隐藏文件夹 项目体积相对svn管理的项目要小 冲突相对svn管理的项目要少

所用到的地方不一样

  1. svn 公司内部用,一般不会公布出去
  2. git 开源项目用,单人开发常用,公司也使用

SVN和git的使用介绍

SVN使用图解

 

Git使用图解

14.1. git本地和远端管理

在Linux中,如果要使用Git,需要先使用命令对git进行安装。

sudo yum install git
Copy

git的操作可以分为本地操作以及远端服务器操作两种。我们主要学习本地仓库的操作,模拟自己在电脑上建项目,单人开发的代码管理。

 

本地操作

1.创建本地项目文件

/Users/chris/Desktop/lisi
Copy

以下终端命令都是在本地项目所在文件路径下进行的

2.在本地项目文件目录下,创建本地仓库(版本控制)

cd /Users/chris/Desktop/lisi
git init
Copy

3.在项目文件里面创建hello.py文件,用于版本控制演示

4.修改文件之后,查看修改之后和之前的比对

git diff
Copy
* 绿色表示新增,红色表示删除 / 修改
Copy

5.把新建的hello.py文件添加到本地仓库(版本控制)里面

git add .
Copy

6.查看当前版本控制里面的文件状态

git status
Copy
* 红色表示新建文件或者新修改的文件,都在`工作区`.
* 绿色表示文件在`暂存区`
Copy

提示 : 终端命令 git add . 只是把文件从工作区添加到暂存区,此时还没有到本地仓库,要到本地仓库需要 commit .

7.在commit之前,需要设置个人信息。可以添加 --global 参数,给所有的git仓库添加一个统一的配置项。这个配置项保存在 ~/.gitconfig文件里

配置用户名 : git config --global user.name "李四"    (区分责任人)
配置邮箱 : git config --global user.email "lisi@163.com" (方便联系作者)
Copy
也可以给这一个Git仓指定自己的用户名和邮箱。会保存在当前仓库.git/config文件里
Copy
配置用户名 : git config  user.name "lisi"    (区分责任人)
配置邮箱 : git config user.email "ls@126.com" (方便联系作者)
Copy

8.把文件从暂存区提交到本地仓库

git commit -m "操作描述"
Copy

9.把文件从暂存区提交到本地仓库之后,再查看版本控制里面的文件状态

git status
Copy

10.把先由工作区添加到暂存区,再提交到本地仓库合并成一句命令

git commit -am "操作描述"
Copy

11.查看所有的详细的历史版本

git reflog(可以看到被删除和回退过的提交记录)
或者
git log(不能看到已经删除和回退后的提交记录)
Copy

12.回到某个指定的版本

git reset --hard 版本号前6位
Copy

Git远端服务器操作

  1. 复制码云里的项目下载地址,使用git clone 命令将码云里的项目下载到本地。这个过程中,需要输入码云的注册用户名和码云用户密码。注意:只有被添加到项目里的成员和管理者才能下载代码

  2. 代码的提交:当用户在本地操作完数据以后,需要调用git push将修改推送至远端服务器。

     

14.2. 冲突的介绍

冲突的产生

  1. 容易出现冲突的操作方式
    • 多个人同时操作了同一个文件
    • 一个人一直写代码但是不提交
    • 修改代码之前,不更新代码
    • 提交之前,不更新最新代码
    • 擅自修改同事代码
  2. 避免冲突
    • 养成良好的代码习惯,先pull在修改,修改完立即commitpush
    • 一定要确保自己正在修改的文件是最新版本的
    • 分模块开发,各自开发各自的模块
    • 如果要修改公共文件,一定要先确认有没有人正在修改
    • 下班前一定要提交代码,上班第一件事拉取最新代码
    • 一定不要擅自修改同事的代码

14.3. 分支操作

Git分支

  • 分支的作用

    假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。 现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

  • 分支的本质

    Git分支的其实本质仅仅是指向提交对象的可变指针。 Git 的默认分支名字是 master。 在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支。 它会在每次的提交操作中自动向前移动。

    .git/HEAD这个特殊指针来表示当前到底在哪个分支。

  • 创建本地分支

     

  • 分支合并

     14.4. 远端服务器的SSH连接

远端服务器的SSH连接

码云生成部署SSH Key:http://git.mydoc.io/?t=154712

gitHub生成SSH Key:Connecting to GitHub with SSH - GitHub Docs

15. shell编程

Shell编程与运维

一、Shell 脚本概述

通过 Shell 中的各种命令, 开发者和运维人员可以对服务器进行维护工作。

但每次都手动输入命令, 工作效率太低, 而且很容易出错, 尤其是需要维护大量服务器时。

为了能够对服务器批量执行操作, 我们可以将需要执行的命令写入文件, 批量执行, 这种文件便是 Shell 脚本。

Shell 脚本一般是以 .sh 结尾的文本文件, 当然, 也可以省略扩展名。

二、Shell 脚本首行

脚本文件第一行通过注释的方式指明执行脚本的程序。

在 Shell 脚本中, # 开头的文本是注释, 但第一句 #! 开头的这句话比较特殊, 他会告诉 Shell 应该使用哪个程序来执行当前脚本。

常见方式有:

  • #!/bin/sh
  • #!/bin/bash
  • #!/usr/bin/env bash

Python 脚本的第一句一般是 #!/usr/bin/env python

三、第一个脚本

  1. 创建 cpu-count.sh 文件
  2. 将下面文本写入 cpu-count.sh 中

     #!/bin/bash
    
     echo "Hello"
     echo "I am `whoami`"
     echo "I love Linux"
     echo "The CPU in my PC has `cat /proc/cpuinfo |grep -c processor` cores"
     exit 0
    Copy
  3. 执行 chmod a+x cpu-count.sh 对脚本授予可执行权限
  4. 输入 ./cpu-count.sh 执行脚本
  5. 查看脚本的退出状态: echo $?

    • Linux 中的所有程序执行结束后都有状态码
    • 状态码为  表示正常, 状态码为 正整数 代表异常退出

四、变量

  1. 定义

    变量的定义与其他语言差距不大, 需要注意的是赋值前后没有空格。

     # 变量定义: 等号前后没有空格
     a=12345
     b=xyz
    Copy
  2. 使用

    使用变量时, 变量名前面加上 $ 符

     echo "---$a---\n===$b==="
     printf "---$a---\n===$b===\n"
    Copy
  3. 注意 引号 的差别

     echo "---$a---\n===$b==="
     echo '---$a---\n===$b==='
    Copy
  1. 定义当前Shell下的全局变量

    1. 定义: export ABC=9876543210123456789
    2. 定义完后, 在终端里用 source 加载脚本: source ./test.sh
  2. 常用的系统环境变量

    • $PATH: 可执行文件目录
    • $PWD: 当前目录
    • $HOME: 家目录
    • $USER: 当前用户名
    • $UID: 当前用户的 uid

五、获取用户输入

read -p "请输入一个数字:" num
echo "您输入的是:$num"
Copy

六、脚本里的引号

在shell里支持三种引号,它们的使用场景以及效果会有差异。

  • 反引号:里面的内容会被解析成为脚本

    echo `ls -a /home/chris`   # 打印 /home/chris目录下的所有文件和文件夹
    Copy
  • 双引号:它里面的大部分内容会别原样显示,但是如果是一个变量,这个变量会被解析。

    name=zhangsan
    echo "大家好,我是$name"  # 大家好,我是zhangsan
    Copy
  • 单引号:它里面的内容会完全原样输出,就算是有变量,也不会被解析。

    name=zhangsan
    echo '大家好,我是$name'  # 大家好,我是$name
    Copy

七、脚本里的$

  • ${var}用来获取一个变量的值,一般情况下,大括号可以省略不写。

    name=zhangsan
    echo ${name}  # zhangsan
    echo $name  # zhangsan
    Copy
  • 特殊变量

    $# 代表传入参数的个数
    $@ 代表传入参数的列表
    $0 代表脚本本身
    $1 代表传入的第一个参数,$2,$3...以此类推
    $* 以字符串方式显示所有传入的参数
    $$ 脚本运行的进程ID
    $? 显示最后命令的退出状况,0表示没有错误
    Copy
  • $(cmd)用来执行括号里的脚本命令,相当于使用反引号。

    echo $(ls /home/chris/Desktop)  # 列出当前用户的桌面上的所有文件和文件夹
    Copy
  • $((expression))用来计算数学表达式expression的值。

    echo $((1+1))  # 2
    Copy

八、分支语句: if

分支控制语句完整格式为:

if command;then
    commands
elif command;then
    commands
else
    commands
fi
Copy
  1. if 语句检查判断的依据实际上是, 后面所跟的命令的状态码: 0 为 true, 其他值 为 false

     if ls /xxx;then
         echo 'exist xxx'
     else
         echo 'not exist xxx'
     fi
    Copy
  2. 条件测试命令: [ ... ]

    • shell 提供了一种专用做条件测试的语句 [ ... ]
    • 这一对方括号本质上是一个命令, 里面的条件是其参数, 所以 [ 的后面和 ] 的前面必须有空格, 否则会报错。
    • 他可以进行三种比较
      • 数值比较
      • 字符串比较
      • 文件比较
    • 用法:

        if [ condition ];then
            commands
        fi
      Copy
  3. 条件列表

    • 数值比较

      Condition说明
      n1 -eq n2检查n1是否与n2相等
      n1 -ge n2检查n1是否大于或等于n2
      n1 -gt n2检查n1是否大于n2
      n1 -le n2检查n1是否小于n2
      n1 -lt n2检查n1是否小于n2
      n1 -ne n2检查n1是否不等于n2
    • 字符串比较

      Condition说明
      str1 = str2检查str1是否和str2相同(注意:等号两边要加空格)
      str1!=str2检查str1是否和str2不同
      str1<str2检查str1是否小于str2(需要使用[[]])
      str1>str2检查str1是否大于str2(需要使用[[]])
      -n str1检查str1的长度是否非0(变量需要添加双引号)
      -z str1检查str1的长度是否为0
    • 文件比较

      Condition说明
      -d file检查file是否存在并且是一个目录
      -e file检查file是否存在
      -f file检查file是否存在并且是一个文件
      -r file检查file是否存在并且可读
      -w file检查file是否存在并且可写
      -x file检查file是否存在并且可执行
      -s file检查file是否存在并且非空
      -O file检查file是否存在并且属于当前用户所有
      -G file检查file是否存在并且所属组与当前用户相同
      file1 -nt file2检查file1是否比file2新
      file1 -ot file2检查file1是否比file2旧

九、case语句

case  "$var" in
         exp1)
         command1
         ;;
         exp2)
         command2
         ;;
         exp3)
         command3
         ;;
         *)
         comman4
         ;;
esac
Copy

示例:

#!/bin/bash
read -p "请输入数字" num
case $num in
    0)
        echo 星期日
        ;;
    1)
        echo 星期一
        ;;
    2)
        echo 星期二
        ;;
    3)
        echo 星期三
        ;;
    4)
        echo 星期四
        ;;
    5)
        echo 星期五
        ;;
    6)
        echo 星期六
        ;;
    *)
        echo 其他
        ;;
esac
Copy

十、循环语句: for

Shell 中的循环结构有三种: forwhile 和 until, 这里重点介绍 for 循环。

  1. for 循环的基本格式:

     for 变量 in 序列
     do
         要执行的命令
     done
    Copy
  2. 练习: 打印 1 到 10 中的偶数

     for i in `seq 1 10`
     do
         if [ $[ $i % 2] == 0 ]
         then
             echo "偶数: $i"
         else
             echo "奇数: $i"
         fi
     done
    Copy
    1. seq START END 语句用来产生一个数字序列
    2. $[ NUM1 + NUM2 ] 语句用来进行基本的数学运算
    3. [[ ... ]] 语句用来更方便的进行比较判断
  3. C语言风格的 for 循环

     for ((i=0; i<10; i++))
     do
         echo "num is $i"
     done
    Copy

十一、函数

  1. 函数定义

    定义时 function 不是必须的,可以省略

     function foo() {
         echo "---------------------------"
         echo "Hello $1, nice to meet you!"
         echo "---------------------------"
     }
    Copy
  2. 函数的使用

    • 在终端或脚本中直接输入函数名即可,不需要小括号
    • 传参也只需将参数加到函数名后面,以空格做间隔,像正常使用命令那样

      foo arg1 arg2 arg3 ...
      Copy
  3. 函数的参数

     bar() {
         echo "执行者是 $0"
         echo "参数数量是 $#"
         echo "全部的参数 $@"
         echo "全部的参数 $*"
    
         if [ -d $1 ]; then  # 检查传入的第一个参数是否是文件夹
             for f in `ls $1`
             do
                 echo $f
             done
         elif [ -f $1 ]; then
             echo "This is a file: $1"  # 如果不是文件夹, 直接显示文件名
         else
             echo 'not valid'  # 前面都不匹配显示默认语句
         fi
     }
     bar $1
    Copy

十二、数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。

与大部分编程语言类似,数组元素的下标由0开始。

  • 定义数组:

Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

array_name=(value1 ... valuen)
Copy

示例:

arr=(hello good "yes" a 12)
Copy

同时,也可以直接使用下标来定义一个数组。

nums[0]=1
nums[1]="good"
nums[2]=yes
Copy
  • 获取和修改数组数据

使用下标可以直接修改数组里的数据。

arr=(hello good "yes" a 12)
arr[0] = hi
Copy

使用$和下标可以获取一个数组里的数据,但是注意需要使用{}来包裹变量。

语法格式:

${arr[index]}
Copy

示例:

arr=(hello good "yes" a 12)
echo ${arr[0]}
Copy
  • 获取数组所有数据以及长度

使用*或者@作为下标,可以获取数组里的所有数据。

arr=(hello good "yes" a 12)
echo ${arr[*]}
echo ${arr[@]}
Copy

在获取所有数据的前面添加# 可以获取到数组的长度

arr=(hello good "yes" a 12)
echo ${#arr[*]}
echo ${#arr[@]}
Copy
  • 数组的遍历

    • 使用for循环遍历
    #!/bin/bash
    arr=(hello good 12 'yes' hi)
    for((i=0;iCopy
    • 使用for...in遍历
    #!/bin/bash
    arr=(hello good 12 'yes' hi)
    for ele in ${arr[*]}
    do
        echo $ele
    done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老板来片烤面包

君子博学于文,赠之以礼,谢君~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值