Linux学习笔记-随即更新-慢速学习

视频地址:兄弟连新版Linux
后面觉得讲的太繁琐,就回去看书了书名《linux就该这么学》

Linux系统简介

UNIX发展历史和发行版本

UNIX发展历史

  1. 1965年,MIT、GE以及AT&T得贝尔实验室联合开发Multics工程计划,目标是开发一种交互式的具有多道程序处理能力的分时操作系统,但因为Multics追求的目标过于庞大复杂,项目进度远远落后计划,最后贝尔实验室宣布退出

  2. 1969年,贝尔实验室肯·汤普森在DEC PDP-7机器上开发出了UNIX系统

  3. 1971年,肯·汤普森同时丹尼斯·里奇发明了C语言;1973年,UNIX系统的绝大部分代码使用C语言重写,这为了提高UNIX系统的可移植性打下基础

UNIX主要发行版本

操作系统公司硬件平台
AIXIBMPowerPC
HP-UXHPPA-RISC
SolarisSunSPARC
LinuxRed Hat、Ubuntu、debain、deepin…IA(Intel、AMDCyrix、RISE…)

Linux被称为类UNIX系统,也属于UNIX的分支

Linux发展历史

1991年,芬兰大学李纳斯(Linus Torvalds)和后来陆续加入的众多爱好者共同完成。

Linux是开源软件,源代码开放的UNIX

Linux内核官网: www.kernel.org

Linux主要发行版本

redhat、centos、suse、fedora、红旗Linux

debian、ubuntu、deepin

开源软件简介

  • 使用的自由:绝大多数开源软件免费
  • 研究的自由:可以获得软件源代码
  • 散布及改良的自由:可以自由传播、改良甚至销售

支撑互联网的开源技术

LAMP架构

Linux 操作系统、Apache Web服务器、MySQL 数据库、PHP 编程语言

Linux应用领域

  1. 基于Linux的企业服务器

  2. 嵌入式应用

  3. Linux在电影娱乐业

Linux学习方法

  • 选择命令行:节省系统资源,方便远程维护
  • 帮助文档
  • 忘掉windows思维方式

Linux系统安装

虚拟机安装和双系统安装网络教程很多,自行查找

我是使用wsl来运行unbuntu的。使用最新版win10(好像是1908版本以上)

设置-系统-关于中可以查看当前系统版本,如果不是1908请升级win10版本

在这里插入图片描述

win+s搜索-启用或关闭Windows功能打开后把适用于Linux的Windows子系统打勾,之后重启电脑

在这里插入图片描述

重启之后打开Microsoft Store,搜索你想安装的Linux发行版,ubuntu,centos等都可以搜到

打开你想安装的系统详情点击获取,之后点击安装,就会开始下载和自动安装,安装完成后可以在开始菜单中找到

在这里插入图片描述

点击就可以运行了,运行界面为

在这里插入图片描述

给初学者的建议

学习linux的注意事项

  • 严格区分大小写
  • 所有内容以文件形式保存,包括硬件

硬盘文件是 /dev/sd[a-p]

光盘文件是 /dev/sr0

  • 不考扩展名区分文件类型

但一般通过自己加一些扩展名来区分文件

压缩包:.gz .bz2 .tar.bz2 .tgz

二进制软件包:.rpm

网页文件: .html .php

脚本文件: .sh

配置文件: .conf

  • 所有的储存设备都必须挂载之后才能使用,包括硬盘、U盘和光盘
  • Windows下的程序不能直接在Linux中安装和运行,当前可以通过WINE实现

服务器管理和维护建议

Linux各目录作用

  1. /bin/:存放系统命令的目录,普通用户和超级用户可执行,单用户模式可执行
  2. /sbin/:保存和系统环境设置相关的命令,超级用户可执行,普通用户可查看
  3. /usr/bin/:存放系统命令的目录,普通用户和超级用户可执行,单用户模式不可执行
  4. /usr/sbin/:存放跟文件系统不必要的系统管理命令,例如多数服务程序,超级用户可执行。
  5. /boot/:系统启动目录,保存系统启动相关的文件,如内核文件和启动引导程序
  6. /dev/:设备文件保存位置
  7. /etc/:配置文件保存目录
  8. /home/:普通用户的家目录
  9. /lib/:系统调用的函数库保存位置
  10. /lost+fount/:当系统意外崩溃时,产生的文件碎片在这里
  11. /media/:挂载目录,建议挂在媒体设备
  12. /mnt/:挂载目录,挂在额外设备
  13. /misc/:挂在NFS服务的共享目录
  14. /opt/:第三方软件保存位置
  15. /proc/:虚拟文件目录,该目录的数据并不保存在硬盘中,而保存在内存中,CPU信息,驱动,文件系统等
  16. /sys/:虚拟文件系统,保存内核信息
  17. /root/:超级用户家目录
  18. /srv/:服务数据目录
  19. /tmp/:临时目录
  20. /usr/:系统资源目录
  21. /var/:动态数据保存位置

