IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux -> 正文阅读

[系统运维]Linux

目录

1.Linux简介

1.1Linux 的发行版

1.2Linux 应用领域

1.3Linux vs Windows

2.Linux内容

3.安装VM和Centos

3.1VMware安装

3.2Centos安装

4.Linux目录结构

4.1基本介绍

4.2以下是对这些目录的解释:

5.Linux远程登陆

5.1为什么要远程登陆Linux

5.2.下载-安装-配置-使用:

5.3远程登录Linux-Xshell6

5.3.2Xshell安装配置和使用

5.4远程上传下载文件-Xftp6

5.4.2Xftp6安装配置和使用

6.Linux中vi和vim编辑器

6.1基本介绍

6.2vi和vim常用的三种模式

6.3vi和vim键盘图

6.4vi/vim 的使用

6.5vi/vim 使用实例

6.6vi/vim 按键说明

6.7补充

7.Linux开机-重启-用户登录注销

7.1关机&重启命令

7.2用户登录和注销

8.Linux用户管理

8.1基本介绍

8.2用户账号的管理

8.3用户密码的管理

8.4Linux系统用户组的管理

8.5、与用户账号有关的系统文件

8.6、添加批量用户

9,Linux实用指令

9.1,指令运行级别

9.2找回root密码

9.3处理目录的常用指令

9.4Linux 查看指令

9.5Linux帮助指令

9.6时间日期类

9.7Linux搜索查找指令

9.8压缩和解压类

10Linux权限

11Linux定时任务调度

12Linux磁盘分区

13Linux网络环境配置

14Linux进程管理

15Linux中RPM与YUM

-----------------------------------------------------

16大数据定制篇-shell编程

16.1Shell 介绍

16.2Shell 脚本

16.3Shell 环境

16.4Shell 脚本有两种方法:

16.5Shell 变量

16.6变量类型

16.7Shell 字符串

16.8Shell 数组

16.9Shell 注释

16.10Shell 传递参数

16.11Shell 数组

16.12Shell 基本运算符

16.13Shell echo命令

16.14Shell printf 命令

16.15Shell test 命令

16.16Shell 流程控制

16.17 Shell 函数

16.18 Shell 输入/输出重定向


1.Linux简介

Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。

Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。

Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。


1.1Linux 的发行版

Linux 的发行版说简单点就是将 Linux 内核与应用软件做一个打包。

目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。

img


1.2Linux 应用领域

今天各种场合都有使用各种 Linux 发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,通常服务器使用 LAMP(Linux + Apache + MySQL + PHP)或 LNMP(Linux + Nginx+ MySQL + PHP)组合。

目前 Linux 不仅在家庭与企业中使用,并且在政府中也很受欢迎。

  • 巴西联邦政府由于支持 Linux 而世界闻名。

  • 有新闻报道俄罗斯军队自己制造的 Linux 发布版的,做为 G.H.ost 项目已经取得成果。

  • 印度的 Kerala 联邦计划在向全联邦的高中推广使用 Linux。

  • 中华人民共和国为取得技术独立,在龙芯处理器中排他性地使用 Linux。

  • 在西班牙的一些地区开发了自己的 Linux 发布版,并且在政府与教育领域广泛使用,如 Extremadura 地区的 gnuLinEx 和 Andalusia 地区的 Guadalinex。

  • 葡萄牙同样使用自己的 Linux 发布版 Caixa Mágica,用于 Magalh?es 笔记本电脑和 e-escola 政府软件。

  • 法国和德国同样开始逐步采用 Linux。


1.3Linux vs Windows

目前国内 Linux 更多的是应用于服务器上,而桌面操作系统更多使用的是 Windows。主要区别如下

比较WindowsLinux
界面界面统一,外壳程序固定所有 Windows 程序菜单几乎一致,快捷键也几乎相同图形界面风格依发布版不同而不同,可能互不兼容。GNU/Linux 的终端机是从 UNIX 传承下来,基本命令和操作方法也几乎一致。
驱动程序驱动程序丰富,版本更新频繁。默认安装程序里面一般包含有该版本发布时流行的硬件驱动程序,之后所出的新硬件驱动依赖于硬件厂商提供。对于一些老硬件,如果没有了原配的驱动有时很难支持。另外,有时硬件厂商未提供所需版本的 Windows 下的驱动,也会比较头痛。由志愿者开发,由 Linux 核心开发小组发布,很多硬件厂商基于版权考虑并未提供驱动程序,尽管多数无需手动安装,但是涉及安装则相对复杂,使得新用户面对驱动程序问题(是否存在和安装方法)会一筹莫展。但是在开源开发模式下,许多老硬件尽管在Windows下很难支持的也容易找到驱动。HP、Intel、AMD 等硬件厂商逐步不同程度支持开源驱动,问题正在得到缓解。
使用使用比较简单,容易入门。图形化界面对没有计算机背景知识的用户使用十分有利。图形界面使用简单,容易入门。文字界面,需要学习才能掌握。
学习系统构造复杂、变化频繁,且知识、技能淘汰快,深入学习困难。系统构造简单、稳定,且知识、技能传承性好,深入学习相对容易。
软件每一种特定功能可能都需要商业软件的支持,需要购买相应的授权。大部分软件都可以自由获取,同样功能的软件选择较少。

2.Linux内容

Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中最著名的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用 GNU 工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者Linus Torvalds。 一般可以认为,Linux是一套自由使用(一般可以免费使用)和自由传播的类Unix操作系统。这个系统是由世界各地成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约、全世界都能自由使用的Unix兼容产品。实际上,linux仅仅是linux操作系统中的核心(kernel)。

3.安装VM和Centos

3.1VMware安装

[VM虚拟机安装]??https://www.jb51.net/softjc/745263.html?

3.2Centos安装

[Centos安装]??https://www.jianshu.com/p/78445bc6bd85?

4.Linux目录结构

4.1基本介绍

1)Linux的文件系统是采用层级式的树状目录结构,在结构中的最上层是根目录“/”,然后再此目录下再创建其他的目录。

2)经典名言:在Linux世界中,一切皆文件(!!).

3)Linux 系统目录结构:

登录系统后,在当前命令窗口下输入命令:

 ls / 

4.2以下是对这些目录的解释:

  • /bin: bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。

  • /boot: 这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。

  • /dev : dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。

  • /etc: etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。

  • /home: 用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。

  • /lib: lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。

  • /lost+found: 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。

  • /media: linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。

  • /mnt: 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。

  • /opt: opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。

  • /proc: proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。 这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:

    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

  • /root: 该目录为系统管理员,也称作超级权限者的用户主目录。

  • /sbin: s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。

  • /selinux: 这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。

  • /srv: 该目录存放一些服务启动之后需要提取的数据。

  • /sys

    这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。

    sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。

    该文件系统是内核设备树的一个直观反映。

    当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。

  • /tmp: tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。

  • /usr: usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。

  • /usr/bin: 系统用户使用的应用程序。

  • /usr/sbin: 超级用户使用的比较高级的管理程序和系统守护程序。

  • /usr/src: 内核源代码默认的放置目录。

  • /var: var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。

  • /run: 是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。

在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。

/etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。

/bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在 /bin/ls 目录下的。

值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给 root 使用的指令。

/var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下,具体在 /var/log 目录下,另外 mail 的预设放置也是在这里

5.Linux远程登陆

5.1为什么要远程登陆Linux

  1. Linux服务器是开发小组共享的

  2. 正式上线的项目是运行在公网上的

  3. 因此程序员需要远程登陆到Linux进行项目管理或开发

  4. 远程登陆客户端有Xshell6,Xftp6,其他的工具大同小异

5.2.下载-安装-配置-使用:

下载 free-for-home-school版本

地址:Free for Home/School - Xshell and Xftp Free Licensing

5.3远程登录Linux-Xshell6

5.3.1介绍

  1. 说明:Xshell是目前最好的远程登录到Linux操作的软件,速度流畅且解决中文乱码。

  2. Xshell是一个强大的安全终端模拟软件。

  3. Xshell可以在Windows界面下用来访问不同系统下的服务器,从而比较好的达到远程控制终端的目的。

5.3.2Xshell安装配置和使用

[Xshell安装] ?https://jingyan.baidu.com/article/7908e85cd7f3feaf491ad256.html?

Xshell安装步骤

5.4远程上传下载文件-Xftp6

5.4.1介绍

是一个基于Windows平台的功能强大的SFTP,FTP文件传输软件。使用了Xftp以后,Windows用户能安全地在Linux和WindowsPC之间传输文件。

5.4.2Xftp6安装配置和使用

[Xftp安装]??

https://jingyan.baidu.com/article/22fe7ced9dd2ea3002617f89.html?

6.Linux中vi和vim编辑器

6.1基本介绍

Linux系统会内置vi文本编辑器

vim具有程序编辑的功能,可以主动的以字体颜色色辨别语法的正确性,方便程序设计。代码补全。

6.2vi和vim常用的三种模式

6.2.1正常模式

以vim打开一个档案就直接进入一般模式了。在这个模式中,你可以使用【上下左右】按键来移动光标,你可以使用【删除字符】或【删除整行】来处理文档内容,也可以使用【复制,粘贴】来处理数据。

6.2.2插入模式

按下i,I,o,O,a,A,r,R等字母之后才会进入编辑模式,一般来说按i即可。

6.2.3命令行模式

输入Esc在输入:在这个模式当中,可以提供你相关的指令,完成读取,存盘,替换,离开vim,显示符号等。

6.3vi和vim键盘图

Vim是从 vi 发展出来的一个文本编辑器。代码补完、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。

简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具。

连 vim 的官方网站 (http://www.vim.org) 自己也说 vim 是一个程序开发工具而不是文字处理软件。


6.4vi/vim 的使用

基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode)输入模式(Insert mode)底线命令模式(Last line mode)。 这三种模式的作用分别是:

6.4.1命令模式:

用户刚刚启动 vi/vim,便进入了命令模式。

此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。

以下是常用的几个命令:

  • i 切换到输入模式,以输入字符。

  • x 删除当前光标所在处的字符。

  • : 切换到底线命令模式,以在最底一行输入命令。

若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。

命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。

6.4.2输入模式

在命令模式下按下i就进入了输入模式。

在输入模式中,可以使用以下按键:

  • 字符按键以及Shift组合,输入字符

  • ENTER,回车键,换行

  • BACK SPACE,退格键,删除光标前一个字符

  • DEL,删除键,删除光标后一个字符

  • 方向键,在文本中移动光标

  • HOME/END,移动光标到行首/行尾

  • Page Up/Page Down,上/下翻页

  • Insert,切换光标为输入/替换模式,光标将变成竖线/下划线

  • ESC,退出输入模式,切换到命令模式

6.4.3底线命令模式

在命令模式下按下:(英文冒号)就进入了底线命令模式。

底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。

在底线命令模式中,基本的命令有(已经省略了冒号):

  • q 退出程序

  • w 保存文件

按ESC键可随时退出底线命令模式。

6.5vi/vim 使用实例

6.5.1使用 vi/vim 进入一般模式

如果你想要使用 vi 来建立一个名为 runoob.txt 的文件时,你可以这样做:

 vim runoob.txt

直接输入 vi 文件名 就能够进入 vi 的一般模式了。请注意,记得 vi 后面一定要加文件名,不管该文件存在与否!

6.5.2按下 i 进入输入模式(也称为编辑模式),开始编辑文字

在一般模式之中,只要按下 i, o, a 等字符就可以进入输入模式了!

在编辑模式当中,你可以发现在左下角状态栏中会出现 –INSERT- 的字样,那就是可以输入任意字符的提示。

这个时候,键盘上除了 Esc 这个按键之外,其他的按键都可以视作为一般的输入按钮了,所以你可以进行任何的编辑。

按下 ESC 按钮回到一般模式

好了,假设我已经按照上面的样式给他编辑完毕了,那么应该要如何退出呢?是的!没错!就是给他按下 Esc 这个按钮即可!马上你就会发现画面左下角的 – INSERT – 不见了!

6.5.3在一般模式中按下 :wq 储存后离开 vi

OK,我们要存档了,存盘并离开的指令很简单,输入 :wq 即可保存离开!

