视频地址:兄弟连新版Linux
后面觉得讲的太繁琐,就回去看书了书名《linux就该这么学》
UNIX发展历史
1965年,MIT、GE以及AT&T得贝尔实验室联合开发Multics工程计划,目标是开发一种交互式的具有多道程序处理能力的分时操作系统,但因为Multics追求的目标过于庞大复杂,项目进度远远落后计划,最后贝尔实验室宣布退出
1969年,贝尔实验室肯·汤普森在DEC PDP-7机器上开发出了UNIX系统
1971年,肯·汤普森同时丹尼斯·里奇发明了C语言;1973年,UNIX系统的绝大部分代码使用C语言重写,这为了提高UNIX系统的可移植性打下基础
UNIX主要发行版本
操作系统 | 公司 | 硬件平台 |
---|---|---|
AIX | IBM | PowerPC |
HP-UX | HP | PA-RISC |
Solaris | Sun | SPARC |
Linux | Red 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的企业服务器
嵌入式应用
Linux在电影娱乐业
虚拟机安装和双系统安装网络教程很多,自行查找
我是使用wsl来运行unbuntu的。使用最新版win10(好像是1908版本以上)
设置-系统-关于中可以查看当前系统版本,如果不是1908请升级win10版本
win+s搜索-启用或关闭Windows功能打开后把适用于Linux的Windows子系统打勾,之后重启电脑
重启之后打开Microsoft Store,搜索你想安装的Linux发行版,ubuntu,centos等都可以搜到
打开你想安装的系统详情点击获取,之后点击安装,就会开始下载和自动安装,安装完成后可以在开始菜单中找到
点击就可以运行了,运行界面为
硬盘文件是 /dev/sd[a-p]
光盘文件是 /dev/sr0
但一般通过自己加一些扩展名来区分文件
压缩包:.gz .bz2 .tar.bz2 .tgz
二进制软件包:.rpm
网页文件: .html .php
脚本文件: .sh
配置文件: .conf
远程服务器不允许关机,只能重启
重启时应该关闭服务
不要再服务器访问高峰运行高负载命令
远程配置防火墙时不要把自己踢出服务器
制定合理的密码规范并定期更新
合理分配权限
定期备份重要数据和日志
命令格式:命令 [-选项] [参数]
例:ls -la /etc
说明:1)个别命令使用不遵循此格式
2)当有多个选项时,可以写在一起
3)简化选项与完整选项 -a等于–all
目录处理命令: 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 [参数] 下载地址
ps:查看系统中的进程状态
格式:ps [参数]
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是必须要写的。
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
...
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
虽然都是输出重定向技术,但是不同命令的标准输出和错误输出还是有区别的
把前一个命令原本要输出到屏幕的数据当作后一个命令的标准输入
qq394085448@USER-20190914DN:~$ grep "/sbin/nologin" /etc/passwd |wc -l
25
qq394085448@USER-20190914DN:~$ ls -l /etc/ | more
管道命令符可以同时使用好几个命令,可以将其描述成“任意门”。实现数据穿越,帮助我们提高工作效率,完成之前不敢想象的复杂工作
通配符就是通用的匹配信息的符号
*:代表匹配零个或多个字符
?:代表匹配单个字符
中括号加[0~9]:代表匹配0~9之间的单个数字的字符
中括号加[abc]:代表匹配a、b、c三个字符中的任意一个字符
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串
单引号(‘’):转义其中所有的变量为单纯的字符串
双引号(“”):保留其中的变量属性,不进行转义处理
反引号(``):把其中的命令执行后返回结果
在Linux系统中,变量名称一般都是大写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。
我们可以使用env命令来查看到Linux系统中所有的环境变量,其中一些重要的有
变量名称 | 作用 |
---|---|
HOME | 用户的主目录(即家目录) |
SHELL | 用户在使用的Shell 解释器名称 |
HISTSIZE | 输出的历史命令记录条数 |
HISTFILESIZE | 保存的历史命令记录条数 |
邮件保存路径 | |
LANG | 系统语言、语系名称 |
RANDOM | 生成一个随机数字 |
PS1 | Bash 解释器的提示符 |
PATH | 定义解释器搜索用户执行命令的路径 |
EDITOR | 用户默认的文本编辑器 |
例:
qq394085448@USER-20190914DN:~$ echo $HOME
/home/qq394085448
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
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终端解释器可以当作人与计算机硬件之间的“翻译官”,它作为用户与Linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环、分支等高级编程语言才有的控制结构特性。
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