服务器注意事项

  • 远程服务器不允许关机,只能重启

  • 重启时应该关闭服务

  • 不要再服务器访问高峰运行高负载命令

  • 远程配置防火墙时不要把自己踢出服务器

  • 制定合理的密码规范并定期更新

  • 合理分配权限

  • 定期备份重要数据和日志

Linux常用命令

文件处理命令

命令格式和目录处理命令ls

  1. 命令格式:命令 [-选项] [参数]

    ​ 例:ls -la /etc

    说明:1)个别命令使用不遵循此格式

    ​ 2)当有多个选项时,可以写在一起

    ​ 3)简化选项与完整选项 -a等于–all

  2. 目录处理命令: ls

    功能:显示目录文件

    语法: ls 选项[-ald] [文件或目录]

    ​ -a 显示所有文件,包括隐藏文件

    ​ -l 详细信息显示

    ​ -d 查看目录属性

qq394085448@USER-20190914DN:~$ ls -lh
total 4.0K
drwxrwxrwx 1 qq394085448 qq394085448  512 Sep 16 19:43 Project
-rw-r--r-- 1 qq394085448 qq394085448 4.0K Jul 17  2012 vimrc.zip

-rw-r–r–

- 文件类型( -二进制文件 d目录 l软链接文件)

rw- r– r–

u g o

u所有者 g所属组 o其他人

r读 w写 x执行

则代表:二进制文件所有者可读写,所属组可读,其他人可读

目录处理命令

mkdir :创建目录

​ mkdir -p:递归创建目录

做好目录结构规划

cd :打开目录

​ cd /…/…/…打开指定目录

​ cd … 返回上级目录

pwd:显示当前所在目录

rmdir:删除空目录

​ rmdir /…/…

cp:复制文件或目录

​ cp -r /1/2 /3:将/1/2复制到/3下

​ cp -rp /1/2 /1/3 /4:将/1目录下的2和3复制到/4下,保持目录属性

​ cp -r /1/2 /3/4:将目录1下的2复制到目录3下并改名为4

mv:剪切文件、改名

​ mv /1/2 /3:将目录1下的2剪切到目录3下

​ mv /1/2 /3/4:将目录1下的2剪切到目录3下并改名为4

​ mv 1 2:将1改名为2

rm:删除文件

​ rm 1:删除1 无法删除目录

​ rm -f 1:强制删除1

​ rm -r:删除目录目录下文件多请慎用

​ rm -rf:强制删除目录

文件处理命令

touch:创建空文件

​ 创建带空格的文件名,需要加“”

cat:显示文件内容

​ -n 显示行号

tac:显示文件内容 反向显示

more:分页显示文件内容

​ 空格或f 翻页

​ Enter 换行

​ q或Q 退出

less:分页显示文件内容可向上翻页

​ page up 向上翻页

​ 方向上 向上翻一行

​ /+关键词 搜索按n向下查找

head:显示文件前几行

​ 用法:head -n 指定行数

tail:显示文件后几行

​ 用法:tail -n 指定行数

​ tail -f 文件 动态显示文件末尾内容

tr:替换文本文件中的字符

​ 用法:tr [原始字符] [目标字符]

wc:统计指定文本的行数、字数、字节数

​ 用法:wc [参数] 文本

​ -l:只显示行数

​ -w:只显示单词数

​ -c:只显示字节数

stat:用于查看文件的具体储存信息和时间等信息

​ 用法:stat文件名称

cut:按“列”提取文本字符

​ 格式:cut [参数] 文本

diff:比较多个文本文件的差异

​ 格式:diff [参数] 文件

​ –brief:确认两个文件是否相同

​ -c:比较多个文件的差异

判断文件是否被篡改的有力神器