这样我们就成功创建了一个 runoob.txt 的文件。


6.6vi/vim 按键说明

除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用。

6.6.1:一般模式可用的光标移动、复制粘贴、搜索替换等

移动光标的方法
h 或 向左箭头键(←)光标向左移动一个字符
j 或 向下箭头键(↓)光标向下移动一个字符
k 或 向上箭头键(↑)光标向上移动一个字符
l 或 向右箭头键(→)光标向右移动一个字符
如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 "30j" 或 "30↓" 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可!
[Ctrl] + [f]屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)
[Ctrl] + [b]屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)
[Ctrl] + [d]屏幕『向下』移动半页
[Ctrl] + [u]屏幕『向上』移动半页
+光标移动到非空格符的下一行
-光标移动到非空格符的上一行
n<space>那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20<space> 则光标会向后面移动 20 个字符距离。
0 或功能键[Home]这是数字『 0 』:移动到这一行的最前面字符处 (常用)
$ 或功能键[End]移动到这一行的最后面字符处(常用)
H光标移动到这个屏幕的最上方那一行的第一个字符
M光标移动到这个屏幕的中央那一行的第一个字符
L光标移动到这个屏幕的最下方那一行的第一个字符
G移动到这个档案的最后一行(常用)
nGn 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)
gg移动到这个档案的第一行,相当于 1G 啊! (常用)
n<Enter>n 为数字。光标向下移动 n 行(常用)
搜索替换
/word向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用)
?word向光标之上寻找一个字符串名称为 word 的字符串。
n这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!
N这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。
使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词!
:n1,n2s/word1/word2/gn1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则: 『:100,200s/vbird/VBIRD/g』。(常用)
:1,$s/word1/word2/g:%s/word1/word2/g从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用)
:1,$s/word1/word2/gc:%s/word1/word2/gc从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)
删除、复制与贴上
x, X在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
nxn 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd删除游标所在的那一整行(常用)
nddn 为数字。删除光标所在的向下 n 行,例如 20dd 则是删除 20 行 (常用)
d1G删除光标所在到第一行的所有数据
dG删除光标所在到最后一行的所有数据
d$删除游标所在处,到该行的最后一个字符
d0那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
yy复制游标所在的那一行(常用)
nyyn 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用)
y1G复制游标所在行到第一行的所有数据
yG复制游标所在行到最后一行的所有数据
y0复制光标所在的那个字符到该行行首的所有数据
y$复制光标所在的那个字符到该行行尾的所有数据
p, Pp 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)
J将光标所在行与下一行的数据结合成同一行
c重复删除多个数据,例如向下删除 10 行,[ 10cj ]
u复原前一个动作。(常用)
[Ctrl]+r重做上一个动作。(常用)
这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦!
.不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用)

6.6.2:一般模式切换到编辑模式的可用的按钮说明

进入输入或取代的编辑模式
i, I进入输入模式(Insert mode): i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 (常用)
a, A进入输入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用)
o, O进入输入模式(Insert mode): 这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一行; O 为在目前光标所在的上一行处输入新的一行!(常用)
r, R进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用)
上面这些按键中,在 vi 画面的左下角处会出现『--INSERT--』或『--REPLACE--』的字样。 由名称就知道该动作了吧!!特别注意的是,我们上面也提过了,你想要在档案里面输入字符时, 一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔!
[Esc]退出编辑模式,回到一般模式中(常用)

6.6.3:一般模式切换到指令行模式的可用的按钮说明

指令行的储存、离开等指令
:w将编辑的数据写入硬盘档案中(常用)
:w!若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!
:q离开 vi (常用)
:q!若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~
:wq储存后离开,若为 :wq! 则为强制储存后离开 (常用)
ZZ这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出)
ZQ不保存,强制退出。效果等同于 :q!
:w [filename]将编辑的数据储存成另一个档案(类似另存新档)
:r [filename]在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面
:n1,n2 w [filename]将 n1 到 n2 的内容储存成 filename 这个档案。
:! command暂时离开 vi 到指令行模式下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息!
vim 环境的变更
:set nu显示行号,设定之后,会在每一行的前缀显示该行的行号
:set nonu与 set nu 相反,为取消行号!

特别注意,在 vi/vim 中,数字是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到第几个什么什么的意思。

举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前,如我要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。

6.7补充

vim中批量添加注释

方法一 :块选择模式

批量注释:

Ctrl + v 进入块选择模式,然后移动光标选中你要注释的行,再按大写的 I 进入行首插入模式输入注释符号如 //#,输入完毕之后,按两下 ESCVim 会自动将你选中的所有行首都加上注释,保存退出完成注释。

取消注释:

Ctrl + v 进入块选择模式,选中你要删除的行首的注释符号,注意 // 要选中两个,选好之后按 d 即可删除注释,ESC 保存退出。

方法二: 替换命令

批量注释。

使用下面命令在指定的行首添加注释。

使用名命令格式: :起始行号,结束行号s/^/注释符/g(注意冒号)。

取消注释:

使用名命令格式: :起始行号,结束行号s/^注释符//g(注意冒号)。

例子:

1、在 10 - 20 行添加 // 注释

:10,20s#^#//#g

2、在 10 - 20 行删除 // 注释

:10,20s#^//##g

3、在 10 - 20 行添加 # 注释

:10,20s/^/#/g

4、在 10 - 20 行删除 # 注释

:10,20s/#//g

7.Linux开机-重启-用户登录注销

7.1关机&重启命令

7.1.1基本介绍

  • shutdown -h now 立刻进行关机

  • shutdown -h 1 "1分钟后自动关机"

  • shutdown -r now 现在重启计算机

  • halt 关机,作用和上面一样

  • reboot 现在重启计算机

  • sync 把内存的数据同步到磁盘

7.1.2注意细节

  • 不管是重启还是关闭系统,首先要运行sync命令,把内存中的数据写入到磁盘中

  • 目前的shutdown/reboot/halt 等命令均已经在关机前进行了sync

7.2用户登录和注销

7.2.1基本介绍

  1. 登录时尽量少用root账号登录,因为她是系统管理员,最大的权限,避免操作失误。可以用普通用户登录,登录后再用 “su-用户名”命令来切换成系统管理员身份。

  2. 在提示符下输入 logout 即可注销用户

####

8.Linux用户管理

8.1基本介绍

Linux系统是一个多用户多任务的操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后用这个账号进入系统。

8.2用户账号的管理

8.2.1添加用户,其语法如下:

useradd 选项 用户名
参数说明:
  • 选项:

    • -c comment 指定一段注释性描述。

    • -d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。

    • -g 用户组 指定用户所属的用户组。

    • -G 用户组,用户组 指定用户所属的附加组。

    • -s Shell文件 指定用户的登录Shell。

    • -u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。

  • 用户名:

    指定新账号的登录名。

实例1

 useradd –d  /home/sam -m sam

此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录 /home/sam(/home为默认的用户主目录所在的父目录)。

实例2

 useradd -s /bin/sh -g group –G adm,root gem

此命令新建了一个用户gem,该用户的登录Shell是 /bin/sh,它属于group用户组,同时又属于adm和root用户组,其中group用户组是其主组。

这里可能新建组:#groupadd group及groupadd adm

增加用户账号就是在/etc/passwd文件中为新用户增加一条记录,同时更新其他系统文件如/etc/shadow, /etc/group等。

Linux提供了集成的系统管理工具userconf,它可以用来对用户账号进行统一管理。

8.2.2删除帐号

如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统文件中的该用户记录删除,必要时还删除用户的主目录。

删除一个已有的用户账号使用userdel命令,其格式如下:

userdel 选项 用户名

常用的选项是 -r,它的作用是把用户的主目录一起删除。

例如:

userdel -r sam

此命令删除用户sam在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。

8.2.3修改帐号

修改用户账号就是根据实际情况更改用户的有关属性,如用户号、主目录、用户组、登录Shell等。

修改已有用户的信息使用usermod命令,其格式如下:

usermod 选项 用户名

常用的选项包括-c, -d, -m, -g, -G, -s, -u以及-o等,这些选项的意义与useradd命令中的选项一样,可以为用户指定新的资源值。

另外,有些系统可以使用选项:

-l 新用户名

这个选项指定一个新的账号,即将原来的用户名改为新的用户名。

例如:

usermod -s /bin/ksh -d /home/z –g developer sam

此命令将用户sam的登录Shell修改为ksh,主目录改为/home/z,用户组改为developer。

8.3用户密码的管理

用户管理的一项重要内容是用户密码的管理。用户账号刚创建时没有密码,但是被系统锁定,无法使用,必须为其指定密码后才可以使用,即使是指定空密码。

指定和修改用户密码的Shell命令是passwd。超级用户可以为自己和其他用户指定密码,普通用户只能用它修改自己的密码。命令的格式为:

passwd 选项 用户名

可使用的选项:

  • -l 锁定密码,即禁用账号。

  • -u 密码解锁。

  • -d 使账号无密码。

  • -f 强迫用户下次登录时修改密码。

如果默认用户名,则修改当前用户的密码。

例如,假设当前用户是sam,则下面的命令修改该用户自己的密码:

$ passwd 
Old password:****** 
New password:******* 
Re-enter new password:*******

如果是超级用户,可以用下列形式指定任何用户的密码:

# passwd sam 
New password:******* 
Re-enter new password:*******

普通用户修改自己的密码时,passwd命令会先询问原密码,验证后再要求用户输入两遍新密码,如果两次输入的密码一致,则将这个密码指定给用户;而超级用户为用户指定密码时,就不需要知道原密码。

为用户指定空密码时,执行下列形式的命令:

 passwd -d sam

此命令将用户 sam 的密码删除,这样用户 sam 下一次登录时,系统就不再允许该用户登录了。

passwd 命令还可以用 -l(lock) 选项锁定某一用户,使其不能登录,例如:

 passwd -l sam

8.4Linux系统用户组的管理

每个用户都有一个用户组,系统可以对一个用户组中的所有用户进行集中管理。不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。

用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

8.4.1、增加一个新的用户组使用groupadd命令。其格式如下:

groupadd 选项 用户组

可以使用的选项有:

  • -g GID 指定新用户组的组标识号(GID)。

  • -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。

实例1:

groupadd group1

此命令向系统中增加了一个新组group1,新组的组标识号是在当前已有的最大组标识号的基础上加1。

实例2:

groupadd -g 101 group2

此命令向系统中增加了一个新组group2,同时指定新组的组标识号是101。

8.4.2、如果要删除一个已有的用户组,使用groupdel命令,其格式如下:

groupdel 用户组

例如:

groupdel group1

此命令从系统中删除组group1。

8.4.3、修改用户组的属性使用groupmod命令。其语法如下:

groupmod 选项 用户组

常用的选项有:

  • -g GID 为用户组指定新的组标识号。

  • -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。

  • -n新用户组 将用户组的名字改为新名字

实例1:

groupmod -g 102 group2

此命令将组group2的组标识号修改为102。

实例2:

groupmod –g 10000 -n group3 group2

此命令将组group2的标识号改为10000,组名修改为group3。

8.4.4、如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。

用户可以在登录后,使用命令newgrp切换到其他用户组,这个命令的参数就是目的用户组。例如:

newgrp root

这条命令将当前用户切换到root用户组,前提条件是root用户组确实是该用户的主组或附加组。类似于用户账号的管理,用户组的管理也可以通过集成的系统管理工具来完成。


8.5、与用户账号有关的系统文件

完成用户管理的工作有许多种方法,但是每一种方法实际上都是对有关的系统文件进行修改。

与用户和用户组相关的信息都存放在一些系统文件中,这些文件包括/etc/passwd, /etc/shadow, /etc/group等。

下面分别介绍这些文件的内容。

8.5.1、/etc/passwd文件是用户管理工作涉及的最重要的一个文件。

Linux系统中的每个用户都在/etc/passwd文件中有一个对应的记录行,它记录了这个用户的一些基本属性。

这个文件对所有用户都是可读的。它的内容类似下面的例子:

# cat /etc/passwd
?
root:x:0:0:Superuser:/:
daemon:x:1:1:System daemons:/etc:
bin:x:2:2:Owner of system commands:/bin:
sys:x:3:3:Owner of system files:/usr/sys:
adm:x:4:4:System accounting:/usr/adm:
uucp:x:5:5:UUCP administrator:/usr/lib/uucp:
auth:x:7:21:Authentication administrator:/tcb/files/auth:
cron:x:9:16:Cron daemon:/usr/spool/cron:
listen:x:37:4:Network daemon:/usr/net/nls:
lp:x:71:18:Printer administrator:/usr/spool/lp:
sam:x:200:50:Sam san:/home/sam:/bin/sh

从上面的例子我们可以看到,/etc/passwd中一行记录对应着一个用户,每行记录又被冒号(:)分隔为7个字段,其格式和具体含义如下:

用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

1)"用户名"是代表用户账号的字符串。

通常长度不超过8个字符,并且由大小写字母和/或数字组成。登录名中不能有冒号(:),因为冒号在这里是分隔符。

为了兼容起见,登录名中最好不要包含点字符(.),并且不使用连字符(-)和加号(+)打头。

2)“密码”一些系统中,存放着加密后的用户密码字节。

虽然这个字段存放的只是用户密码的加密串,不是明文,但是由于/etc/passwd文件对所有用户都可读,所以这仍是一个安全隐患。因此,现在许多Linux 系统(如SVR4)都使用了shadow技术,把真正的加密后的用户密码字节存放到/etc/shadow文件中,而在/etc/passwd文件的密码字段中只存放一个特殊的字符,例如“x”或者“*”。

3)“用户标识号”是一个整数,系统内部用它来标识用户。

一般情况下它与用户名是一一对应的。如果几个用户名对应的用户标识号是一样的,系统内部将把它们视为同一个用户,但是它们可以有不同的口令、不同的主目录以及不同的登录Shell等。

通常用户标识号的取值范围是0~65 535。0是超级用户root的标识号,1~99由系统保留,作为管理账号,普通用户的标识号从100开始。在Linux系统中,这个界限是500。

4)“组标识号”字段记录的是用户所属的用户组。

它对应着/etc/group文件中的一条记录。

5)“注释性描述”字段记录着用户的一些个人情况。

例如用户的真实姓名、电话、地址等,这个字段并没有什么实际的用途。在不同的Linux 系统中,这个字段的格式并没有统一。在许多Linux系统中,这个字段存放的是一段任意的注释性描述文字,用做finger命令的输出。

6)“主目录”,也就是用户的起始工作目录。

它是用户在登录到系统之后所处的目录。在大多数系统中,各用户的主目录都被组织在同一个特定的目录下,而用户主目录的名称就是该用户的登录名。各用户对自己的主目录有读、写、执行(搜索)权限,其他用户对此目录的访问权限则根据具体情况设置。

7)用户登录后,要启动一个进程,负责将用户的操作传给内核,这个进程是用户登录到系统后运行的命令解释器或某个特定的程序,即Shell。

Shell是用户与Linux系统之间的接口。Linux的Shell有许多种,每种都有不同的特点。常用的有sh(Bourne Shell), csh(C Shell), ksh(Korn Shell), tcsh(TENEX/TOPS-20 type C Shell), bash(Bourne Again Shell)等。

系统管理员可以根据系统情况和用户习惯为用户指定某个Shell。如果不指定Shell,那么系统使用sh为默认的登录Shell,即这个字段的值为/bin/sh。

用户的登录Shell也可以指定为某个特定的程序(此程序不是一个命令解释器)。

利用这一特点,我们可以限制用户只能运行指定的应用程序,在该应用程序运行结束后,用户就自动退出了系统。有些Linux 系统要求只有那些在系统中登记了的程序才能出现在这个字段中。

8)系统中有一类用户称为伪用户(pseudo users)。

这些用户在/etc/passwd文件中也占有一条记录,但是不能登录,因为它们的登录Shell为空。它们的存在主要是方便系统管理,满足相应的系统进程对文件属主的要求。

常见的伪用户如下所示:

伪 用 户 含 义 
bin 拥有可执行的用户命令文件 
sys 拥有系统文件 
adm 拥有帐户文件 
uucp UUCP使用 
lp lp或lpd子系统使用 
nobody NFS使用

8.6、添加批量用户

添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户的方法。Linux系统提供了创建大量用户的工具,可以让您立即创建大量用户,方法如下:

8.6.1先编辑一个文本用户文件。

每一列按照/etc/passwd密码文件的格式书写,要注意每个用户的用户名、UID、宿主目录都不可以相同,其中密码栏可以留做空白或输入x号。一个范例文件user.txt内容如下:

user001::600:100:user:/home/user001:/bin/bash
user002::601:100:user:/home/user002:/bin/bash
user003::602:100:user:/home/user003:/bin/bash
user004::603:100:user:/home/user004:/bin/bash
user005::604:100:user:/home/user005:/bin/bash
user006::605:100:user:/home/user006:/bin/bash

8.6.2以root身份执行命令 /usr/sbin/newusers,从刚创建的用户文件user.txt中导入数据,创建用户:

newusers < user.txt

然后可以执行命令 vipw vi /etc/passwd 检查 /etc/passwd 文件是否已经出现这些用户的数据,并且用户的宿主目录是否已经创建。

8.6.3执行命令/usr/sbin/pwunconv。

/etc/shadow 产生的 shadow 密码解码,然后回写到 /etc/passwd 中,并将/etc/shadowshadow密码栏删掉。这是为了方便下一步的密码转换工作,即先取消 shadow password 功能。

 pwunconv

8.6.4编辑每个用户的密码对照文件。

格式为:

用户名:密码

实例文件 passwd.txt 内容如下:

user001:123456
user002:123456
user003:123456
user004:123456
user005:123456
user006:123456

8.6.5以 root 身份执行命令 /usr/sbin/chpasswd

创建用户密码,chpasswd 会将经过 /usr/bin/passwd 命令编码过的密码写入 /etc/passwd 的密码栏。

chpasswd < passwd.txt

8.6.6确定密码经编码写入/etc/passwd的密码栏后。

执行命令 /usr/sbin/pwconv 将密码编码为 shadow password,并将结果写入 /etc/shadow

pwconv

这样就完成了大量用户的创建了,之后您可以到/home下检查这些用户宿主目录的权限设置是否都正确,并登录验证用户密码是否正确。

9,Linux实用指令

9.1,指令运行级别

运行级别说明:

0:关机

1:单用户【找回丢失密码】

2:多用户状态没有网络服务

3:多用户状态有网络服务

4:系统未使用保留给用户

5:图形界面

6:系统重启

常用的运行级别是3和5,通过init来切换不同的运行级别,然后关机。

9.2找回root密码

9.3处理目录的常用指令

9.3.1在开始本教程前我们需要先知道什么是绝对路径与相对路径。

  • 绝对路径: 路径的写法,由根目录 / 写起,例如: /usr/share/doc 这个目录。

  • 相对路径: 路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd ../man 这就是相对路径的写法。

9.3.2几个常见的处理目录的命令:

  • ls(英文全拼:list files): 列出目录及文件名

  • cd(英文全拼:change directory):切换目录

  • pwd(英文全拼:print work directory):显示目前的目录

  • mkdir(英文全拼:make directory):创建一个新的目录

  • rmdir(英文全拼:remove directory):删除一个空的目录

  • cp(英文全拼:copy file): 复制文件或目录

  • rm(英文全拼:remove): 删除文件或目录

  • mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称

你可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp

ls (列出目录)

在Linux系统当中, ls 命令可能是最常被运行的。

语法:

[root@www ~]# ls [-aAdfFhilnrRSt] 目录名称
[root@www ~]# ls [--color={never,auto,always}] 目录名称
[root@www ~]# ls [--full-time] 目录名称

选项与参数:

  • -a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)

  • -d :仅列出目录本身,而不是列出目录内的文件数据(常用)

  • -l :长数据串列出,包含文件的属性与权限等等数据;(常用)

将家目录下的所有文件列出来(含属性与隐藏档)

[root@www ~]# ls -al ~

cd (切换目录)

cd是Change Directory的缩写,这是用来变换工作目录的命令。

语法:

 cd [相对路径或绝对路径]
#使用 mkdir 命令创建 runoob 目录
[root@www ~]# mkdir runoob
?
#使用绝对路径切换到 runoob 目录
[root@www ~]# cd /root/runoob/
?
#使用相对路径切换到 runoob 目录
[root@www ~]# cd ./runoob/
?
# 表示回到自己的家目录,亦即是 /root 这个目录
[root@www runoob]# cd ~
?
# 表示去到目前的上一级目录,亦即是 /root 的上一级目录的意思;
[root@www ~]# cd ..

接下来大家多操作几次应该就可以很好的理解 cd 命令的。

pwd (显示目前所在的目录)

pwd 是 Print Working Directory 的缩写,也就是显示目前所在目录的命令。

[root@www ~]# pwd [-P]

选项与参数:

  • -P :显示出确实的路径,而非使用连结 (link) 路径。

实例:单纯显示出目前的工作目录:

[root@www ~]# pwd
/root ? <== 显示出目录啦~

实例显示出实际的工作目录,而非连结档本身的目录名而已。

[root@www ~]# cd /var/mail ? <==注意,/var/mail是一个连结档
[root@www mail]# pwd
/var/mail ? ? ? ? <==列出目前的工作目录
[root@www mail]# pwd -P
/var/spool/mail ? <==怎么回事?有没有加 -P 差很多~
[root@www mail]# ls -ld /var/mail
lrwxrwxrwx 1 root root 10 Sep  4 17:54 /var/mail -> spool/mail
# 看到这里应该知道为啥了吧?因为 /var/mail 是连结档,连结到 /var/spool/mail 
# 所以,加上 pwd -P 的选项后,会不以连结档的数据显示,而是显示正确的完整路径啊!

mkdir (创建新目录)

如果想要创建新的目录的话,那么就使用mkdir (make directory)吧。

语法:

mkdir [-mp] 目录名称

选项与参数:

  • -m :配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~

  • -p :帮助你直接将所需要的目录(包含上一级目录)递归创建起来!

实例:请到/tmp底下尝试创建数个新目录看看:

[root@www ~]# cd /tmp
[root@www tmp]# mkdir test ?  <==创建一名为 test 的新目录
[root@www tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory `test1/test2/test3/test4': 
No such file or directory ? ? ? <== 没办法直接创建此目录啊!
[root@www tmp]# mkdir -p test1/test2/test3/test4

加了这个 -p 的选项,可以自行帮你创建多层目录!

实例:创建权限为 rwx--x--x 的目录。

[root@www tmp]# mkdir -m 711 test2
[root@www tmp]# ls -l
drwxr-xr-x  3 root  root 4096 Jul 18 12:50 test
drwxr-xr-x  3 root  root 4096 Jul 18 12:53 test1
drwx--x--x  2 root  root 4096 Jul 18 12:54 test2

上面的权限部分,如果没有加上 -m 来强制配置属性,系统会使用默认属性。

如果我们使用 -m ,如上例我们给予 -m 711 来给予新的目录 drwx--x--x 的权限。

rmdir (删除空的目录)

语法:

 rmdir [-p] 目录名称

选项与参数:

  • -p :连同上一级『空的』目录也一起删除

删除 runoob 目录

[root@www tmp]# rmdir runoob/

将 mkdir 实例中创建的目录(/tmp 底下)删除掉!

[root@www tmp]# ls -l ? <==看看有多少目录存在?
drwxr-xr-x  3 root  root 4096 Jul 18 12:50 test
drwxr-xr-x  3 root  root 4096 Jul 18 12:53 test1
drwx--x--x  2 root  root 4096 Jul 18 12:54 test2
[root@www tmp]# rmdir test ? <==可直接删除掉,没问题
[root@www tmp]# rmdir test1  <==因为尚有内容,所以无法删除!
rmdir: `test1': Directory not empty
[root@www tmp]# rmdir -p test1/test2/test3/test4
[root@www tmp]# ls -l ? ? ?  <==您看看,底下的输出中test与test1不见了!
drwx--x--x  2 root  root 4096 Jul 18 12:54 test2

利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除。

不过要注意的是,这个 rmdir 仅能删除空的目录,你可以使用 rm 命令来删除非空目录。

cp (复制文件或目录)

cp 即拷贝文件和目录。

语法:

[root@www ~]# cp [-adfilprsu] 来源档(source) 目标档(destination)
[root@www ~]# cp [options] source1 source2 source3 .... directory

选项与参数:

  • -a:相当与?-pdr 的意思,至与?pdr 请参考下列说明;(常用)

  • -d:若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;

  • -f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;

  • -i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)

  • -l:进行硬式连结(hard link)的连结档创建,而非复制文件本身;

  • -p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);

  • -r:递归持续复制,用与目录的复制行为;(常用)

  • -s:复制成为符号连结档 (symbolic link),亦即『捷径』文件;

  • -u:若 destination 比 source 旧才升级 destination !

