Linux基础命令、管道符、重定向与环境变量、Vim编辑器与Shell命令脚本
最近看了一本刘遄老师写的一本Linux书籍,感觉写得挺好,并做了点笔记
常用系统工作命令
1、echo命令
echo命令用于在终端输出字符串或变量提取后的值,格式为“echo [字符串|$ 变量]”
例如:
echo Linuxprobe.com
输出:Linuxprobe.com
使用 $ 变量的方式提取变量SHELL的值,并将其输出到屏幕上(补充:不同的地方 $ 符号的定义不同,在bash里这个符号一般表示普通用户的命令提示符(可更改),在bash脚本里。$ 开头表示变量;$ str表示变量,可赋值等操作;$是变量引用操作符,如:a=10; echo $a会输出10)
echo $SHELL
输出:/bin/zsh
2、data命令
data命令用于显示及设置系统的时间或日期,格式为“data [选项][+指定的格式]”
例如:
date
输出:2019年11月12日星期二16:48:03 CST
按照年月日小时分钟秒的格式查看当前系统时间的date命令
date “+%Y-%m-%d %H:%M:%S”
输出:2019-11-12 16:52:37
3、reboot命令
reboot命令用于重启系统,其格式为reboot;由于重启计算机这种操作会涉及硬件资源的管理权限,因此默认只能使用root管理员来重启
4、poweroff命令
poweroff命令用于关闭系统,其格式为poweroff;该命令与reboot命令相同,都会涉及硬件资源的管理权限,因此默认只有root管理员才可以关闭电脑
5、wget命令
wget命令用于在终端中下载网络文件,格式为“wegt[参数]下载地址”
6、ps命令
ps命令用于查看系统中的进程状态,格式为“ps[参数]”
7、top命令
top命令用于动态地监视进程活动与系统负载等信息,其格式为“top”
top命令相当强大,能够动态地查看系统运维状态,完全将它看作linux中的任务管理器
8、pidof命令
pidof命令用于查询某个指定服务进程的pid值,格式为“pidof[参数][服务名称]”
每个进程的进程号码值(PID)是唯一的,因此可以通过PID来区分不同的进程
例如,可以使用如下命令来查询本机上sshd服务的PID:
pidof sshd
输出:2215
9、kill命令
kill命令用于终止某个指定PID的服务进程,格式为“kill[参数][进程PID]”
10、killall命令
killall命令用于终止某个指定名称的服务所对应的全部进程,格式为“killall[参数][服务器名称]”
系统状态检测命令
1、ifconfig命令
ifconfig命令用于获取网卡配置与网络状态等信息,格式为“ifconfig[网络设备][参数]”
使用ifconfig命令来查看本机当前的网卡配置与网络状态等信息时,其实主要查看的就是网卡名称、inet参数后面的ip地址、ether参数后面的网卡物理地址(又称为mac地址),以及rx、tx的接收数据包与发送数据包的个数及累计流量
2、uname命令
uname命令用于查看系统内核与系统版本等信息,格式为“uname[-a]”一般固定搭配-a参数来完整的查看当前系统的内核名称、主机名、内核发型版本、节点名、系统时间、硬件平台、处理器类型以及操作系统名称信息
3、uptime命令
uptime用于查看系统的负载信息
4、free命令
free用于显示当前系统中内存的使用量信息,格式为“free[-h]”
5、who命令
who用于查看当前登入主机的用户终端信息,格式为“who[参数]”
6、last命令
last命令用于查看所有系统的登录记录,格式为“last[参数]”
7、history命令
history命令用于显示历史执行过的命令,格式为“history[-c]”
历史命令会被保存到用户家目录中的.bash_history文件中。Linux系统中以点(.)开头放入文件均为隐藏文件,这些文件大多数为系统服务文件,可以用cat命令查看其文件内容
cat ~/ .bash_history
要清空当前用户在本机上执行的linux命令历史记录信息,可执行如下命令
history -c
8、sosreport命令
sosreport命令用于收集系统配置及构架信息并输出诊断文档,格式为“sosreport”
工作目录切换命令
1、pwd命令
pwd命令用于显示用户当前所处的工作目录,格式为“pwd[选项]”
2、cd命令
cd命令用于切换工作路径,格式为“cd[目录名称]”
cd - 返回上一次所处目录 cd . . 进入上级目录 cd ~ 切换到当前用户的家目录
3、ls命令
ls命令用于显示目录中的文件信息,格式为“ls[选项][文件]”
参数-a是可以看到全部文件(包括隐藏文件),使用-l可以查看文件的属性、大小等详细信息。将这两个参数整合后,可以看到当前目录中的所有文件并输出这些文件的属性信息
ls -al
如果要看到目录属性信息,则需要额外添加一个-d参数
ls -ld
文本文件编辑命令
1、cat命令
cat命令用于查看纯文本文件(内容较少的),格式为“cat[选项][文件]”
如果在查看文本内容时还想顺便再显示行号的话,可以在cat命令后面追加一个-n参数
2、more命令
more命令用于查看纯文本文件(内容较多的),格式为“more[选项]文件”
3、head命令
head命令用于查看纯文本文档的前n行,格式为“head[选项][文件]”
head -20 voc.cfg
4、tail命令
tail命令用于查看纯文本文档的后n行或持续刷新的内容,格式为“tail[选项][文件]”
tail命令最强悍的功能是可以持续刷新一个文件的内容,当想要实时查看最新日志文件时,此时的命令格式为“tail -f 文件名”
5、tr命令
tr命令用于替换文本文件中的字符 ,格式为“tr[原始字符][目标字符]”
cat anaconda-ks.cfg | tr [a-z] [A-Z]
6、wc命令
wc命令用于统计指定文本的行数、字数、字节数,格式为“wc[参数] 文本”
7、stat命令
stat命令用于查看文件的具体存储信息和时间等信息,格式为“stat 文件名”
8、cut命令
cut命令用于按“列”提取文本字符,格式为“cut[参数] 文本”
9、diff命令
diff命令用于比较多个文本的差异,格式为“diff[参数]文件”
可以使用–brief参数来确认两个文件是否不同
文件目录管理命令
1、touch命令
touch命令用于创建空白文件或设置文件的时间,格式为“touch[选项][文件]”
touch linuxprobe命令可以创建出一个名为linuxprobe的空白文本文件
2、mkdir命令
mkdir命令用于创建空白的目录,格式为“mkdir[选项]目录”
除了能创建单个空白目录外,mkdir命令还可以结合-p参数来递归创建出具有嵌套层关系的文件目录
mkdir -p a/b/c/d/e
3、cp命令
cp命令用于复制文件或目录,格式为“cp[选项] 源文件 目标文件”
cp -r 递归持续复制(用于目录)
touch install.log
cp install.log x.log
ls
Install.log x.log
4、mv命令
mv用于剪切文件或将文件重命名,格式为“mv[选项] 源文件 [目标路径|目标文件名]”
如果在同一个目录中对一个文件进行剪切操作,其实也就是对其重命名
mv x.log linux.log
5、rm命令
rm命令用于删除文件或目录,格式为“rm[选项]文件”
在rm命令后面跟上-f参数来强制删除,若想删除一个目录,需要在rm命令后面加-r
6、dd命令
dd命令用于按照制定大小和个数的数据块来复制文件或转移文件,格式为“dd[参数]”
dd if=/dev/zero of=560_file count=1 bs=560M
dd if=/dev/cdrom of=RHEL-server-7.0-x86_64-LinuxProbr.Com.iso
7、file命令
file命令用于查看文件的类型,格式为“file文件名”
在linux系统中,由于文本、目录、设备等所有这些一切都统称为文件,而我们又不能单凭后缀就知道具体的文件类型,这时就需要使用file命令来查看文件类型了
打包压缩与搜索命令
1、tar命令
tar命令用于对文件进行打包压缩或解压,格式为“tar[选项][文件]”
-c创建压缩文件-x解开压缩文件-v参数不断显示压缩或解压过程
一般使用“tar -czvf 压缩包名称.tar.gz 要打包的目录”命令把指定目录进行打包压缩
同样“tar -xzvf 压缩包名称.tar.gz”进行解压
tar -czvf etc.tar.gz /etc
tar xzvf etc.tar.gz -C /root/etc (-C参数是用于指定要解压到哪个指定的目录)
2、grep命令
grep命令用于在文本中执行关键词搜索,并显示匹配结果,格式为“grep[选项][文件]”
-n参数用来显示搜索到信息的行号;-v参数用于反选信息(即没有包含关键词的所有信息行)
3、find命令
find命令用于按照指定条件来查找文件,格式为“find[查找路径] 寻找条件 操作”
-exec 这个参数是把find搜索到的结果交由紧随其后的命令做进一步处理
find / -user linuxprobe -exec cp -a {} /root/findresults/ \;
上述命令的作用是在整个文件系统中找出所有归属于linuxprobe用户的文件并复制到/root/findresults目录;注意{}表示find搜索出的每一个文件,并且命令结尾必须是“;”
输入输出重定向
输入重定向是指把文件导入到命令中,而输出重定向则是把原本要输出到屏幕的数据信息写入到指定文件中
命令>>文件 将标准输出重定向到一个文件中(追加到原有内容的后面)
命令>文件 将标准输出重定向到一个文件中(清空原有文件的数据)
命令2>文件 将错误输出重定向到一个文件中(清空原有文件的数据)
命令&>>文件 将标准输出和错误输出共同写入到文件中(追加到原有内容后面)
echo “Welcome to LinuxProbe.Com” > readme.txt
echo “Quality linux learning materials” >> readme.txt
cat readme.txt
输出:Welcome to LinuxProbe.Com
Quality linux learning materials
管道命令符
作用是把前一个命令原本要输出到屏幕的标准正常数据当做是最后一个命令的标准输入,格式为“命令A | 命令B”
将下面两条命令合成一条
#找出被限制登录用户的命令式 grep “/sbin/nologin” /etc/passwd
#统计文本行数的命令则是wc -l
grep “/sbin/nologin” /etc/passwd | wc -l
输出 33
当然,管道命令符也可以:“命令A | 命令B| 命令C”
命令行的通配符
顾名思义,通配符就是通用的匹配信息的符号,比如星号(* ) 代表匹配零个或多个字符,问号(?)代表匹配单个字符,中括号内加上数字[0-9]代表匹配0~9之间的单个数字的字符,而中括号内加上字母[abc]则代表匹配a、b、c三个字符中的任意一个字符。
#匹配所有在/dev目录中且以sda开头的文件:
ls -l /dev/sda*
#匹配文件名为sda开头,但后面还紧跟其他某一个字符的文件相关信息
ls -l /dev/sda?
常用的转义字符
Shell解释器提供了特别丰富的转义字符来处理输入的特殊数据
4个最常用的转义字符如下所示:
反斜杠(\):使反斜杠后面的一个变量变为单纯的字符串。
单引号(‘’):转义其中所有的变量为单纯的字符串。
双引号(“”):保留其中的变量属性,不进行转义处理。
反引号(``):把其中的命令执行后返回结果。
#定义一个名为PRICE的变量并赋值为5,然后输出以双引号括起来的字符串与变量信息:
PRICE=5
echo “Price is $PRICE”
输出:Prince is 5
#接下来,我们希望能够输出“Price is $5”:
echo “Price is \$$PRICE”
输出:Price is $5
#例如,将反引号与uname-a命令结合,然后使用echo命令来查看本机的Linux版本和内核信息:
echo `uname -a`
输出:Linux linuxprobe.com 3.10.0-123...............(省略)
重要的环境变量
变量是计算机系统用于保存可变值的数据类型。在Linux系统中,变量名称一般都是大写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。
用户执行了一条命令之后,Linux系统中到底发生了什么事情呢?命令在Linux中主要执行分为四个步骤
第一步:判断用户是否以绝对路径或者相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行。
第二步:Linux系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原来的命令名称。
第三步:Bash解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交给步骤四处理;可以使用“type命令名称”来判断用户输入的命令是内部命令还是外部命令。
第四步:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫做PATH。PATH是由多个路径组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash解释器对Linux命令的查找。(PATH变量的作用是什么?设定解释器搜索所执行的命令的路径)
我们可以使用env命令来查看Linux系统中的所有的环境变量
su 是用于切换用户身份的命令
变量是由固定的变量名与用户或系统设置的变量值两部分组成的;
这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用,使用export命令将其提升为全局变量,这样其他用户也可以使用它了
Vim编辑器与Shell命令脚本
Vim编辑器中设置了三种模式——命令模式、末行模式、编辑模式
命令模式:控制光标移动,可对文本进行复制、黏贴、删除和查找等工作
输入模式:正常的文本录入
末行模式:保存或退出文档,以及设置编辑环境
在每次运行Vim编辑器中,默认进入命令模式,此时需要先切换到输入模式后再进行文档编写工作,而每次在编写完文档之后需要先返回命令模式,然后再进入末行模式,执行文档的保存或退出操作。在Vim中,无法直接从输入模式切换到末行模式。
要想切换到末行模式,在命令模式中输入一个冒号就可以了。
编写脚本文档的第一步就是给文档取个名字,这里取名为practice.txt。如果存在该文件,则打开它。如果不存在,则是创建一个临时的输入文件
vim practice.txt
打开practice.txt文档后,默认进入的是vim编辑器的命令模式。此时只能执行该模式下的命令,而不能随意输入文本内容,我们需要切换到输入模式才可以编写文档。
可以分别使用a、i、o三个键从命令模式切换到输入模式。其中,a键与i键分别是在光标后面一位和光标当前位置切换到输入模式,而o键则是在光标的下面再创建一个空行,此时可敲击a键进入到编辑器的输入模式。
进入到输入模式后,可以随意输入文本内容,vim编辑器不会把您输入的文本内容当做命令执行。
在编写完之后,想要保存退出,必须先敲击键盘esc键从输入模式返回命令模式,然后再输入:wq!切换到末行模式才能完成保存退出操作;当在末行模式中输入:wq!命令时,就意味着强制保存并退出文档。然后用cat命令查看保存后的文档内容
cat practice.txt
若要继续编辑这个文档,因为要在原有文本内容的下面追加内容,所以在命令模式中敲击o键进入输入模式会更高效
编写shell脚本
可以将shell终端解释器当做人与计算机硬件之间的“翻译官”,它作为用户与linux系统内部的通信媒介,除了能够支持各种变量与参数外。还提供了诸如循环、分支等高级编程语言才有的控制结构特性。要想正确使用shell中的这些功能特性,准确下达命令尤其重要。
shell脚本命令的工作方式有两种:交互式和批处理
交互式:用户每输入一条命令就立即执行
批处理:由用户先编好一个完整的shell脚本,shell会一次执行脚本中诸多的命令
在shell脚本中不仅会用到前面学习过的很多Linux命令以及正则表达式、管道符、数据流重定向等语法规则,还需要把内部功能模块化后通过逻辑语句进行处理,最终形成日常所用的shell脚本
查看SHELL变量可以发现当前系统已经默认使用Bash作为命令行终端解释器了;
其实就是使用vim编辑器把linux命令按照顺序依次写入到一个文件中,这就是一个简单的脚本了
vim example.sh
#!/bin/bash
#For Example BY linuxprobe.com
pwd
ls -al
Shell脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将.sh 后缀加上,以表示是一个脚本文件。在上面的这个example.sh脚本中实际出现了三种不同的元素:第一行的脚本声明(#!)用来告诉系统使用哪种shell解释器来执行该脚本;第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或者他人在日后看到这个脚本内容时,可以快速知道该脚本的作用或一些警告信息;第三行第四行的可执行语句也就是我们平时执行的linux命令了
bash example.sh
除了上面用 bash 解释器命令直接运行 Shell 脚本文件外,第二种运行脚本程序的方法是通过输入完整路径的方式来执行。但默认会因为权限不足而提示报错信息,此时只需要为脚本文件增加执行权限即可
./example.sh
chmod u+x example.sh
接收用户的参数
Shell脚本已经内设了用于接收参数的变量,变量之间可以使用空格间隔。例如 $ 0对应的是当前shell脚本程序的名称,$ #对应的是总共有几个参数,$ * 对应的是所有位置的参数值,$ ?对应的是显示上一次命令的执行返回值,而$1、$2、$3、…则分别对应着第N个位置的参数值
vim example.sh
#!/bin/bash
echo “当前脚本名称为$0”
echo “总共有$#个参数,分别是$*”
echo “第一个参数是$1,第五个参数是$5”
sh example.sh one two three four five six
当前脚本名称为example.sh
总共有6个参数,分别是one two three four five six
第一个参数是one,第五个参数是five
判断用户的参数
Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则立即返回数字0,否则便返回其他随机数值。
测试语句格式:[ 条件表达式 ] 注:括号里面两边均应有一个空格
按照测试对象来划分,条件测试语句可以分为4种:
#文件测试语句
#逻辑测试语句
#整数值比较语句
#字符串比较语句
下面使用文件测试语句来判断/etc/fstab 是否为一个目录类型的文件,然后通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为 0,则目录存在;如果返回值 为非零的值,则意味着目录不存在:
[ -d /etc/fstab ]
echo $?
输出:1(-d是判断文件是否为目录)
[ -f /etc/fstab ]
echo $?
输出:0(-f判断文件是否为一般文件)
逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果;
在shell终端中逻辑“与”&&,它表示当前面的命令执行成功后才会执行它后面的命令;
[ -e /dev/cdrom ] && echo “Exist”
输出:Exist (-e判断文件是否存在)
还有逻辑“或”||,表示当前面的命令执行失败后才会执行它后面的命令;
第三种逻辑语句是“非”!,它表示把条件测试中的判断结果取相反值;如果原本测试的结果是正确的,则将其变成错误的;原本正确的将变成错误的。
[ ! $USER = root ] || echo “administrator”
输出:administrator
当前我们正在登录的即为管理员用户—root。下面这个示例的执行顺序是,先判断当前登录用户的 USER 变量名称是否等于 root,然后用逻辑运算符“非”进行取反操作,效果就变成了判断当前登录的用户是否为非管理员用户了。最后若条件成立则会根据逻辑“与”运算符输出 user 字样;或条件不满足则会通过逻辑“或”运算符输出 root 字样,而如果前面的 &&不成立才会执行后面的||符号。
[ ! $USER = root ] && echo “user” || echo “root”
输出:root
整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,而且不能想当然的使用日常生活中的等号、大于号、小于号等来判断。因为等号与赋值命令符冲突,大于号和小于号分别于输出重定向命令符和输入重定向命令符冲突;
[ 10 -gt 10 ]
echo $?
输出:1(-gt表示是否大于)
[ 10 -eq 10 ]
echo $?
输出:0(-eq表示是否等于)
曾经讲过 free 命令,它可以用来获取当前系统正在使用及可用的内存量信息。
接下来先使用 free -m 命令查看内存使用量情况(单位为 MB),然后通过 grep Mem:命令过滤 出剩余内存量的行,再用 awk '{print $4}'命令只保留第四列,最后用
FreeMem=`语句`
的方式把语句内执行的结果赋值给变量。
FreeMem=`free -m | grep Mem: | awk ‘{print $4}’`
echo $FreeMem
输出:95940
我们使用整数运算符来判断内存可用量的值是否小于 102400,若小 于则会提示“Insufficient Memory”(内存不足)的字样:
[ $FreeMem -lt 102400 ] && echo “Insufficient Memory”
输出:Insufficient Memory(-lt表示是否小于)
字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值);
接下来通过String变量是否为空值,进而判断是否定义了这个变量:
[ -z $String ]
echo $?
输出:0(-z表示判断字符串内容是否为空)
echo $LANG
输出:en_US.UTF-8
[ $LANG != “en.US” ] && echo “Not en.US”
输出:Not en.US (!=表示比较字符串内容是否不同,=表示比较字符串内容是否相同)
流程控制语句
if条件测试语句
单分支
if 目录不存在
then 创建该目录
fi
双分支
这里的脚本主要使用 ping 命令来测试与对方主机的网络联通性,而 Linux 系统中的 ping 命令不像 Windows 一样尝试 4 次就结束,因此为了避免用户等待时间过长,需要通过-c 参数来规定尝试的次数,并使用-i 参数定义每个数据包的发送间隔,以及使用-W 参数定义等待超时时间
在 Linux 系统中,read 是用来读取用户输入信息的命令, 能够把接收到的用户输入信息赋值给后面的指定变量,-p 参数用于向用户显示一定的提示信息。在下面的脚本示例中,只有当用户输入的分数大于等于 85 分且小于等于 100 分,才输出 Excellent 字样;若分数不满足该条件(即匹配不成功),则继续判断分数是否大于等于 70 分且小于等于 84 分,如果是,则输出 Pass 字样;若两次都落空(即两次的匹配操作都失败了),则输出 Fail 字样:
for条件循环语句
下面使用 for 循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账户并设置密码。首先创建用户名称的列表文件 users.txt,每个用户名称单独一行。读者可以自行决定 具体的用户名称和个数:
接下来编写 Shell 脚本 Example.sh。在脚本中使用 read 命令读取用户输入的密码值,然后赋值给 PASSWD 变量,并通过-p 参数向用户显示一段提示信息,告诉用户正在输入的内容 即将作为账户密码。在执行该脚本后,会自动使用从列表文件 users.txt 中获取到所有的用户名称,然后逐一使用“id 用户名”命令查看用户的信息,并使用$?判断这条命令是否执行成 功,也就是判断该用户是否已经存在。需要多说一句,/dev/null 是一个被称作 Linux 黑洞的文件,把输出信息重定向到这个文件等同于删除数据(类似于没有回收功能的垃圾箱),可以让用户的屏幕窗口保持简洁。
执行批量创建用户的 Shell 脚本 Example.sh,在输入为账户设定的密码后将由脚本自动检查并创建这些账户。由于已经将多余的信息通过输出重定向符转移到了/dev/null 黑洞文件中,因此在正常情况下屏幕窗口除了“用户账户创建成功”(Create success)的提示后不会有其他内容。在 Linux 系统中,/etc/passwd 是用来保存用户账户信息的文件。如果想确认这个脚本是否成功创建了用户账户,可以打开这个文件,看其中是否有这些新创建的用户信息。
脚本中出现的$(命令)是一种完全类似于转义字符中反引号
`命令`
的 Shell 操作符,效果同样是执行括号或双引号括起来的字符串中的命令。
while条件循环语句
case条件测试语句
本文记录的并不是很详细,如有需求可查阅相关书籍!