file:查看文件的类型

​ 格式:file 文件名

链接命令

ln:生成链接文件

​ ln -s /1/2 /3/4.soft 创建文件/1/2的软连接/3/4.soft

​ ln /1/2 /3/4.hard 创建文件/1/2的硬链接3/4.hard

软链接类似Windows的快捷方式

硬链接可以同步更新

执行查看帮助命令

man 命令

​ 空格/page down 下翻一页

​ pgae up 上翻一页

​ home 前往首页

​ end 前往尾页

​ / 从上往下搜索关键词

​ ? 从下往上搜索关键词

​ n 定位到下一个搜索到的关键词

​ N 定位到上一个搜索到的关键词

​ q 退出帮助文档

常用的系统工作命令

echo:输出字符串或变量提取后的值

​ echo [字符串|$变量]

qq394085448@USER-20190914DN:~$ echo helloworld
helloworld
qq394085448@USER-20190914DN:~$ echo $SHELL
/bin/bash

data:显示及设置系统的时间或日期

​ date [选项] [+指定的格式]

​ %t 跳格,%H 小时(00~23),%I 小时(00~12),%M 分钟(00~59)

​ %S 秒(00~59) %J 今年中的第几天

默认格式显示当前时间

qq394085448@USER-20190914DN:~$ date
Fri Sep 18 21:45:03 CST 2020

按照“年-月-日小时:分钟:秒”的格式

qq394085448@USER-20190914DN:~$ date "+%Y-%m-%d %H:%M:%S"
2020-09-18 21:45:55

设置系统时间

data -s “20170901 8:30:00”

reboot:重启命令 只能管理员使用

poweroff:关闭系统 只能管理员使用

wegt:下载网络文件

​ 格式为:wegt [参数] 下载地址

  • -b:后台下载模式
  • -P:下载到指定目录
  • -t:最大尝试次数
  • -c:断点续传
  • -p:下载页面内所有资源,包括图片、视频等
  • -r:递归下载

ps:查看系统中的进程状态

​ 格式:ps [参数]

  • -a:显示所有进程
  • -u:用户及其他详细信息
  • -x:显示没有控制终端的进程

top:动态监视进程活动与系统负载等信息 相当于任务管理器(强化版)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pyf97ygk-1600521745790)(E:\code\markdown\Linux学习笔记\top.png)]

​ 第一行:系统时间、运行时间、登陆终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟的平均值,数值越小代表心痛负载越低)

​ 第二行:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数

​ 第三行:用户占比资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲的资源百分比等。第三行数据均为百分比格式

​ 第四行:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量

​ 第五行:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量

pidof:查询某个指定服务进程的PID

​ 格式:pidof [参数] [服务名称]

kill:中止某个指定PID的服务进程

​ 格式:kill [参数] [进程PID]

killal:中止某个指定名称服务所对应的全部进程

​ 格式:killal [参数] [进程名称]

在终端中执行一个命令后,按下Ctrl+C可以立即终止该命令的进程。

执行命令时在末尾加&,命令会进入后台来执行

系统状态检测命令

ifconfig:获取网卡配置与网络状态等信息

uname:查看系统内核与系统版本等信息

​ uname -a来完整查看系统信息

uptime:用于查看系统的负载信息

free:用于显示当前系统中内存的使用量信息

​ free -h会以更加人性化的方式输出

who:查看当前登入主机的用户终端信息

last:查看所有系统的登陆记录

history:显示历史执行过的命令

显示当前用户执行过的近1000条命令,如果觉得1000条不够,可以自定义/etc/profile文件中的HISTSIZE变量值。使用history时,如果使用-c参数则会清空所有命令的历史记录。还可以使用“!编码数字”的方式来重复执行某一次的命令。

sosreport命令:收集系统配置及架构信息并输出诊断文档,格式为sosreport

系统故障时,先执行此命令简单收集系统的运行状态和服务配置信息

打包压缩与搜索命令

tar:对文件进行打包或解压

​ 格式:tar [选项] [文件]

参数作用
-c创建压缩文件
-x解开压缩文件
-t查看压缩包内有哪些文件
-z用Gzip解压或压缩
-j用bzip2 压缩或解压
-v显示压缩或解压的过程
-f目标文件名
-p保留原始的权限与属性
-P使用绝对路径来压缩
-C指定解压到的目录