用 root 身份,将 root 目录下的 .bashrc 复制到 /tmp 下,并命名为 bashrc

[root@www ~]# cp ~/.bashrc /tmp/bashrc
[root@www ~]# cp -i ~/.bashrc /tmp/bashrc
cp: overwrite `/tmp/bashrc'? n  <==n不覆盖,y为覆盖

rm (移除文件或目录)

语法:

 rm [-fir] 文件或目录

选项与参数:

  • -f :就是 force 的意思,忽略不存在的文件,不会出现警告信息;

  • -i :互动模式,在删除前会询问使用者是否动作

  • -r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!

将刚刚在 cp 的实例中创建的 bashrc 删除掉!

[root@www tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y

如果加上 -i 的选项就会主动询问喔,避免你删除到错误的档名!

mv (移动文件与目录,或修改名称)

语法:

[root@www ~]# mv [-fiu] source destination
[root@www ~]# mv [options] source1 source2 source3 .... directory

选项与参数:

  • -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;

  • -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!

  • -u :若目标文件已经存在,且 source 比较新,才会升级 (update)

复制一文件,创建一目录,将文件移动到目录中

[root@www ~]# cd /tmp
[root@www tmp]# cp ~/.bashrc bashrc
[root@www tmp]# mkdir mvtest
[root@www tmp]# mv bashrc mvtest

将某个文件移动到某个目录去,就是这样做!

将刚刚的目录名称更名为 mvtest2

[root@www tmp]# mv mvtest mvtest2

9.4Linux 查看指令

Linux系统中使用以下命令来查看文件的内容:

  • cat 由第一行开始显示文件内容

  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!

  • nl 显示的时候,顺道输出行号!

  • more 一页一页的显示文件内容

  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

  • head 只看头几行

  • tail 只看尾巴几行

  • echo 输出内容到控制台

  • 指令和>> 指令

你可以使用 man [命令]来查看各个命令的使用文档,如 :man cp。

cat 命令

由第一行开始显示文件内容

语法:

cat [-AbEnTv]

选项与参数:

  • -A :相当与?-vET 的整合选项,可列出一些特殊字符而不是空白而已;

  • -b :列出行号,仅针对非空白行做行号显示,空白行不标行号!

  • -E :将结尾的断行字节 $ 显示出来;

  • -n :列印出行号,连同空白行也会有行号,与 -b 的选项不同;

  • -T :将 [tab] 按键以 ^I 显示出来;

  • -v :列出一些看不出来的特殊字符

检看 /etc/issue 这个文件的内容:

[root@www ~]# cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m

tac 命令

tac与cat命令刚好相反,文件内容从最后一行开始显示,可以看出 tac 是 cat 的倒着写!如:

[root@www ~]# tac /etc/issue
?
Kernel \r on an \m
CentOS release 6.4 (Final)

nl 命令

显示行号

语法:

nl [-bnw] 文件

选项与参数:

  • -b :指定行号指定的方式,主要有两种: -b a :表示不论是否为空行,也同样列出行号(类似 cat -n); -b t :如果有空行,空的那一行不要列出行号(默认值);

  • -n :列出行号表示的方法,主要有三种: -n ln :行号在荧幕的最左方显示; -n rn :行号在自己栏位的最右方显示,且不加 0 ; -n rz :行号在自己栏位的最右方显示,且加 0 ;

  • -w :行号栏位的占用的位数。

实例一:用 nl 列出 /etc/issue 的内容

[root@www ~]# nl /etc/issue
 ? ? 1  CentOS release 6.4 (Final)
 ? ? 2  Kernel \r on an \m

more 命令

一页一页翻动

[root@www ~]# more /etc/man_db.config 
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
....(中间省略)....
--More--(28%)  <== 重点在这一行喔!你的光标也会在这里等待你的命令

在 more 这个程序的运行过程中,你有几个按键可以按的:

  • 空白键 (space):代表向下翻一页;

  • Enter :代表向下翻『一行』;

  • /字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;

  • :f :立刻显示出档名以及目前显示的行数;

  • q :代表立刻离开 more ,不再显示该文件内容。

  • b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

less 命令

一页一页翻动,以下实例输出/etc/man.config文件的内容:

[root@www ~]# less /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
....(中间省略)....
: ? <== 这里可以等待你输入命令!

less运行时可以输入的命令有:

  • 空白键 :向下翻动一页;

  • [pagedown]:向下翻动一页;

  • [pageup] :向上翻动一页;

  • /字串 :向下搜寻『字串』的功能;

  • ?字串 :向上搜寻『字串』的功能;

  • n :重复前一个搜寻 (与 / 或 ? 有关!)

  • N :反向的重复前一个搜寻 (与 / 或 ? 有关!)

  • q :离开 less 这个程序;

head 命令

取出文件前面几行

语法:

head [-n number] 文件 

选项与参数:

  • -n :后面接数字,代表显示几行的意思

[root@www ~]# head /etc/man.config

默认的情况中,显示前面 10 行!若要显示前 20 行,就得要这样:

[root@www ~]# head -n 20 /etc/man.config

tail 命令

取出文件后面几行

语法:

tail [-n number] 文件 

选项与参数:

  • -n :后面接数字,代表显示几行的意思

  • -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测

[root@www ~]# tail /etc/man.config
# 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
[root@www ~]# tail -n 20 /etc/man.config

echo 命令

echo 输出内容到控制台

语法:

echo [选项][输出内容]

指令和>>指令

输出重定向和>>追加

语法:

  • ls -l>文件 (功能描述:列表的内容写入文件中(覆盖写))

  • ls -al>>文件 (功能描述:列表的内容追加到文章末尾)

  • cat 文件1>文件2 (功能描述:将文件1的内容覆盖到文件2)

  • echo “内容”>>文件(追加)

9.5Linux帮助指令

9.5.1man 获得帮助指令

基本语法:

man[命令或配置文件](功能描述:获得帮助信息)

案例

查看ls命令的帮助信息 man ls

在Linux下,隐藏文件是以 .开头,选项可以组合使用,比如:

ls -al, ? ?  ls -al/root

9.5.2help命令

help xxx 只能用于内部命令,
xxx --help  用于外部命令

9.5.3、info命令

info ls

9.6时间日期类

9.6.1date指令-显示当前日期

基本语法:

  • date (功能描述:显示当前时间)

  • date+%Y (功能描述:显示当前年份)

  • date+%m (功能描述:显示当前月份)

  • date+%d (功能描述:显示当前是那一天)

  • date+%Y-%m-%d %H:%M:%S (功能描述:显示年月日时分秒)

9.6.2date指令-设置日期

基本语法:

date  -s ? 字符串时间

9.6.3cal指令

查看日期指令 cal

基本语法:

cal[选项] (功能描述:不加选项,显示本月日历)

9.7Linux搜索查找指令

9.7.1find指令

find指令是将从指定目录向下递归遍历其各个子目录,将满足条件的文件或目录显示在终端。

基本语法:

find [搜索范围][选项]

选项说明:

选项功能
-name<查询方式>按照指定的文件名模式查找文件
-user<用户名>查找属于指定文件名所有文件
-size<文件大小>按照指定的文件大小查找文件

应用实例:

案例1:按文件名:根据名称查找/home目录下hello.txt文件

find /home -name hello.txt

案例2:按拥有着:查找/opt目录下,用户名称为nobody的文件

find /opt -user nobody

案例3:查找整个Linux系统下大于200M的文件(+n大于 -n小于 n等于,)

find /-size +200M

9.7.2locate指令

locate指令可以快速定位文件路径。locate指令利用事先建立的系统中所有文件名及路径的locate数据库实现快速定位文件。

基本语法:

locate 搜索文件

特别说明:

由于locate指令基于数据库进行查询,所以第一次运行前,必须使用updaedb指令创建locate数据库。

9.7.3grep指令和管道指令 |

grep指令过滤查找,管道符“|”,表示将前一个命令处理后的结果输出传送给后面的指令。

基本语法:

grep[选项] 查找内容 源文件

常用选项:

  • -n 显示匹配行及行号

  • -i 忽略字母大小写

案例:请在hello.txt文件中,查找“yes”所在行,并显示行号

写法一:cat /home/hello.txt |grep "yes"
写法二:grep -n "yes" /home/hello.txt

9.8压缩和解压类

9.8.1gzip/gunzip指令

gzip指令用于压缩文件,gunzip指令用于解压

基本语法:

gzip 文件 (功能描述:压缩文件,只能压缩*.gz文件)

gunzip 文件 (功能描述:解压缩文件命令)

案例1:gzip压缩,将/home下的hello.txt文件进行压缩

gzip /home/hello.txt

案例2:gunzip压缩,将/home下的hello.txt.gz文件进行解压缩

gunzip /home/hello.txt.gz

9.8.2zip/unzip指令

zip指令用于压缩文件,unzip指令用于解压

基本语法:

zip [选项] xxx.zip (功能描述:压缩文件,只能压缩*.gz文件)

unzip [选项] xxx.zip (功能描述:解压缩文件命令)

zip常用选项:

-r 递归压缩,及压缩目录

unzip常用选项:

-d<目录> 指定解压后文件的存放目录

案例1:zip压缩,将/home下的所有文件进行压缩成myhone.zip

zip -r myhome.zip /home/

案例2:unzip压缩,将myhome.zip解压到/opt/tmp目录下

mkdir /opt/tmp
unzip -d /opt/tmp /myhome.zip

9.8.3tar指令

tar指令是打包指令,最后打包后的文件是.tar.gz的文件

基本语法:

tar [选项] xxx.tar.gz (功能描述:打包目录,压缩后的文件格式.tar.gz)

选项说明:

选项功能
-c产生.tar打包文件
-v显示详细信息
-f指定压缩后的文件名
-z打包同时压缩
-x解包.tar文件

案例1:压缩多个文件,将/home/pig.txt和/home/cat.txt压缩成pc.tar.gz

tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt

案例2:将/home的文件夹压缩成myhome.tar.gz

tar -zcvf myhom.tar.gz /home/

案例3:将pc.tar.gz解压到当前目录

tar -zxf pc.tar.gz

10Linux权限

10.1权限的基本介绍

Linux权限是操作系统用来限制对资源访问的机制,权限一般分为读、写、执行。系统中每个文件都拥有特定的权限、所属用户及所属组,通过这样的机制来限制哪些用户或用户组可以对特定文件进行相应的操作。 Linux每个进程都是以某个用户身份运行,进程的权限与该用户的权限一样,用户的权限越大,则进程拥有的权限就越大。

Lnux中有的文件及文件夹都有至少权限三种权限,常见的权限如表所示:

权限对文件的影响对目录的影响
r(读取)可读取文件内容可列出目录内容
w(写入)可修改文件内容可在目录中创建删除内容
x(执行)可作为命令执行可访问目录内容
目录必须拥有 x 权限,否则无法查看其内容

Linux权限授权,默认是授权给三种角色,分别是user、group、other,Linux权限与用户之间的关联如下:

  • U代表User,G代表Group,O代表Other;

每个文件的权限基于UGO进行设置;

权限三位一组(rwx),同时需授权给三种角色,UGO;

每个文件拥有一个所属用户和所属组,对应UGO,不属于该文件所属用户或所属组使用O来表示;

在Linux系统中,可以通过ls –l 查看peter.net目录的详细属性,如下所示:

drwxrwxr-x  2 peter1 peter1 4096 Dec 10 01:36 peter.net

peter.net目录属性参数详解如下:

  • d 表示目录,同一位置如果为-则表示普通文件;

  • rwxrwxr-x 表示三种角色的权限,每三位为一种角色,依次为u,g,o权限,如上则表示user的权限为rwx,group的权限为rwx,other的权限为r-x;

  • 2表示文件夹的链接数量,可理解为该目录下子目录的数量;

  • 从左到右,第一个peter1表示该用户名,第二个peter1则为组名,其他人角色默认不显示;

  • 4096表示该文件夹占据的字节数;

  • Dec 10 01:36 表示文件创建或者修改的时间;

  • peter.net 为目录的名,或者文件名。

10.2Chmod用户及组权限

修改某个用户、组对文件夹的权限,用命令chmod实现,其中以代指ugo,、-、=代表加入、删除和等于对应权限,具体案例如下:

(1) 授予用户对peter.net目录拥有rwx权限

chmod  –R  u+rwx  peter.net

(2) 授予组对peter.net目录拥有rwx权限

chmod  –R  g+rwx  peter.net

(3) 授予用户、组、其他人对jpeter.net目录拥有rwx权限

chmod  –R  u+rwx,g+rwx,o+rwx  peter.net

(4) 撤销用户对peter.net目录拥有w权限

chmod  –R  u-w  peter.net

(5) 撤销用户、组、其他人对peter.net目录拥有x权限

chmod  –R  u-x,g-x,o-x peter.net

(6) 授予用户、组、其他人对jpeter.net目录只有rx权限

chmod  –R  u=rx,g=rx,o=rx  peter.net

10.3Chmod二进制权限

Linux权限默认使用rwx来表示,为了更简化在系统中对权限进行配置和修改,Linux权限引入二进制表示方法,如下代码:

Linux权限可以将rwx用二进制来表示,其中有权限用1表示,没有权限用0表示;Linux权限用二进制显示如下:

rwx=111r-x=101rw-=110r--=100依次类推,转化为十进制,对应十进制结果显示如下:rwx=111=4+2+1=7r-x=101=4+0+1=5rw-=110=4+4+0=6r--=100=4+0+0=4得出结论,用r=4,w=2,x=1来表示权限。

使用二进制方式来修改权限案例演示如下,其中默认peter.nett目录权限为755:

(1) 授予用户对peter.net目录拥有rwx权限

chmod  –R  755 peter.net

(2) 授予组对peter.net目录拥有rwx权限

chmod  –R  775 peter.net

(3) 授予用户、组、其他人对peter.net目录拥有rwx权限

chmod  –R  777  peter.net

11Linux定时任务调度

11.1crond任务调度

crontab 进行定时任务的设置

11.1.1概述

任务调度:

是指系统在某个时刻执行的特定的命令或程序

任务调度分类:

  1. 系统工作:有些重要的工作必须周而复始地执行。

  2. 个别用户工作:个别用户可能希望执行某些程序,如备份

11.1.2基本语法

crontab [选项]

11.1.3常用选项

-e编辑crontab定时任务
-l查询 crontab任务
-r删除当前用户所有的crontab任务

11.1.4快速入门

  1. 设置任务调度文件:/etc/crontab

  2. 设置个人任务调度,执行 crontab -e命令

  3. 接着输入任务到调度文件。如:*/1 ls -l /etc/>/tmp/to.txt

###参数细节说明

项目含义范围
第一个“*”一小时当中的第几个分钟0~59
第二个“*”一天当中的地几个小时0~23
第三个“*”一个月当中的第几天1~31
第四个“*”一年当中的第几个月1~12
第五个“*”一周当中的星期几0~7(0和7都代表星期日)

###特殊符号的说明

特殊符号含义
*代表任何时间。比如第一个“*”就代表一小时中每分钟都执行一次
代表不连续的时间。比如“0 8,12,16***命令”,就代表每天的8点0分,12点0分,16点0分都执行一次
-代表连续的范围。比如“0 5 * * 1-6命令”,代表在周一到周六的凌晨5点0分执行命令
*/n代表每隔多久执行一次。比如“*/10 * * * *命令”,代表每隔10分钟就执行一次

11.1.5crond相关指令

crontab ? -r: ? ? 终止任务调度
crontab ? -l: ? ?  列出当前有哪些任务调度
service crond   restart [重启任务调度]

11.2at定时任务

11.2.1基本介绍

  1. at命令是一 次性定时计划任务, at的守护进程atd会以后台模式运行,检查作业队列来运行。

  2. 默认情况下,atd守护进程每60秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。

  3. at命令是一 次性定时计划任务,执行完个任务后不再执行此任务 了

  4. 在使用at命令的时候 ,-定要保证atd进程的启动,可以使用相关指令来查看。

11.2.2at命令格式

at  [选项][时间]
Ctrl + D结束at命令的输入(要输两次)

11.2.3at命令选项

选项含义
-m当指定的任务被完成时,将给用户发送邮件,即使没有标准输出
-Iatq的别名
-datrm的别名
-v显示任务将被执行的时间
-c打印任务的内容到标准输出
-V显示版本信息
-q<队列>使用指定的队列
-f<文件>从指定文件读入任务而不是从标准输入读入
-t<时间参数>以时间参数的形式提交要运行的任务

11.2.4at时间定义

###at指定时间的方法

1.接受在当天的hh:mm (小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。例如:04:00

2.使用midnight (深夜),noon (中午),teatime (饮茶时间,-般是下午4点)等比较模糊的词语来指定时间。

3.采用12小时计时制,即在时间后面加上AM (上午)或PM (下午)来说明是上午还是下午。例如: 12pm。

4.指定命令执行的具体日期,指定格式为month day(月日)或mm/dd/yy (月/日/年)或dd.mm.yy( 日.月年) ,指定的日期必须跟在指定时间的后面。例如: 04:00 2021-08-1

5.使用相对计时法。指定格式为: now + count time-units, now就是当前时间, time-units是时间单位,这里能够是minutes (分钟)、hours (小时)、days (天)、weeks (星期)●count是时间的数量,几天,几小时。例如: now + 5 minutes

6.直接使用today (今天)、tomorrow (明天)来指定完成命令的时间。

12Linux磁盘分区

12.1Linux分区

12.1.1原理介绍

Linux 磁盘管理好坏直接关系到整个系统的性能问题。

Linux 磁盘管理常用三个命令为 dfdufdisk

  • df(英文全称:disk full):列出文件系统的整体磁盘使用量

  • du(英文全称:disk used):检查磁盘空间使用量

  • fdisk:用于磁盘分区


12.2查询系统整体磁盘使用情况

12.2.1df命令

df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。

语法:

df [-ahikHTm] [目录或文件名]

选项与参数:

  • -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;

  • -k :以 KBytes 的容量显示各文件系统;

  • -m :以 MBytes 的容量显示各文件系统;

  • -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;

  • -H :以 M=1000K 取代 M=1024K 的进位方式;

  • -T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;

  • -i :不用硬盘容量,而以 inode 的数量来显示

实例 1:将系统内所有的文件系统列出来!

[root@www ~]# df
Filesystem ? ?  1K-blocks ? ?  Used Available Use% Mounted on
/dev/hdc2 ? ? ? ? 9920624 ? 3823112 ? 5585444  41% /
/dev/hdc3 ? ? ? ? 4956316 ?  141376 ? 4559108 ? 4% /home
/dev/hdc1 ? ? ? ?  101086 ? ? 11126 ? ? 84741  12% /boot
tmpfs ? ? ? ? ? ?  371332 ? ? ? ? 0 ?  371332 ? 0% /dev/shm

在 Linux 底下如果 df 没有加任何选项,那么默认会将系统内所有的 (不含特殊内存内的文件系统与 swap) 都以 1 Kbytes 的容量来列出来!

实例 2:将容量结果以易读的容量格式显示出来

[root@www ~]# df -h
Filesystem ? ? ? ? ?  Size  Used Avail Use% Mounted on
/dev/hdc2 ? ? ? ? ? ? 9.5G  3.7G  5.4G  41% /
/dev/hdc3 ? ? ? ? ? ? 4.8G  139M  4.4G ? 4% /home
/dev/hdc1 ? ? ? ? ? ?  99M ? 11M ? 83M  12% /boot
tmpfs ? ? ? ? ? ? ? ? 363M ? ? 0  363M ? 0% /dev/shm

实例 3:将系统内的所有特殊文件格式及名称都列出来

[root@www ~]# df -aT
Filesystem ?  Type 1K-blocks ?  Used Available Use% Mounted on
/dev/hdc2 ? ? ext3 ? 9920624 3823112 ? 5585444  41% /
proc ? ? ? ?  proc ? ? ? ? 0 ? ? ? 0 ? ? ? ? 0 ? -  /proc
sysfs ? ? ?  sysfs ? ? ? ? 0 ? ? ? 0 ? ? ? ? 0 ? -  /sys
devpts ? ?  devpts ? ? ? ? 0 ? ? ? 0 ? ? ? ? 0 ? -  /dev/pts
/dev/hdc3 ? ? ext3 ? 4956316  141376 ? 4559108 ? 4% /home
/dev/hdc1 ? ? ext3 ?  101086 ? 11126 ? ? 84741  12% /boot
tmpfs ? ? ?  tmpfs ?  371332 ? ? ? 0 ?  371332 ? 0% /dev/shm
none ? binfmt_misc ? ? ? ? 0 ? ? ? 0 ? ? ? ? 0 ? -  /proc/sys/fs/binfmt_misc
sunrpc  rpc_pipefs ? ? ? ? 0 ? ? ? 0 ? ? ? ? 0 ? -  /var/lib/nfs/rpc_pipefs

实例 4:将 /etc 底下的可用的磁盘容量以易读的容量格式显示

[root@www ~]# df -h /etc
Filesystem ? ? ? ? ?  Size  Used Avail Use% Mounted on
/dev/hdc2 ? ? ? ? ? ? 9.5G  3.7G  5.4G  41% /

12.3查询指定目录的磁盘占用情况

12.3.1du命令

Linux du 命令也是查看使用空间的,但是与 df 命令不同的是 Linux du 命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的,这里介绍 Linux du 命令。

语法:

du [-ahskm] 文件或目录名称

选项与参数:

  • -a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。

  • -h :以人们较易读的容量格式 (G/M) 显示;

  • -s :列出总量而已,而不列出每个各别的目录占用容量;

  • -S :不包括子目录下的总计,与 -s 有点差别。

  • -k :以 KBytes 列出容量显示;

  • -m :以 MBytes 列出容量显示;

实例 1:只列出当前目录下的所有文件夹容量(包括隐藏文件夹):

[root@www ~]# du
8 ? ? ? ./test4 ? ? <==每个目录都会列出来
8 ? ? ? ./test2
....中间省略....
12 ? ?  ./.gconfd ? <==包括隐藏文件的目录
220 ? ? . ? ? ? ? ? <==这个目录(.)所占用的总量

直接输入 du 没有加任何选项时,则 du 会分析当前所在目录里的子目录所占用的硬盘空间。

实例 2:将文件的容量也列出来

[root@www ~]# du -a
12 ? ?  ./install.log.syslog ? <==有文件的列表了
8 ? ? ? ./.bash_logout
8 ? ? ? ./test4
8 ? ? ? ./test2
....中间省略....
12 ? ?  ./.gconfd
220 ? ? .

实例 3:检查根目录底下每个目录所占用的容量

[root@www ~]# du -sm /*
7 ? ? ? /bin
6 ? ? ? /boot
.....中间省略....
0 ? ? ? /proc
.....中间省略....
1 ? ? ? /tmp
3859 ?  /usr ? ? <==系统初期最大就是他了啦!
77 ? ?  /var

通配符 * 来代表每个目录。

与 df 不一样的是,du 这个命令其实会直接到文件系统内去搜寻所有的文件数据。


12.4Linux增加磁盘

12.4.1fdisk命令

fdisk 是 Linux 的磁盘分区表操作工具。

语法:

fdisk [-l] 装置名称

选项与参数:

  • -l :输出后面接的装置所有的分区内容。若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来。

  • -m:显示命令列表

  • -p : 显示磁盘分区

  • -n: 新增分区

  • -d: 删除分区

实例 1:列出所有分区信息

[root@AY120919111755c246621 tmp]# fdisk -l
?
Disk /dev/xvda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
?
 ?  Device Boot ? ?  Start ? ? ? ? End ? ?  Blocks ? Id  System
/dev/xvda1 ? * ? ? ? ? ? 1 ? ? ?  2550 ?  20480000 ? 83  Linux
/dev/xvda2 ? ? ? ? ?  2550 ? ? ?  2611 ? ?  490496 ? 82  Linux swap / Solaris
?
Disk /dev/xvdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x56f40944
?
 ?  Device Boot ? ?  Start ? ? ? ? End ? ?  Blocks ? Id  System
/dev/xvdb2 ? ? ? ? ? ? ? 1 ? ? ?  2610 ?  20964793+  83  Linux

实例 2:找出你系统中的根目录所在磁盘,并查阅该硬盘内的相关信息

[root@www ~]# df / ? ? ? ? ?  <==注意:重点在找出磁盘文件名而已
Filesystem ? ? ? ? ? 1K-blocks ? ?  Used Available Use% Mounted on
/dev/hdc2 ? ? ? ? ? ?  9920624 ? 3823168 ? 5585388  41% /
?
[root@www ~]# fdisk /dev/hdc  <==仔细看,不要加上数字喔!
The number of cylinders for this disk is set to 5005.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
 ? (e.g., DOS FDISK, OS/2 FDISK)
?
Command (m for help): ? ? <==等待你的输入!

输入 m 后,就会看到底下这些命令介绍

Command (m for help): m ? <== 输入 m 后,就会看到底下这些命令介绍
Command action
 ? a ? toggle a bootable flag
 ? b ? edit bsd disklabel
 ? c ? toggle the dos compatibility flag
 ? d ? delete a partition ? ? ? ? ?  <==删除一个partition
 ? l ? list known partition types
 ? m ? print this menu
 ? n ? add a new partition ? ? ? ? ? <==新增一个partition
 ? o ? create a new empty DOS partition table
 ? p ? print the partition table ? ? <==在屏幕上显示分割表
 ? q ? quit without saving changes ? <==不储存离开fdisk程序
 ? s ? create a new empty Sun disklabel
 ? t ? change a partition's system id
 ? u ? change display/entry units
 ? v ? verify the partition table
 ? w ? write table to disk and exit  <==将刚刚的动作写入分割表
 ? x ? extra functionality (experts only)

离开 fdisk 时按下 q,那么所有的动作都不会生效!相反的, 按下w就是动作生效的意思。

Command (m for help): p  <== 这里可以输出目前磁盘的状态
?
Disk /dev/hdc: 41.1 GB, 41174138880 bytes ? ? ?  <==这个磁盘的文件名与容量
255 heads, 63 sectors/track, 5005 cylinders ? ?  <==磁头、扇区与磁柱大小
Units = cylinders of 16065 * 512 = 8225280 bytes <==每个磁柱的大小
?
 ? Device Boot ? ?  Start ? ? ? ? End ? ?  Blocks ? Id  System
/dev/hdc1 ? * ? ? ? ? ? 1 ? ? ? ?  13 ? ?  104391 ? 83  Linux
/dev/hdc2 ? ? ? ? ? ?  14 ? ? ?  1288 ?  10241437+  83  Linux
/dev/hdc3 ? ? ? ? ?  1289 ? ? ?  1925 ? ? 5116702+  83  Linux
/dev/hdc4 ? ? ? ? ?  1926 ? ? ?  5005 ?  24740100 ?  5  Extended
/dev/hdc5 ? ? ? ? ?  1926 ? ? ?  2052 ? ? 1020096 ? 82  Linux swap / Solaris
# 装置文件名 启动区否 开始磁柱 ?  结束磁柱  1K大小容量 磁盘分区槽内的系统
?
Command (m for help): q

想要不储存离开吗?按下 q 就对了!不要随便按 w 啊!

使用 p 可以列出目前这颗磁盘的分割表信息,这个信息的上半部在显示整体磁盘的状态。


12.5磁盘格式化

磁盘分割完毕后自然就是要进行文件系统的格式化,格式化的命令非常的简单,使用 mkfs(make filesystem) 命令。

语法:

mkfs [-t 文件系统格式] 装置文件名

选项与参数:

  • -t :可以接文件系统格式,例如 ext3, ext2, vfat 等(系统有支持才会生效)

实例 1:查看 mkfs 支持的文件格式

[root@www ~]# mkfs[tab][tab]
mkfs ? ? ? ? mkfs.cramfs  mkfs.ext2 ?  mkfs.ext3 ?  mkfs.msdos ? mkfs.vfat

按下两个[tab],会发现 mkfs 支持的文件格式如上所示。

实例 2:将分区 /dev/hdc6(可指定你自己的分区) 格式化为 ext3 文件系统:

[root@www ~]# mkfs -t ext3 /dev/hdc6
mke2fs 1.39 (29-May-2006)
Filesystem label= ? ? ? ? ? ? ?  <==这里指的是分割槽的名称(label)
OS type: Linux
Block size=4096 (log=2) ? ? ? ?  <==block 的大小配置为 4K 
Fragment size=4096 (log=2)
251392 inodes, 502023 blocks ? ? <==由此配置决定的inode/block数量
25101 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=515899392
16 block groups
32768 blocks per group, 32768 fragments per group
15712 inodes per group
Superblock backups stored on blocks:
 ? ? ?  32768, 98304, 163840, 229376, 294912
?
Writing inode tables: done
Creating journal (8192 blocks): done <==有日志记录
Writing superblocks and filesystem accounting information: done
?
This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
# 这样就创建起来我们所需要的 Ext3 文件系统了!简单明了!

12.6磁盘检验

fsck(file system check)用来检查和维护不一致的文件系统。

若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查。

语法:

fsck [-t 文件系统] [-ACay] 装置名称

选项与参数:

  • -t : 给定档案系统的型式,若在 /etc/fstab 中已有定义或 kernel 本身已支援的则不需加上此参数

  • -s : 依序一个一个地执行 fsck 的指令来检查

  • -A : 对/etc/fstab 中所有列出来的 分区(partition)做检查

  • -C : 显示完整的检查进度

  • -d : 打印出 e2fsck 的 debug 结果

  • -p : 同时有 -A 条件时,同时有多个 fsck 的检查一起执行

  • -R : 同时有 -A 条件时,省略 / 不检查

  • -V : 详细显示模式

  • -a : 如果检查有错则自动修复

  • -r : 如果检查有错则由使用者回答是否修复

  • -y : 选项指定检测每个文件是自动输入yes,在不确定那些是不正常的时候,可以执行 # fsck -y 全部检查修复。

实例 1:查看系统有多少文件系统支持的 fsck 命令:

[root@www ~]# fsck[tab][tab]
fsck ? ? ? ? fsck.cramfs  fsck.ext2 ?  fsck.ext3 ?  fsck.msdos ? fsck.vfat

实例 2:强制检测 /dev/hdc6 分区:

[root@www ~]# fsck -C -f -t ext3 /dev/hdc6 
fsck 1.39 (29-May-2006)
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
vbird_logical: 11/251968 files (9.1% non-contiguous), 36926/1004046 blocks

如果没有加上 -f 的选项,则由于这个文件系统不曾出现问题,检查的经过非常快速!若加上 -f 强制检查,才会一项一项的显示过程。


12.7磁盘挂载与卸除

Linux 的磁盘挂载使用 mount 命令,卸载使用 umount 命令。

磁盘挂载语法:

mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n]  装置文件名  挂载点

实例 :用默认的方式,将刚刚创建的 /dev/hdc6 挂载到 /mnt/hdc6 上面!

[root@www ~]# mkdir /mnt/hdc6
[root@www ~]# mount /dev/hdc6 /mnt/hdc6
[root@www ~]# df
Filesystem ? ? ? ? ? 1K-blocks ? ?  Used Available Use% Mounted on
.....中间省略.....
/dev/hdc6 ? ? ? ? ? ?  1976312 ? ? 42072 ? 1833836 ? 3% /mnt/hdc6

磁盘卸载命令 umount 语法:

umount [-fn] 装置文件名或挂载点

选项与参数:

  • -f :强制卸除!可用在类似网络文件系统 (NFS) 无法读取到的情况下;

  • -n :不升级 /etc/mtab 情况下卸除。

卸载/dev/hdc6

[root@www ~]# umount /dev/hdc6 ? 

13Linux网络环境配置

13.1自动获取IP

说明:登陆后,通过界面的设置自动获取IP,

优点:Linux启动后会自动获取IP地址,

缺点:每次自动获取的IP地址可能不一样。

13.2指定IP

说明:直接修改配置文件来指定IP,并可以连接到外网。

13.2.1编辑:

vi /etc/sysconfig/network-scripts/ifcfg-ens33

13.2.2要求:将IP地址配置为静态,比如:IP地址位192.168.200.130

ifcfg-ens33文件说明:
DEVICE=eth0 ? ? ? #接口名(设备,网卡)
HWADDR=00:0C:2x:6x:0x:xx ?  #MAC地址
TYPE=Ethemet ? ? ?  #网络类型
UUID=926a57ba-92c6-4231-bacb-f27e5e6a9f44 #随机id
#系统启动时网络接口是否有效
ONBOOT=yes
#IP的配置方式[none][static][bootp|dhcp]
BOOTRROTO=static
#IP地址
IPADDR=192.168.200.130
#网关
GATEWAY=192.168.200.2
#域名解析器
DNSI=192.168.200.2

13.2.3重启网络服务或重启系统生效

service network restart 
或者:
reboot

14Linux进程管理

14.1基本介绍

  1. 在Linux中,每个执行的程序都称为一个进程。每一个进程都飞配一个id号(pid。进程号)。

  2. 每个进程都可能以两种方式存在。前台与后台,所谓前台就是用户目前的屏幕上可以进行操作的,后台进程则是实际在操作,

  3. 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中,知道关机才结束。

14.2显示系统执行的进程

14.2.1基本介绍

ps命令是用来查看当前系统中,有那些正在执行,以及他们的执行状况。可以不加任何参数。

14.2.2ps详解

指令: ps-aux|grep xxx,比如我看看有没有sshd服务

指令说明:

  • System V 展示风格

  • USER:用户名称

  • PID:进程号

  • %CPU:进程占用CPU的百分比

  • %MEM:进程占用物理内存的百分比

  • VSZ:进程占用的虚拟内存大小(单位:KB)

  • RSS:进程占用的物理内存大小(单位:KB)

  • TT:终端名称:缩写

  • STAT:进程状态,其中S-睡眠,s-表示进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R-正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止。

  • STARTED:进程的启动时间

  • TIME:CPU时间,及进程使用CPU的总时间

  • COMMAND:启动进程所用的命令和参数,如果过长会被截断显示

14.3终止进程kill和killall

14.3.1介绍

若是某个进程执行一半需要停止时,或是已占用很大的系统资源时,可以考虑停止该进程

14.3.2基本语法

kill [] 进程号(功能描述:通过进程号终止该进程)
killall 进程名称 (功能描述:通过进程名称终止该进程)

14.4查看进程树

14.4.1基本语法

pstree [选项],可以更加直观的来看进程信息

14.4.2常用选项

  • -p : 显示进程的PID

  • -u : 显示进程的所属用户

14.5服务管理

14.5.1介绍

服务本质就是进程,但是运行在后台的,通常会监听某个端口,等待其他程序的请求,因此我们称为守护进程,

14.5.2service管理指令

  1. service 服务器名 [ start|stop|restart|reload|status]

  2. service指令管理的服务在 /etc/init.d查看

14.5.3查看服务名

方法一:使用setup->系统服务就可以看到全部

方法二:/etc/init.d查看

ls -l /etc/init.d

14.5.4chkconfig指令

14.5.4.1介绍:

通过chkconfig命令可以给服务器的各个运行级别设置自启动/关闭

14.5.4.2基本语法

  1. 查看服务 chkconfig -list[|grep xxx]

  2. chkconfig 服务名 -list

  3. chkconfig -level 5 服务名 on/off

14.5.5打开或关闭指定端口

在真实的环境中,往往需要将防火墙打开,如果打开那麽外部请求数据包就不能跟服务器监听端口通讯。这时需要打开指定端口。

14.5.5.1firewall指令

firewalld是防火墙的另一种程序,与iptables相同,但是使用起来更加简单。一些firewall常用命令:

  • firewall-cmd --state 防火墙状态

  • service firewalld start 打开防火墙

  • service firewalld stop 关闭防火墙

  • systemctl disable firewalld 禁止开机自启

  • systemctl enable firewalld 允许开机自启

  • firewall-cmd --list-all 查看当前的firewall的信息和配置

例如:

一、先使用如下指令打开防火墙端口

firewall-cmd --zone=public --add-ports=10306/tcp --permanent

二、重启防火墙,让新增的端口生效

firewall-cmd --reload

三、查看防火墙打开的端口

firewall-cmd --list-ports
 

四、启动服务,让服务监听这个10306端口

14.6动态监控进程

14.6.1介绍

top命令经常用来监控linux的系统状况,是常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况。top与ps相似,他们都是用来显示正在执行的进程,top再执行一段时间可以更新正在运行的进程

top的使用方式 top [-d number] | top [-bnp]

14.6.2参数解释:

  • -d:number代表秒数,表示top命令显示的页面更新一次的间隔。默认是5秒。

  • -b:以批次的方式执行top。

  • -n:与-b配合使用,表示需要进行几次top命令的输出结果。

  • -p:指定特定的pid进程号进行观察。

  • -i :使top不显示任何闲置或者僵死进程

在top命令显示的页面还可以输入以下按键执行相应的功能(注意大小写区分的):

  • ?:显示在top当中可以输入的命令

  • P:以CPU的使用资源排序显示

  • M:以内存的使用资源排序显示

  • N:以pid排序显示

  • T:由进程使用的时间累计排序显示

  • k:给某一个pid一个信号。可以用来杀死进程

  • r:给某个pid重新定制一个nice值(即优先级)

  • q:退出top(用ctrl+c也可以退出top)

14.7监控网络状态

14.7.1查看系统网络情况netstat

14.7.1.1基本语法

netstat [选项]

14.7.1.2选项说明

  • -an 按一定顺序排列输出

  • -p 显示那个进程在调用

14.7.2检测主机连接命令ping

是一种网络检测工具,它主要是用来检测远程主机是否正常,或是两部主机间的网络或网卡故障。如ping对方的IP地址

15Linux中RPM与YUM

15.1RPM包文件默认安装位置:

  • /etc/ 配置文件默认安装目录

  • /usr/bin/ 可执行的命令安装目录

  • /usr/lib/ 所依赖的函数库文件保存位置

  • /usr/share/doc/ 软件帮助文档保存位置

  • /usr/share/man/ 软件手册保存位置

15.2相关命令

命令用途:RPM包的管理工具。

rpm -qa|grep xx
命令语法:rpm [选项] [包全名]|[包名]|[系统文件名]

15.3常用选项:

  • -i:安装(install);

  • -U:升级(upgrade);

  • -e:卸载(erase);

  • -v:显示安装过程详细信息(verbose);

  • -h:显示安装进度(hash);

  • --nodeps:不检查依赖性;

  • -q:查询(query);

  • -i:查询软件包信息(information);

  • -l:查询包中文件的默认安装位置(list);

  • -f:查询系统文件属于哪个软件包(file);

  • -R:查询软件包的依赖性(requires);

  • -a:查询所有(all);

  • -p:查询未安装包信息(package);

  • -V:校验指定RPM包中的文件(verify);

标识  意义
S   文件大小是否改变
M   文件的类型(参照文件类型对照表)或文件的权限是否改变
5   文件MD5校验值是否改变
D   设备中的从代码是否改变
L   文件路径是否改变
U   文件的所有者是否改变
G   文件的所属组是否改变
T   文件的修改时间是否改变

校验的文件类型对照表如下。

标识  类型
c   配置文件(config file)
d   普通文档(documentation)
g   “鬼”文件(ghost file),指不该出现在这个RPM包中的文件
l   授权文件(license file)
r   描述文件(read me)
//查询所有已安装的httpd软件包
rpm -qa | grep httpd
//查询已安装的httpd软件包的详细信息
rpm -qi  httpd
//查询未安装的httpd-2.2.15-29.el6.centos.x86_64.rpm软件包的详细信息
rpm -qip  httpd-2.2.15-29.el6.centos.x86_64.rpm
//查询已安装的httpd软件包中文件的安装位置
rpm -ql  httpd
//查询未安装的httpd-2.2.15-29.el6.centos.x86_64.rpm软件包中文件的安装位置
rpm -qlp  httpd-2.2.15-29.el6.centos.x86_64.rpm
//查询系统文件/usr/sbin/httpd所属的软件包
rpm -qf /usr/sbin/httpd
//查询已安装的httpd软件包的依赖性
rpm -qR httpd
//查询未安装的httpd-2.2.15-29.el6.centos.x86_64.rpm软件包的依赖性
rpm -qRp httpd-2.2.15-29.el6.centos.x86_64.rpm
//校验已安装的httpd软件包
rpm -V httpd
//校验未安装的httpd-2.2.15-29.el6.centos.x86_64.rpm软件包
rpm -Vp httpd-2.2.15-29.el6.centos.x86_64.rpm

注:在使用rpm命令时,若操作的包是未安装的软件包时,需使用包全名,而且要注意路径;若操作的是已经安装的软件包时,使用包名,系统会去/var/lib/rpm/中的数据库中搜索。

15.4Linux yum 命令

yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。

基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。

yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。

15.4.1yum 语法

yum [options] [command] [package ...]
  • options:可选,选项包括-h(帮助),-y(当安装过程提示选择全部为 "yes"),-q(不显示安装的过程)等等。

  • command:要进行的操作。

  • package:安装的包名。


15.4.2yum常用命令

  • \1. 列出所有可更新的软件清单命令:yum check-update

  • \2. 更新所有软件命令:yum update

  • \3. 仅安装指定的软件命令:yum install <package_name>

  • \4. 仅更新指定的软件命令:yum update <package_name>

  • \5. 列出所有可安裝的软件清单命令:yum list

  • \6. 删除软件包命令:yum remove <package_name>

  • \7. 查找软件包命令:yum search <keyword>

  • \8. 清除缓存命令:

    • yum clean packages: 清除缓存目录下的软件包

    • yum clean headers: 清除缓存目录下的 headers

    • yum clean oldheaders: 清除缓存目录下旧的 headers

    • yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的 headers

实例 1安装 pam-devel

[root@www ~]# yum install pam-devel
Setting up Install Process
Parsing package install arguments
Resolving Dependencies  <==先检查软件的属性相依问题
--> Running transaction check
---> Package pam-devel.i386 0:0.99.6.2-4.el5 set to be updated
--> Processing Dependency: pam = 0.99.6.2-4.el5 for package: pam-devel
--> Running transaction check
---> Package pam.i386 0:0.99.6.2-4.el5 set to be updated
filelists.xml.gz ? ? ? ?  100% |=========================| 1.6 MB ?  00:05
filelists.xml.gz ? ? ? ?  100% |=========================| 138 kB ?  00:00
-> Finished Dependency Resolution
……(省略)

实例 2移除 pam-devel

[root@www ~]# yum remove pam-devel
Setting up Remove Process
Resolving Dependencies  <==同样的,先解决属性相依的问题
--> Running transaction check
---> Package pam-devel.i386 0:0.99.6.2-4.el5 set to be erased
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================
 Package ? ? ? ? ? ? ? ? Arch ? ? ? Version ? ? ? ?  Repository ? ? ?  Size
=============================================================================
Removing:
 pam-devel ? ? ? ? ? ? ? i386 ? ? ? 0.99.6.2-4.el5 ? installed ? ? ? ? 495 k
?
Transaction Summary
=============================================================================
Install ? ?  0 Package(s)
Update ? ? ? 0 Package(s)
Remove ? ? ? 1 Package(s)  <==还好,并没有属性相依的问题,单纯移除一个软件
?
Is this ok [y/N]: y
Downloading Packages:
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Erasing ? : pam-devel ? ? ? ? ? ? ? ? ?  ######################### [1/1]
?
Removed: pam-devel.i386 0:0.99.6.2-4.el5
Complete!

实例 3利用 yum 的功能,找出以 pam 为开头的软件名称有哪些?

[root@www ~]# yum list pam*
Installed Packages
pam.i386 ? ? ? ? ? ? ? ?  0.99.6.2-3.27.el5 ? ?  installed
pam_ccreds.i386 ? ? ? ? ? 3-5 ? ? ? ? ? ? ? ? ?  installed
pam_krb5.i386 ? ? ? ? ? ? 2.2.14-1 ? ? ? ? ? ? ? installed
pam_passwdqc.i386 ? ? ? ? 1.0.2-1.2.2 ? ? ? ? ?  installed
pam_pkcs11.i386 ? ? ? ? ? 0.5.3-23 ? ? ? ? ? ? ? installed
pam_smb.i386 ? ? ? ? ? ?  1.1.7-7.2.1 ? ? ? ? ?  installed
Available Packages <==底下则是『可升级』的或『未安装』的
pam.i386 ? ? ? ? ? ? ? ?  0.99.6.2-4.el5 ? ? ? ? base
pam-devel.i386 ? ? ? ? ?  0.99.6.2-4.el5 ? ? ? ? base
pam_krb5.i386 ? ? ? ? ? ? 2.2.14-10 ? ? ? ? ? ?  base

15.5国内 yum 源

网易(163)yum源是国内最好的yum源之一 ,无论是速度还是软件版本,都非常的不错。

将yum源设置为163 yum,可以提升软件包安装和更新的速度,同时避免一些常见软件版本无法找到。

15.5.1安装步骤

首先备份/etc/yum.repos.d/CentOS-Base.repo

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

下载对应版本 repo 文件, 放入 /etc/yum.repos.d/ (操作前请做好相应备份)

wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
mv CentOS6-Base-163.repo CentOS-Base.repo

运行以下命令生成缓存

yum clean all
yum makecache

-----------------------------------------------------

16大数据定制篇-shell编程

16.1Shell 介绍

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

16.2Shell 脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。

由于习惯的原因,简洁起见,本文出现的 "shell编程" 都是指 shell 脚本编程,不是指开发 shell 自身。


16.3Shell 环境

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)

  • Bourne Again Shell(/bin/bash)

  • C Shell(/usr/bin/csh)

  • K Shell(/usr/bin/ksh)

  • Shell for Root(/sbin/sh)

  • ……

本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

echo 命令用于向窗口输出文本。

16.4Shell 脚本有两种方法:

16.4.1、作为可执行程序

将上面的代码保存为 test.sh,并 cd 到相应目录:

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。

16.4.2、作为解释器参数

这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

/bin/sh test.sh
/bin/php test.php

这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。

16.5Shell 变量

定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:

your_name="runoob.com"

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。

  • 中间不能有空格,可以使用下划线(_)。

  • 不能使用标点符号。

  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

有效的 Shell 变量名示例如下:

RUNOOB
LD_LIBRARY_PATH
_var
var2

无效的变量命名:

?var=123
user*name=runoob

除了显式地直接赋值,还可以用语句给变量赋值,如:

for file in `ls /etc`
或
for file in $(ls /etc)

以上语句将 /etc 下目录的文件名循环出来。


16.5.1使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

for skill in Ada Coffe Action Java; do
 ?  echo "I am good at ${skill}Script"
done

如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号,这是个好的编程习惯。

已定义的变量,可以被重新定义,如:

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)。

16.5.2只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"

运行脚本,结果如下:

/bin/sh: NAME: This variable is read only.

16.5.3删除变量

使用 unset 命令可以删除变量。语法:

unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量。

实例

#!/bin/sh
myUrl="https://www.runoob.com"
unset myUrl
echo $myUrl

以上实例执行将没有任何输出。

16.6变量类型

运行shell时,会同时存在三种变量:

  • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

  • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

  • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行


16.7Shell 字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

16.7.1单引号

str='this is a string'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

16.7.2双引号

your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

输出结果为:

Hello, I know you are "runoob"! 

双引号的优点:

  • 双引号里可以有变量

  • 双引号里可以出现转义字符

16.7.3拼接字符串

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

输出结果为:

hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

16.7.3.1获取字符串长度

string="abcd"
echo ${#string} #输出 4

16.7.3.2提取子字符串

以下实例从字符串第 2 个字符开始截取 4 个字符:

string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

注意:第一个字符的索引值为 0

16.7.3.3查找子字符串

查找字符 io 的位置(哪个字母先出现就计算哪个):

string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。


16.8Shell 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

16.8.1定义数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用连续的下标,而且下标的范围没有限制。

16.8.2读取数组

读取数组元素值的一般格式是:

${数组名[下标]}

例如:

valuen=${array_name[n]}

使用 @ 符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

16.8.3获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

16.9Shell 注释

# 开头的行就是注释,会被解释器忽略。

通过每一行加一个 # 号设置多行注释,像这样:

##### 用户配置区 开始 #####
#
#
# 这里可以添加脚本描述信息
# 
#
##### 用户配置区 结束  #####

如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?

每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。

16.9.1多行注释

多行注释还可以使用以下格式:

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

EOF 也可以使用其他符号:

:<<'
注释内容...
注释内容...
注释内容...
'
?
:<<!
注释内容...
注释内容...
注释内容...
!

16.10Shell 传递参数

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

实例

以下实例我们向脚本传递三个参数,并分别输出,其中 $0 为执行的文件名(包含文件路径):

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

为脚本设置可执行权限,并执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

另外,还有几个特殊字符用来处理参数:

参数处理说明
$#传递到脚本的参数个数
$*以一个单字符串显示所有向脚本传递的参数。 如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。 如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
?
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3

$* 与 $@ 区别:

  • 相同点:都是引用所有参数。

  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。

echo "-- \$* 演示 ---"
for i in "$*"; do
 ?  echo $i
done
?
echo "-- \$@ 演示 ---"
for i in "$@"; do
 ?  echo $i
done

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3

16.11Shell 数组

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

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

16.11.1定义数组

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

array_name=(value1 value2 ... valuen)

实例

my_array=(A B "C" D)

我们也可以使用下标来定义数组:

array_name[0]=value0
array_name[1]=value1
array_name[2]=value2

16.11.2读取数组

读取数组元素值的一般格式是:

${array_name[index]}

实例

my_array=(A B "C" D)
?
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D

16.11.3获取数组中的所有元素

使用@ 或 * 可以获取数组中的所有元素,例如:

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
?
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
数组的元素为: A B C D
数组的元素为: A B C D

16.11.4获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

my_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=D
?
echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
数组元素个数为: 4
数组元素个数为: 4

16.12Shell 基本运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符

  • 关系运算符

  • 布尔运算符

  • 字符串运算符

  • 文件测试运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 *`* 而不是单引号 *'*):


16.12.1算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
+加法expr $a + $b 结果为 30。
-减法expr $a - $b 结果为 -10。
*乘法expr $a \* $b 结果为 200。
/除法expr $b / $a 结果为 2。
%取余expr $b % $a 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

实例.算术运算符实例如下:

a=10
b=20
#加
val=`expr $a + $b`
echo "a + b : $val"
#减
val=`expr $a - $b`
echo "a - b : $val"
#乘
val=`expr $a \* $b`
echo "a * b : $val"
#除
val=`expr $b / $a`
echo "b / a : $val"
#取模
val=`expr $b % $a`
echo "b % a : $val"
?
if [ $a == $b ]
then
  echo "a 等于 b"
fi
if [ $a != $b ]
then
  echo "a 不等于 b"
fi

执行脚本,输出结果如下所示:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

注意:

  • 乘号(*)前边必须加反斜杠()才能实现乘法运算;

  • if...then...fi 是条件语句,后续将会讲解。


16.12.2关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。

实例.关系运算符实例如下:

a=10
b=20

if [ $a -eq $b ]
then
  echo "$a -eq $b : a 等于 b"
else
  echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
  echo "$a -ne $b: a 不等于 b"
else
  echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
  echo "$a -gt $b: a 大于 b"
else
  echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
  echo "$a -lt $b: a 小于 b"