一般使用“tar -czvf 压缩包名称.tar.gz 要打包的目录”来把指定文件进行打包压缩

相应的用“tar -xzvf 压缩包名称.tar.gz 要解压的目录”来进行解压缩

grep:在文本中执行关键字搜索,并显示匹配的结果

​ 格式:grep [选项] [文字]

参数作用
-b将可执行文件(binary)当作文本文件(text)来搜索
-c仅显示找到的行数
-i忽略大小写
-n显示行号
-v反向选择—仅列出没有“关键词”的行

find:按照指定条件来查找文件

​ 格式:find [查找路径] 寻找条件 操作

参数作用
-name匹配名称
-perm匹配权限(mode 为完全匹配,-mode 为包含即可)
-user匹配所有者
-group匹配所有组
-mtime -n +n匹配修改内容的时间(-n 指n 天以内,+n 指n 天以前)
-atime -n +n匹配访问文件的时间(-n 指n 天以内,+n 指n 天以前)
-ctime -n +n匹配修改文件权限的时间(-n 指n 天以内,+n 指n 天以前)
-nouser匹配无所有者的文件
-nogroup匹配无所有组的文件
-newer f1 !f2匹配比文件f1 新但比f2 旧的文件
–type b/d/c/p/l/f匹配文件类型(后面的字幕参数依次表示块设备、目录、字符设备、管道、
链接文件、文本文件)
-size匹配文件的大小(+50KB 为查找超过50KB 的文件,而-50KB 为查找小于
50KB 的文件)
-prune忽略某个目录
-exec …… {};后面可跟用于进一步处理搜索结果的命令

exec是长格式形式,但只需要一个-

获取到/etc目录中所有以host 开头的文件列表:

qq394085448@USER-20190914DN:~$ find /etc/ -name "host*" -print
/etc/cloud/templates/hosts.alpine.tmpl
/etc/cloud/templates/hosts.debian.tmpl
/etc/cloud/templates/hosts.freebsd.tmpl
/etc/cloud/templates/hosts.redhat.tmpl
/etc/cloud/templates/hosts.suse.tmpl
/etc/host.conf
/etc/hostname
/etc/hosts
/etc/hosts.allow
/etc/hosts.deny

在整个系统中搜索权限中包括SUID 权限的所有文件:

qq394085448@USER-20190914DN:~$ find / -perm -4000 -print
/bin/fusermount
/bin/mount
/bin/ping
/bin/su
/bin/umount

在整个文件系统中找出所有归属于 linuxprobe 用户的文件并复制到/root/findresults 目录。

该实验的重点是“-exec {} ;”参数,其中的{}表示find 命令搜索出的每一个文件,并且命令的结尾必须是“;”。完成该实验的具体命令如下:

find / -user linuxprobe -exec cp -a {} /root/findresults/ \

管道符、重定向与环境变量

本章通过讲解与文件输入输出有关的重定向技术的5中模式,让读者通过实验切实理解每个重定向模式的作用,解决输出信息的保存问题。然后深入讲解管道命令符,帮助读者掌握命令之间的搭配方式,进一步提高命令输出值的处理效率。讲解通配符和常见转义符,让输入的命令更加准确,为下一张编写Shell脚本打好功底。

输入输出重定向

输入重定向:把文件导入命令中

输出重定向:把原本要输出到屏幕的数据信息写入到指定文件中。

标准输入重定向(STDIN,文件描述符为0):默认从键盘输入,也可以从其他文件或命令中输入

标准输出重定向(STDOUT,文件描述为1):默认输出到屏幕。

错误输出重定向(STDERR,文件描述为2):默认输出到屏幕。

输入重定向中用到的符号及其作用

符号作用
命令<文件将文件作为命令的标准输入
命令<<分界符从标准输入中读取,直到遇见分界符才停止
命令<文件1>文件2将文件1作为命令的标准输入并将标准输出到文件2

输出重定向中用到的符号及其作用

符号作用
命令>文件将标准输出重定向到一个文件中(清空原有文件的数据)
命令 2> 文件将错误输出重定向到一个文件中(清空原有文件的数据)
命令 >> 文件将标准输出重定向到一个文件中(追加到原有内容的后面)
命令 2>>文件将错误输出重定向到一个文件中(追加到原有内容的后面)
命令 >> 文件2 > &1或命令 &>>文件将标准输出与错误输出共同写入到文件中(追加到原有内容的后面)