else
  echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
  echo "$a -ge $b: a 大于或等于 b"
else
  echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
  echo "$a -le $b: a 小于或等于 b"
else
  echo "$a -le $b: a 大于 b"
fi

执行脚本,输出结果如下所示:

10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b

16.12.3布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。

实例.布尔运算符实例如下:

a=10
b=20
?
if [ $a != $b ]
then
  echo "$a != $b : a 不等于 b"
else
  echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
  echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
  echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
  echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
  echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
  echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
  echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi

执行脚本,输出结果如下所示:

10 != 20 : a 不等于 b
10 小于 100 且 20 大于 15 : 返回 true
10 小于 100 或 20 大于 100 : 返回 true
10 小于 5 或 20 大于 100 : 返回 false

16.12.4逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||逻辑的 OR[[ $a -lt 100 || $b -gt 100 ]] 返回 true

实例.逻辑运算符实例如下:

a=10
b=20
?
if [[ $a -lt 100 && $b -gt 100 ]]
then
  echo "返回 true"
else
  echo "返回 false"
fi
?
if [[ $a -lt 100 || $b -gt 100 ]]
then
  echo "返回 true"
else
  echo "返回 false"
fi

执行脚本,输出结果如下所示:

返回 false
返回 true

16.12.5字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否不相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否不为 0,不为 0 返回 true。[ -n "$a" ] 返回 true。
$检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。