对于重定向中的标准输出模式,可以省略文件描述符1不写,而错误输出模式的文件描述符2是必须要写的。

尝试以下

  1. 通过标准输出重定向将man bash 命令原本要输出到屏幕的信息写入到文件readme.txt 中,然后显示readme.txt 文件中的内容。
qq394085448@USER-20190914DN:~$ man bash > readme.txt
qq394085448@USER-20190914DN:~$ cat readme.txt
BASH(1)                                        General Commands Manual                                        BASH(1)

NAME
       bash - GNU Bourne-Again SHell

SYNOPSIS
       bash [options] [command_string | file]

COPYRIGHT
 ...
  1. 首先通过覆盖写入模式向readme.txt 文件写入一行数据(该文件中包含上一个实验的man 命令信息),然后再通过追加写入模式向文件再写入一次数据
qq394085448@USER-20190914DN:~$ echo "Welcome to LinuxProbe.com" >> readme.txt
qq394085448@USER-20190914DN:~$ echo "Welcome to LinuxProbe.com" > readme.txt
qq394085448@USER-20190914DN:~$ echo "Quality linux learning materials" >> readme.txt
qq394085448@USER-20190914DN:~$ cat readme.txt
Welcome to LinuxProbe.com
Quality linux learning materials

虽然都是输出重定向技术,但是不同命令的标准输出和错误输出还是有区别的

管道命令符 |

把前一个命令原本要输出到屏幕的数据当作后一个命令的标准输入

  1. 把搜索命令的输出值传递给统计命令
qq394085448@USER-20190914DN:~$ grep "/sbin/nologin" /etc/passwd |wc -l
25
  1. 用翻页的形式查看/etc 目录中的文件列表及属性信息
qq394085448@USER-20190914DN:~$ ls -l /etc/ | more

管道命令符可以同时使用好几个命令,可以将其描述成“任意门”。实现数据穿越,帮助我们提高工作效率,完成之前不敢想象的复杂工作

命令行的通配符

通配符就是通用的匹配信息的符号

*:代表匹配零个或多个字符

?:代表匹配单个字符

中括号加[0~9]:代表匹配0~9之间的单个数字的字符

中括号加[abc]:代表匹配a、b、c三个字符中的任意一个字符

常用的转义字符

反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串

单引号(‘’):转义其中所有的变量为单纯的字符串

双引号(“”):保留其中的变量属性,不进行转义处理

反引号(``):把其中的命令执行后返回结果

重要的环境变量

在Linux系统中,变量名称一般都是大写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。

我们可以使用env命令来查看到Linux系统中所有的环境变量,其中一些重要的有

变量名称作用
HOME用户的主目录(即家目录)
SHELL用户在使用的Shell 解释器名称
HISTSIZE输出的历史命令记录条数
HISTFILESIZE保存的历史命令记录条数
MAIL邮件保存路径
LANG系统语言、语系名称
RANDOM生成一个随机数字
PS1Bash 解释器的提示符
PATH定义解释器搜索用户执行命令的路径
EDITOR用户默认的文本编辑器

例:

  1. 查看HOME变量在不同用户身份下的值
qq394085448@USER-20190914DN:~$ echo $HOME
/home/qq394085448
  1. 设置一个名称为WORKDIR的变量,方便用户轻松的进入一个层次较深的目录
qq394085448@USER-20190914DN:/home$ sudo mkdir /home/workdir
qq394085448@USER-20190914DN:/home$ WORKDIR = /home/workdir
qq394085448@USER-20190914DN:/$ WORKDIR = /home/workdir/
qq394085448@USER-20190914DN:/$ cd $WORKDIR
qq394085448@USER-20190914DN:~$ pwd
/home/qq394085448   
  1. 这样的变量不具有全局性,默认情况下不能被其他用户使用。可以使用export命令将其提升为全局变量,这样其他用户也就可以使用它了。

vim编辑器与Shell命令脚本

vim文本编辑器

Linux系统中一切都是文件,配置一个服务就是在修改其配置文件的参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s0Z7mZXa-1602247053404)(E:\code\markdown\Linux学习笔记\vim.png)]

所以在Linux系统中的日常工作肯定少不了编写文档。vim文本编辑器就是一款很棒的文本编辑器

vim编辑器中设置了三种模式——命令模式、末行模式和编辑模式