实例.字符串运算符实例如下:

a="abc"
b="efg"
?
if [ $a = $b ]
then
  echo "$a = $b : a 等于 b"
else
  echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
  echo "$a != $b : a 不等于 b"
else
  echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
  echo "-z $a : 字符串长度为 0"
else
  echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
  echo "-n $a : 字符串长度不为 0"
else
  echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
  echo "$a : 字符串不为空"
else
  echo "$a : 字符串为空"
fi

执行脚本,输出结果如下所示:

abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空

16.13Shell echo命令

Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出。命令格式:

echo string

您可以使用echo实现更复杂的输出格式控制。

16.13.1.显示普通字符串:

echo "It is a test"

这里的双引号完全可以省略,以下命令与上面实例效果一致:

echo It is a test

16.13.2.显示转义字符

echo "\"It is a test\""

结果将是:

"It is a test"

同样,双引号也可以省略

16.13.3.显示变量?

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

#!/bin/sh
read name 
echo "$name It is a test"

以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:

[root@www ~]# sh test.sh
OK ? ? ? ? ? ? ? ? ? ? #标准输入
OK It is a test ? ? ?  #输出

16.13.4.显示换行

echo -e "OK! \n" # -e 开启转义
echo "It is a test"

输出结果:

OK!
?
It is a test