命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作初始状态或按esc进入

输入模式:正常的文本录入命令模式按a\i\o等键

末行模式:保存或退出文档,以及设置编辑环境按:键

命令模式下的一些命令

命令作用
dd删除(剪切)光标所在整行
5dd删除(剪切)从光标处开始的5 行
yy复制光标所在整行
5yy复制从光标处开始的5 行
n显示搜索命令定位到的下一个字符串
N显示搜索命令定位到的上一个字符串
u撤销上一步的操作
p将之前删除(dd)或复制(yy)过的数据粘贴到光标后面

末行模式下的一些命令

命令作用
:w保存
:q退出
:q!强制退出(放弃对文档的修改内容)
:wq!强制保存退出
:set nu显示行号
:set nonu不显示行号
:命令执行该命令
:整数跳转到该行
: s/one/two将当前光标所在行的第一个one 替换成two
: s/one/two/g将当前光标所在行的所有one 替换成two
:%s/one/two/g将全文中的所有one 替换成two
?字符串在文本中从下至上搜索该字符串
/字符串在文本中从上至下搜索该字符串

编写shell脚本

Shell终端解释器可以当作人与计算机硬件之间的“翻译官”,它作为用户与Linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环、分支等高级编程语言才有的控制结构特性。

Shell脚本命令的工作方式有两种:交互式和批处理。

交互式:用户每输入一条命令就立即完成

批处理:有用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多的命令。

编写简单的Shell脚本

使用Vim编辑器将Linux命令按照顺序依次写入到一个文件中,这就是一个简单的脚本了。

例如,如果想查看当前所在工作路径并列出当前目录下所有的文件及属性信息,实现这个功能的脚本应该类似于下面这样:

在这里插入图片描述

显示的结果就是

qq394085448@qq394085448:~$ bash example.sh
/home/qq394085448
total 60
drwxr-xr-x 1 qq394085448 qq394085448   512 Oct  8 20:31 .
drwxr-xr-x 1 root        root          512 Sep 20 20:55 ..
-rw------- 1 qq394085448 qq394085448  6059 Sep 30 11:40 .bash_history
-rw-r--r-- 1 qq394085448 qq394085448   220 Sep  2 15:01 .bash_logout
-rw-r--r-- 1 qq394085448 qq394085448  3771 Sep  2 15:01 .bashrc
drwxrwxrwx 1 qq394085448 qq394085448   512 Sep  2 16:39 .cache
drwx------ 1 qq394085448 qq394085448   512 Sep  2 15:02 .config
drwx------ 1 qq394085448 qq394085448   512 Sep  3 22:19 .emacs.d
drwxr-xr-x 1 qq394085448 qq394085448   512 Sep 13 14:43 .mono
-rw-r--r-- 1 qq394085448 qq394085448   807 Sep  2 15:01 .profile
-rw-r--r-- 1 qq394085448 qq394085448     0 Sep  2 15:10 .sudo_as_admin_successful
drwxr-xr-x 1 qq394085448 qq394085448   512 Sep 12 14:52 .vim
-rw------- 1 qq394085448 qq394085448 16449 Oct  8 20:31 .viminfo
-rw-r--r-- 1 qq394085448 qq394085448  9762 Sep 13 10:34 .vimrc
drwxrwxrwx 1 qq394085448 qq394085448   512 Sep  2 16:35 .vscode-server
-rw-rw-rw- 1 qq394085448 qq394085448   165 Sep  2 16:55 .wget-hsts
drwxrwxrwx 1 qq394085448 qq394085448   512 Sep 30 11:15 Project
-rw-r--r-- 1 qq394085448 qq394085448   283 Oct  8 20:29 example.sh

Shell 脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将.sh 后缀加上,以
表示是一个脚本文件。

上面的脚本中#代表的是注释文件,#!是告诉系统使用那种Shell解释器来执行该文件,脚本主要从#!/bin/bash这一行开始写就行。

接收用户参数

为了让Shell脚本程序更好地满足用户的一些实时需求,以便灵活的完成工作,必须要让脚本程序能够像之前执行命令那样,接受用户输入的参数。

Linux系统中的Shell脚本语言早就考虑了这些,内设了用于接收参数的变量,变量之间用空格间隔。例如$0对应的是当前Shell脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,而$1、$2、$3…则分别对应着第N个位置的参数值,

尝试编写脚本示例,通过引用上面的变量参数来看下真实效果

在这里插入图片描述

结果为

qq394085448@qq394085448:~$ sh example.sh one two three four five six
当前脚本名称为example.sh
总共有6个参数,分别是one two three four five six。
第1个参数为one,第5个参数为five。

判断用户的参数

Shell 脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值。条件测试语法的执行格式为:[ 条件表达式 ] 注意两边均应有一个空格

按照的测试对象来划分,条件测试语句可以分为4种

文件测试语句

逻辑测试语句

整数值比较语句

字符串比较语句

文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符,如下表

运算符作用
-d测试文件是否为目录类型
-e测试文件是否存在
-f判断是否为一般文件
-r测试当前用户是否有权限读取
-w测试当前用户是否有权限写入
-x测试当前用户是否有权限执行

下面使用文件测试语句来判断/etc/fstab是否为一个目录类型的文件,然后通过Shell解释器内设的$?变量显示上一条命令执行后的返回值。如果返回值为0,则目录存在;如果返回值为非零的值,则意味着目录不存在:

qq394085448@qq394085448:~$ [ -d /etc/fstab ]
qq394085448@qq394085448:~$ echo $?
1

再使用文件测试语句来判断/etc/fstab是否为一般文件,如果返回值为0,则代表文件存在,且为一般文件。

qq394085448@qq394085448:~$ [ -f /etc/fstab ]
qq394085448@qq394085448:~$ echo $?
0

逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果。例如在Shell终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令,因此可以用来判断/dev/cdrom 文件是否存在,若存在则输出Exist 字样。

qq394085448@qq394085448:~$ [ -e /etc/fstab ] && echo "Exist"
Exist

除了逻辑“与”外,还有逻辑“或”,它在Linux 系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令

qq394085448@qq394085448:~$ [ $USER = qq39408544 ] || echo "user"
user

第三种逻辑语句是“非”,在Linux 系统中的运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值。也就是说,如果原本测试的结果是正确的,则将其变成错误的;原本测试错误的结果则将其变成正确的。

qq394085448@qq394085448:~$ [ ! $USER = qq394085448 ] || echo "administrator"
administrator

整数运算比较符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,而且不能想当然地使用日常生活中的等号、大于号、小于号等来判断。因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突。因此一定要使用规范的整数比较运算符来进行操作。可用的整数比较运算符如下表

运算符作用
-eq是否等于
-ne是否不等于
-gt是否大于
-lt是否小于
-le是否等于或小于
-ge是否大于或等于

测试一下10是否大于10以及10是否等于10(通过输出的返回值内容来判断)

qq394085448@qq394085448:~$ [ 10 -eq 10 ]
qq394085448@qq394085448:~$ echo $?
0

使用free -m 命令查看内存使用量情况(单位为MB),然后通过grep Mem:命令过滤出剩余内存量的行,再用awk '{print $4}'命令只保留第四列,最后用FreeMem=`语句`的方式把语句内执行的结果赋值给变量。

qq394085448@qq394085448:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:           8137        3749        4164          17         223        4257
Swap:         15188         222       14965
qq394085448@qq394085448:~$ free -m | grep Mem:
Mem:           8137        3750        4162          17         223        4256
qq394085448@qq394085448:~$ free -m | grep Mem: |awk '{print $4}'
4168
qq394085448@qq394085448:~$ FreeMem=`free -m |grep Mem: |awk '{print $4}'`
qq394085448@qq394085448:~$ echo $FreeMem
4196

接下来使用整数运算符来判断内存可用量是否小于8192,小于的话提示“Insufficient Memory”

qq394085448@qq394085448:~$ [ $FreeMem -lt 8192 ] && echo "Insufficient Memory"
Insufficient Memory

字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。常用运算符如表

运算符作用
=比较字符串内容是否相同
!=比较字符串内容是否不同
-z判断字符串内容是否为空

判断String变量是否为空值,进而判断是否定义了这个变量

qq394085448@qq394085448:~$ [ -z $String ]
qq394085448@qq394085448:~$ echo $?
0

再尝试引入逻辑运算符来试一下。当用于保存当前语系的环境变量值LANG不是英语时,则会满足逻辑测试条件并输出“Not en.US”

qq394085448@qq394085448:~$ echo $LANG
C.UTF-8
qq394085448@qq394085448:~$ [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页