16.13.5.显示不换行

#!/bin/sh
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"

输出结果:

OK! It is a test

16.13.6.显示结果定向至文件

echo "It is a test" > myfile

16.13.7.原样输出字符串,不进行转义或取变量(用单引号)

echo '$name\"'

输出结果:

$name\"

16.13.8.显示命令执行结果

echo `date`

注意: 这里使用的是反引号 `, 而不是单引号 '

结果将显示当前日期

Thu Jul 4 10:08:46 CST 2021

16.14Shell printf 命令

printf 命令模仿 C 程序库(library)里的 printf() 程序。

printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。

printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n

printf 命令的语法:

printf  format-string  [arguments...]

参数说明:

  • format-string: 为格式控制字符串

  • arguments: 为参数列表。

接下来,我来用一个脚本来体现 printf 的强大功能:

实例

printf "%-10s %-8s %-4s\n"  姓名 性别 体重kg ?
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876

执行脚本,输出结果如下所示:

姓名 ? ? 性别 ? 体重kg
郭靖 ? ? 男 ? ?  66.12
杨过 ? ? 男 ? ?  48.65
郭芙 ? ? 女 ? ?  47.99

%s %c %d %f 都是格式替代符,

  • %s 输出一个字符串,

  • %d 整型输出,

  • %c 输出一个字符,

  • %f 输出实数,以小数形式输出。

  • %-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

  • %-4.2f 指格式化为小数,其中 .2指保留2位小数。

16.15Shell test 命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。


16.15.1数值测试

参数说明
-eq等于则为真
-ne不等于则为真
-gt大于则为真
-ge大于等于则为真
-lt小于则为真
-le小于等于则为真

16.15.2字符串测试

参数说明
=等于则为真
!=不相等则为真
-z 字符串字符串的长度为零则为真
-n 字符串字符串的长度不为零则为真

16.16Shell 流程控制

和 Java、PHP 等语言不一样,sh 的流程控制不可为空,如(以下为 PHP 流程控制写法):

16.16.1 if else

16.16.1.1 fi

if 语句语法格式:

if condition
then
 ?  command1 
 ?  command2
 ?  ...
 ?  commandN 
fi

写成一行(适用于终端命令提示符):

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

末尾的 fi 就是 if 倒过来拼写,后面还会遇到类似的。

16.16.1.2 if else

if else 语法格式:

if condition
then
 ?  command1 
 ?  command2
 ?  ...
 ?  commandN
else
 ?  command
fi

16.16.1.3 if else-if else

if else-if else 语法格式:

if condition1
then
 ?  command1
elif condition2 
then 
 ?  command2
else
 ?  commandN
fi

以下实例判断两个变量是否相等:

16.16.2 for 循环

与其他编程语言类似,Shell支持for循环。

for循环一般格式为:

for var in item1 item2 ... itemN
do
 ?  command1
 ?  command2
 ?  ...
 ?  commandN
done

写成一行:

for var in item1 item2 ... itemN; do command1; command2… done;

当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。

in列表是可选的,如果不用它,for循环使用命令行的位置参数。

16.16.3 while 语句

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为:

while condition
do
 ?  command
done

while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。

16.16.4 无限循环

无限循环语法格式:

while :
do
 ?  command
done

或者

while true
do
 ?  command
done

或者

for (( ; ; ))


16.16.5 until 循环

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

until 语法格式:

until condition
do
 ?  command
done

condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。


16.16.6 case ... esac

case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束,跳出整个 case ... esac 语句,esac(就是 case 反过来)作为结束标记。

可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。

case ... esac 语法格式如下:

case 值 in
模式1)
 ?  command1
 ?  command2
 ?  ...
 ?  commandN
 ?  ;;
模式2)
 ?  command1
 ?  command2
 ?  ...
 ?  commandN
 ?  ;;
esac

case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。


16.16.7 跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。

16.16.7.1 break命令

break命令允许跳出所有循环(终止执行后面的所有循环)。

16.16.7.2 continue

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

16.17 Shell 函数

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

shell中函数的定义格式如下:

[ function ] funname [()]
{
  action;
  [return int;]
}

说明:

  • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。

  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。


16.17.1 函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

参数处理说明
$#传递到脚本或函数的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$$脚本运行的当前进程ID号
$!后台运行的最后一个进程的ID号
$@与$*相同,但是使用时加引号,并在引号中返回每个参数。
$-显示Shell使用的当前选项,与set命令功能相同。
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

16.18 Shell 输入/输出重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。

重定向命令列表如下:

命令说明
command > file将输出重定向到 file。
command < file将输入重定向到 file。
command >> file将输出以追加的方式重定向到 file。
n > file将文件描述符为 n 的文件重定向到 file。
n >> file将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m将输出文件 m 和 n 合并。
n <& m将输入文件 m 和 n 合并。
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输入。

需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。


16.18.1 输出重定向

重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:

command1 > file1

上面这个命令执行command1然后将输出的内容存入file1。

注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符。


16.18.2 输入重定向

和输出重定向一样,Unix 命令也可以从文件获取输入,语法为:

command1 < file1

这样,本来需要从键盘获取输入的命令会转移到文件读取内容。

注意:输出重定向是大于号(>),输入重定向是小于号(<)。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 12:20:35  更:2021-10-17 12:21:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 19:42:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码