一、环境安装
需要安装三个软件
虚拟机:VMware-workstation-full-16.2.3-19376536.exe
操作系统:ubuntu-20.04.3-desktop-amd64
操作系统下载教程参考VMware虚拟机安装Ubuntu详细教程_vmvare安装ubuto-CSDN博客
.iso 终端:MobaXterm(MobaXterm .. 使用ssh(协议)对服务器进行管理,默认端口:22)
二、虚拟机与主机IP通讯操作
主机WIN+R ,cmd进入命令终端,输入ipconfig,查看主机无线局域网ipv4地址,
主机命令终端输入:ping(空格)虚拟机ip地址
虚拟机命令终端输入
ip addr
ctrl+c终止
三、MobaXterm与虚拟机链接协议ssh
1、输入命令
sudo apt install openssh-server//安装
systemctl start ssh//开启ssh
systemctl status ssh //查看状态ssh
2、 打开MobaXterm
四、基本命令
1、查看命令路径(whereis/which)
2、查看当前路径(pwd)
3、查看当前用户命令(whoami)
4、显示指定命令类型(type)
5、查看当前主机的用户登录情况(who/w)
6、重启网络服务
7、查看操作系统版本
8、显示系统所有相关信息(内核名称、主机名、版本号及硬件架构)
9、关机
10、强制关机
11、重启
whoami //查看当前用户名
pwd //查看当前路径
type ls //显示指定命令的类型是内置命令、别名、磁盘上的可执行文件
whereis cd //查找查看cd命令的详细路径
which ls //which只能查到外部命令路径,查不到内置命令
who/w //查看当前主机的用户登录情况
*******************************************************************************************
whereis和which都是精确查找命令所在路径的命令
区别在于whereis的搜索范围大于which(搜索范围是只在PATH环境变量中定义的目录内搜索可执行文件)
如果有多个同名命令,which只会输出第一个匹配的命令路径,whereis会全部输出
*****************************************************************************************
sudo service network-manager restart //重启网络服务
cat /etc/lsb-release //查看操作系统版本
lsb_release -a //查看操作系统版本
uname -a //显示系统所有相关信息内核名称、主机名、版本号及硬件架构)
命令历史:bash中可以使用↑↓逐条翻看,允许编辑并重复执行
history //命令显示所有缓存在 .bash_history中的命令。
history -c //清空历史命令
poweroff //关机
shutdown -h now //强制关机
reboot //重启
五、目录操作常用命令
1、Linux系统目录结构
所有的文件与目录都是由根目录("/")开始。
linux目录中有且只有一个根目录"/"
登录后所在位置就是主目录(家目录)
如果现在是普通用户lzy,他的主目录就是/home/lzy。
如果是超级用户root,他的主目录就是/root。
我们称这种从根目录开始不断分支下来的目录配置方式叫目录树。
如果以目录树格式查看目录需要以下命令:
sudo apt install tree //安装命令
tree -a //运行命令
2、cd命令 (change directory)
cd //切换到当前用户的主目录(/home/用户目录)
cd ~ //切换到当前用户的主目录(/home/用户目录)
cd ~username //切换到username用户的主目录
cd . //保持当前目录不变
cd .. //切换到上一级目录
cd - //切换到最近的上一次工作目录
相对路径 表示相对当前目录所在的目录位置。
绝对路径 /或者~,表示从 根目录/家目录 开始的具体目录位置。
3、ls命令(list)
ls -a //显示指定目录下所有子目录与文件,包括隐藏文件
ls -l //以列表方式显示文件的详细信息
ls -al(可以简写成ll) //以列表形式显示全部子目录与文件,包括隐藏文件
ls -S //按文件大小从小到大列表形式排列
ls -i //显示每个文件自己独有的索引号
ls -R //递归查询文件或目录
4、mkdir命令
mkdir -m 754 newdir //创建一个权限为754的newdir目录
mkdir -p a/b/c //递归创建a下的b目录和b下的c目录
5、rmdir命令\rm命令
rmdir dir1 //只能删除空目录
rm -r -f dir1 //rm主要删除指定非空目录
rm -f 1.txt //强制删除,忽略不存在的文件,无需提示
rm -r dir //递归地删除目录下的内容,删除文件夹 时必须加此参数
6、cp命令
cp file1.txt /home/user/documents/file1_copy.txt
#拷贝文件file1.txt 到 /home/user/documents/file1_copy.txt中
六、文件操作
1、文件编辑流程
sudo apt install vim //下载vim工具
touch 1.txt //创建一个空文件
touch test_{0..10}.txt //批量创建多个空文件
vim 1.txt //若文件存在,则打开文件,若文件不存在,创建并打开文件。
//进入文本默认命令模式,按i键进入文本编辑模式
//编辑好内容后,按ESC退出到命令模式,按下Shift+:进入底线命令模式
//底线命令模式下输入x或者wq,表示保存并退出。
输入q,就是不保存退出。
输入x/wq/q 后面加!,表示强制保存退出或者强制退出。
2、文件创建命令(touch)
touch 1.txt //创建一个空文件。
//如果文件已存在,仅修改当前文件的时间
touch aa-{1..20}.txt //搭配通配符批量创建多文件。
vim 2.txt //vim也可以创建2.txt文本文件,需要对该文件进行编辑
//vim只是一个文本编辑器,不编辑无法创建新的文件。
echo "abc" >> 3.txt //如果文件已经存在,会添加到该文本的最后。
//如果文件不存在,那么该命令会创建文件,并添加到文本第一行
cat 1.txt > 2.txt //使用>或>>重定向符与cat命令结合时,会创建该文件。
3、文件移动文件名修改(mv)
mv 1.txt one.txt //修改1.txt名字为one.txt
mv 1.txt /home/lzy/b //修改1.txt到目标路径下
4、文件/目录拷贝(cp)
cp -R a b //递归复制a目录及其子目录内所有内容到b目录
//此时改变b目录下的内容,a目录中的内容不会被修改
cp 1.txt 2.txt //复制1.txt内容到2.txt
5、文件拆分(split)
split -l 4 filename prefix
//会将filename文件按每个小文件包含最多4行内容分割。
//这些小文件将以prefixaa、prefixab、prefixac等形式命名(除非使用了-d选项来生成数字后缀)。
split -n 4 1.txt//不管怎么分最后得到4个文件。
split -b 10K 1.txt//按照指定大小分割1.txt, K(千字节)M(兆字节)G(吉字节)
rm x* //使用通配符删除x开头文件
6、文件全文内容查看(cat)
cat -n 1.txt//给所有行编号
cat -b 1.txt//给所有非空白行编号
cat -A 1.txt//增加显示每一行的结束字符
tac 1.txt//从最后一行倒序查看所有内容
配合重定向输入实现覆盖、追加、合并文件内容功能
cat file1.txt >> file2.txt //file1中内容追加到file2中
cat file1.txt > file2.txt //file1中内容全覆盖file2
cat file1.txt file2.txt > merged.txt //file1和file2内容合并输出到merget.txt
7、文件大小查看(wc)
wc 1.txt //显示1.txt行数、字数、字节数、文件名
wc -l 1.txt//显示1.txt行数和文件名
wc -m 1.txt//显示1.txt字符个数和文件名
wc -c 1.txt//显示1.txt字节数和文件名
wc -w 1.txt//显示1.txt单词数和文件名
wc -L 1.txt//显示1.txt最长的一行的长度和文件名
8、文件搜索(find/locate)
find [搜索路径] [选项] [动作]
find命令在没有明确指定搜索路径的情况下,默认从当前目录开始递归搜索
选项可以联合使用。
find -name "1.txt" //查找指定文件位置
find /home/user -name "2.txt" //从/home/user下开始搜索2.txt
find -perm 755 //查找指定权限的文件
find -size +2M/-2M/2M //查看指定大小的文件
find -size 0 //查看空文件
find -empty //查看空文件
find -maxdapth 数字 //查找指定最大深度的文件
*******************************************************************************************
find -type f/d/l/p/s/c/b //查找指定类型的文件
find -type f //查找所有普通文件
find -type d //查找所有目录
find -type l //查找所有符号链接
find -type p //查找所有管道文件(不常见)
find -type s //查找所有套接字文件(通常用于网络通信)
find -type c //查找所有字符设备文件(如终端设备)
find -type b //查找所有块设备文件(如硬盘分区)
如果要查找多种类型,可以组合它们(注意使用圆括号时可能需要转义或引号)
find \( -type f -o -type d \)
locate 1.txt //搜索整个文件索引数据库并列出所有文件名中包含1.txt的文件路径。
locate 1.txt | grep /home/ //结合使用grep命令来过滤locate的输出
//列出所有在/home目录或其子目录中包含1.txt的文件路径。
***************************************************************************************
find 与 locate 命令的区别:
1、find可以模糊和精确查找文件和命令、查找的范围是整个Linux系统。
2、locate可以模糊查找文件和命令。查找范围是mlocate.db。
3、locate查找速度快。但是像光盘、网盘、临时目录(/tmp)无法被找到,并且数据库不实时,要更新数据库
(命令是:sudo updatedb)
9、文件删除(rm)
rm -i file1.txt //二次确认是否删除操作
rm -rf dir //强制删除dir目录及以下文件
10、大文件全文内容查看 (more、less)
more 1.txt //分屏显示文件全部内容
more -数字 1.txt //一页展示数字个行。
more +数字 1.txt //从第数字行开始展示文件内容
进入分屏后可以使用快捷键操作
Space 显示下一屏内容
Enter 显示下一行内容
b 向前翻一页
q 退出more命令
*****************************************************************************************
less 1.txt 分屏显示文件全部内容
less -N 1.txt 每行的行首显示行号
less -i 1.txt 忽略搜索时的大小写差异。
less -m 1.txt 即在屏幕底部显示已显示内容的百分比
less -f 1.txt 强制显示文件,即使文件是一个二进制文件或特殊文件。
less -e 1.txt 文件内容显示完毕后,自动退出 less。
less -s 1.txt 将连续多个空行压缩成一行显示。
less -S 1.txt 在单行显示较长的内容时,不换行显示,而是将超出部分舍弃。
搜索寻找操作
/关键字 从当前位置开始向下搜索“关键字”。
?关键字 从当前位置开始向上搜索“关键字”。
n 在搜索模式下,查找下一个匹配项(与/或?有关)。
N 在搜索模式下,反向查找上一个匹配项(与/或?有关)。
*****************************************************************************************
对比more和less命令:
more只能用于简单的大文件内容查看,more命令只能向前翻页。
而less命令有更灵活的分页和搜索和导航功能。
less还可以与管道(|)结合使用,以查看命令的输出结果。
11、文件内容截取查看(head/tail)
head 1.txt//查看1.txt,默认前十行。
head -2 1.txt//查看前两行内容
head -n 3 1.txt//查看前三行内容
head -n -3 1.txt//查看除了倒数三行,其他行的内容
tail 1.txt //查看1.txt,默认后十行内容
tail -n +3 1.txt //查看从第三行开始到末尾所有内容。
tail -3 1.txt //查看倒数第三行到末尾所有内容
tail -n -3 1.txt //查看倒数第三行到末尾的所有内容
tail -n 3 1.txt //查看倒数第三行到末尾的所有内容
tail -f 1.txt //追踪日志1.txt,默认后十行
12、文件类型查看(file/ls -al)
file 1.txt //查看文件类型是文本文件、数据还是二进制文件以及有无动态链接库
file /etc/passwd
/etc/passwd: ASCII text
*****************************************************************************************
ls-al //也可以使用ls查看文件类型
-rw-rw-r-- 1 lzy lzy 19 7月 19 09:45 1.txt.bak
从左到右依次按位说明:
-:表示文件类型
d(Directories) 目录文件
-(Regula Files) 普通文件
l(links) 软链接文件
s(Sockets) 串口文件
c(Character Device Files) 字符文件
p(Named Pipes) 管道文件
b(Block Device Files) 块文件
rw-rw-r--:表示文件权限,权限分配顺序:文件所有者(ower)、文件所属组(group)、其他用户(other)
权限包括 r(read) 可读 代表数值4
w(write)可写 代表数值 2
x(execute)可执行 代表数值 1
1: 表示硬链接数
lzy: 表示文件所有者
lzy: 表示所在用户组
19: 表示文件大小(单位字节)
09:45: 表示文件最新时间
1.txt.bak: 表示文件名
13、二进制文件内容查看(od)
od -t f/d/c/o/x //把二进制文件按什么类型显示。
14、文件比较(diff)
diff是比较两个文件或者两个目录差异的命令。
其本质是对第一个文件做怎么样的操作变成第二个文件。
有三种模式分别是:
diff -c b1.txt b2.txt 上下文模式(context)
diff -u b1.txt b2.txt 联合模式(unified)
diff -y b1.txt b2.txt 并列模式
*****************************************************************************************
常用就是联合模式:
diff -u b1.txt b2.txt //-表示第一个文件,+表示第二个文件
--- b1.txt 2024-07-22 21:34:50.542552298 +0800
+++ b2.txt 2024-07-22 21:33:45.394248249 +0800
@@ -1,5 +1,4 @@
-wojuedbushi
-weiouzhuyi
-nzhuy
-esizhuyi
-zhinehsiau
+wojued
+weiwuzhuyi
+weixinzhuyi
+doushimakesizhuyi
****************************************************************************************
并列模式:
diff -y b1.txt b2.txt // | 表示前后 2 个文件内容有不同
< 表示后面文件比前面文件少了 1 行内容
> 表示后面文件比前面文件多了 1 行内容
wojued wojued
weiouzhuyi | weiwuzhuyi
nzhuy | weixinzhuyi
esizhuyi | doushimakesizhuyi
zhinehsiau <
15、文件打补丁(patch/ed)
touch b1.txt //创建了一个b1和b2文件
vim b1.txt //编写两个文件
vim b2.txt
diff -u b1.txt b2.txt > diff.patch //diff命令比较两个文件,并生成diff.patch
b1.txt b2.txt diff.patch //使用ls查看此时有三个文件
patch -p0 < diff.patch //打补丁,对第一个文件做操作变成第二个文件。
patching file b1.txt
diff -e b1.txt b2.txt >diff.txt //-e命令比较生成两个命令的不同文件
vim diff.txt //在diff.txt最后一行写入w,保存并退出。
ed - b1.txt < diff.txt //用ed命令把diff.txt打入b1.txt中
16、文件权限更改(chmod/umask)
chmod o-w 1.txt //仅删1.txt其他用户w权限
chmod -x 1.txt //删除全部三者的x权限
chmod a-x 1.txt
chmod u=rwx,g=rx,o=r chmod 754 //修改全部三者的所有权限
umask命令用来控制权限掩码,为新建目录或文件设置一个初始权限。
目录创建时的初始权限 = 默认权限 - 权限掩码
文件创建时的初始权限 = 默认权限 - 权限掩码-111
目录的默认权限:drwxrwxr--774 系统在创建目录时不会自动取消x权限。
文件的默认权限:-rw-rw-r-- 664 系统在创建文件时会自动取消x权限。
查看普通用户与超级用户的权限掩码分别为0002、0022
以普通用户为例,解释每一位数字的意义:
第一位表示特殊权限,暂时不用考虑。
第二位表示用户权限掩码,用户权限-0,保证用户权限不变。
第三位表示用户所在组掩码,用户所在组权限-2,取消w的权限,其他保持不变。
第四位表示其他用户权限,其他用户权限-2,取消w的权限,其他保持不变。
17、文件压缩与解压(tar/zip)
tar -zcvf xx.tar.gz 源文件/目录 //打包多个源文件并配合gzip压缩文件
tar -zxvf xx.tar.gz -C 目标路径 //拆包并且配合gzip解压缩文件到指定目标路径
tar -jcvf xx.tar.bz2 文件/目录 //打包文件目录并配合bzip2压缩文件
tar -jxvf xx.tar.bz2 -C 目录 //拆包并且配合bzip2解压缩文件到指定目录
tar -t -f xx.tar.gz //不解压查看压缩包内容
tar -t -f xx.tar.bz2
*****************************************************************************************
打包指的是将多个文件和目录集中存储在一个文件中,不改变大小。
压缩则指的是利用算法对文件进行处理,从而达到缩减占用磁盘空间的目的。
*****************************************************************************************
-z:告诉 tar 命令使用gzip程序进行压缩或解压缩。
-j:通过 bzip2 进行压缩或解压缩。
-c:表示创建一个新的归档文件。(打包压缩)
-x:表示从归档文件中提取文件。(解压)
-v:表示在压缩或解压缩的过程中显示详细信息(verbose 模式)。
-f:指定归档文件的名称。在这个例子中,归档文件的名称是 xx.tar.gz
-C 目标路径 或 --directory=目标路径:指定解压的目标目录。如果目标路径不存在,tar 命令可能会报错或尝试在当前工作目录下创建名为 目标路径 的目录
zip [选项] 压缩文件名 源文件或目录
zip -q a.zip 1.txt //静默模式,不显示压缩过程中的详细信息。
zip -d a.zip 1.txt //从zip文件中删除指定的文件或目录。
zip -l 1.txt //显示zip文件中的文件列表。
zip -P 123456 code.zip 1.txt //设置zip文件的密码。
zip -r a.zip ./ //压缩一个目录
unzip [选项] 压缩文件名
unzip a.zip -d 目录 //把a.zip解压到指定的目录
unzip -q code.zip -d ./c // 把a.zip解压到当前目录下的c目录中
unzip -l a.zip //不解压查看压缩里的文件
18、文件硬链接/软链接(ln/ln -s)
ln 1.txt hard_1.txt //创建1.txt的硬链接文件
ln /home/user/docs/original.txt /home/user/docs/hardlink.txt
#在/home/user/docs目录下创建一个original.txt的硬链接文件
ln -s 1.txt soft_1.txt //创建1.txt的软链接
ln -s /home/user/docs /home/user/links/docs_link
#创建一个指向/home/user/docs目录的软链接docs_link
unlink soft_1.txt //解除软链接
rm 链接名 //rm可以删除软硬链接
***************************************************************************************
硬链接(Hard Link)
硬链接相当于起别名,其实是同一个文件。
硬链接不能跨文件系统,也不能链接到目录。
删除硬链接不会影响原始文件,直到所有的硬链接都被删除。
如果删除了原始文件,那么所有的硬链接都会失效,因为它们指向的inode不再存在。
软链接(Symbolic Link)
软链接类似于快捷方式。其实是两个文件,因为创建一个软链接就会创建一个文件。
软链接可以全分区跨系统文件,也可以链接目录。
该文件包含指向目标文件或目录的路径信息,删除源文件或者目录只删除数据,不会删除软链接
但是该原文件的软链接就成为死链接,如果再次创建一个与原文件同名的文件,该死链接恢复成软链接。
19、dos文件格式与unix文件格式切换
sudo apt install dos2unix //安装,用于将DOS/Windows格式的文件(使用CRLF作为行结束符)转换为Unix/Linux格式(使用LF作为行结束符)
dos2unix 1.txt //linux下转换windo格式为linux格式
unix2dos 1.txt //Linux下unix切换window下dos文件格式
可以通过底线命令模式:
set ff //查看文件类型
set ff=unix //也可以完成文件格式切换
set ff=dos
没有dos2unix的情况下进行转换,可以使用sed命令:
sed -i 's/\r$//' filename.txt
七、vim文本编辑器
sudo apt install vim //安装vim编辑器
1、vim的三种模式的切换
2、光标移动命令
命令模式下控制光标快捷键:
^ 光标到达光标所在行的行首
$ 光标到达光标所在行的行尾
gg 光标移动到文件首行
G 光标移动到文件尾行
数字G 光标移动到指定数字行
底线命令模式下
:数字 光标到达光标数字行的行首
3、整行复制、粘贴、剪切、撤销(yy、pp、dd、ctrl+r/底线命令模式下 u)
4、vim的查找命令(/?)
命令模式下两种查找方法:
模糊查找:
/string 按 n 查找下一个
?string ---> 按Enter ---> 按 N 查找上一个
精确查找
光标放在单词上 ---> 按 shift --->按 # ----> 按 n 查找下一个
或者按 * 按N 查找上一个
5、vim的替换命令
底线命令模式下:
3s/aaa/o/ //第三行出现的第一个aaa用o替换
1,10s/from/to/ //表示在第1到第10行(包含第1,第10行)之间搜索替换第一次出现的from;
1,10s/from/to/g //表示在第1到第10行(包含第1,第10行)之间搜索替换出现的from;
%s/from/to/g //表示全局替换,from替换成to。
0,$s/from/to/g //也表示全局替换,from替换成to。
N,$s/from/to/ //表示从N行到行尾中把第一次出现的from替换成to;
y/abc/ABC/ //逐字符替换
替换标记
c (confirm) 每次替换前询问
e (error) 不显示错误
g (globle) 不询问,整行替换。如果不加g选项,则只替换每行的第一个匹配到的字符串
i (ignore) 忽略大小写
八、用户和用户组
1、用户
lzy@lzy-virtual-machine:~$
root@lzy-virtual-machine:~#
~$是普通用户登录提示符,~#是超级用户登录提示符
@前是当前用户名,即lzy就是目前我的用户名
@与:之间是计算机名,即lzy-virtual-machine就是我的计算机名
:与$或者#之间是当前工作路径。
即~就是当前用户的主目录(家目录),也就是用户工作起始目录。
如果现在是普通用户lzy,他的主目录就是/home/lzy。
如果是超级用户root,他的主目录就是/root。
root用户拥有最高权限,他的UID是0
*******************************************************************************************
Linux中的用户分三类:普通用户、超级用户、系统用户。
用户切换命令:
sudo su //从普通用户切换到超级用户需要提权
su lzy //从超级用户切换到普通用户
//系统用户默认情况下是不能登录系统的,他们的存在主要是满足系统进程对文件的需求
//用户与用户之间具有隔离性
2、新建用户操作(useradd)
//1、创建新用户
sudo useradd -r -m -s /bin/bash xl
//使用创建用户命令时们需要加sudo提高权限操作
-r 表示创建系统用户
-m 默认放到home目录下
-s /bin/bash 指定命令解析器
//2、sudo设置用户密码命令
sudo passwd xl
//3、查看 passwd和group文件中相关用户信息,检查是否创建成功。
cat /etc/passwd
cat /etc/group
//4、添加新用户的sudo权限
需要更改为root用户进行操作
添加sudper的w权限后,对/etc/sudoer文件添加以下信息:
用户名 ALL=(ALL:ALL) ALL
并保存退出,修改完后需要改回sudoers权限
使用sudo apt update命令检查新建用户是否可以使用sudo命令。
sudo su
chmod u+w /etc/sudoers
vim /etc/sudoers
行尾添加 用户名 ALL=(ALL:ALL) ALL
chmod u-w /etc/sudoers
su xl
cd ~
sudo apt update
3、修改用户名、家目录、所属组(usermod)
//可以修改用户姓名、家目录、用户所属组
usermod -l 新用户名 旧用户名 //修改用户名
usermod -md /home/user 用户名 //修改用户家目录
usermod -G [groupname] [username] //替换其他附加组
usermod -aG [groupname] [username] //增加附加组
usermod -g [groupname] [username] //改变基本组
4、删除用户(userdel)
userdel -r 用户名 //删除该用户主目录和邮件池
5、查看用户信息(cat /etc/passwd)
文件用于存储用户账户的信息
username:password:UID:GID:GECOS:home_directory:shell
GECOS是描述用户信息
xl:x:998:998::/home/xl:/bin/bash
表示有一个名为xl的用户,其UID和GID都是998,没有填写额外的用户信息,家目录在/home/xl,登录后使用的Shell是Bash。
6、用户组
第一种分为超级用户组(rootgroup)、系统组(system group)和用户组(usergroup)。
超级用户组是超级用户所属的组,系统组是系统用户所属的组,用户组是普通用户所属的组
第二种分为基本组和附加组。
用户所属组中的第一个组成为基本组,基本组在/etc/passwd文件中指定;
用户所在的其他组为附加组,附加组在/etc/group文件中指定。
不可以把用户从基本组中删除,但是可以从附加组中删除。
一个用户可以属于多个附加组,但是一个用户只能有一个基本组
第三种分为私有组和公共组。
建立账户时,若没有指定账户所属的组,系统会建立一个和用户名相同的私有组,这个组只容纳了一个用户。而公共组可以容纳多个用户属于多个组的用户所拥有的权限是它所在的组的权限之和
7、查看用户所属组信息
groups user_name //查询用户账号所属的组
id user_name //查询用户账号所属的组
8、添加新的用户组(groupadd)
groupadd [groupname]
9、重命名用户组
groupmod -n new_name old_name
10、查看组中的成员
members 用户组
getent group 用户组
11、从附加组移除用户
sudo gpasswd -d 用户名 用户组
12、删除用户组
groupdel 用户组名 //不能删除基本组
13、查看用户组
cat /etc/group
用于存储系统上所有组的信息。每一行代表一个组,并且遵循以下格式:
groupname:password:GID:userlist
//1、提权创建haha组
sudo groupadd haha
//haha组作为xl的附加组,需要提权
sudo usermod -G haha xl
//id命令查看xl所属组情况
id xl
用户id=998(xl) 组id=998(xl) 组=998(xl),1001(haha)
//从haha组移除用户xl
xl@lzy-virtual-machine:~/a$ sudo gpasswd -d xl haha
正在将用户“xl”从“haha”组中删除
//提权并删除haha组
sudo groupdel haha
九、IO重定向与管道
1、标准输入输出
标准输入(stdin):文件描述符为0,默认指向终端(在虚拟终端中即为键盘)
标准输出(stdout):文件描述符为1,默认指向终端(在虚拟终端中即为屏幕)
标准错误(stderr):文件描述符为2,默认指向终端(在虚拟终端中即为屏幕)
对于一个进程来说,它从描述符0指向的文件读取输入信息,把执行结果送到描述符1指向的文件,把出错信息送到描述符2指向的文件,而不关心这些文件具体是什么。
关于文件描述符:一个进程有一个结构保存一组打开的文件,每个打开的文件用一个数字标识,此数字一般被称为文件描述符,而在Linux/Unix上设备也被映射为文件,数字0,1,2都会分别关联到键盘,屏幕,屏幕
2、重定向
如果需要把输出信息保存在一个文件中,就需要进行输出重定向。
如果一个命令要获取的输入来自文件,需要进行输入重定向。
重定向符后面紧跟的应该是文件名或文件描述符,且之间不能有空格。
echo "ABC" //ABC打印到屏幕
echo "ABC" >1.txt //ABC重定向输出到1.txt中,如果不存在1.txt,则创建并写入
//如果1.txt已经存在且不为空,会覆盖之前内容,只保存本次数据
echo "ABC">>1.txt //会把ABC追加到文件末尾,之前的数据不会丢失
cat <input.txt //将文件input.txt的内容,做为cat的输入
在shell中使用>,<,>>等重定向符号时,执行重定向操作的是shell.
shell将>、>>、<解释成指令,用来把一条命令的输入或输出重定向到一个文件,而不是关联设备
类型 操作符 用途
重定向标准输入 < 将命令中接收输入的途径由默认的键盘更改为指定的文件
重定向标准输出 > 以替换的方式将命令的执行结果输出到指定的文件
>> 将命令执行的结果追加输出到指定文件
重定向标准错误 2> 清空指定文件的内容,并将标准错误信息保存到该文件中
2>> 将标准错误信息追加输出到指定的文件中
重定向标准输出标准错误 &>或>& 将标准输出、标准错误的内容全部保存到指定的文件中
shell 的重定向处理顺序(先处理文件描述符较大的重定向)
ls -l /root/a.txt 1>>/root/output.txt 2>&1
ls -l /root/a.txt 2>>/root/output.txt 1>&2
//列出/root/a.txt的详细信息,并将标准输出和标准错误都追加到/root/output.txt
2>&1错误返回值传递给1输出通道,然后通过1输出通道记录至/root/output.txt文件
1>&2正确返回值传递给2输出通道,然后通过2输出通道记录至/root/output.txt文件
重定向 /dev/null文件将命令重定向输出到该文件,起禁止输出作用
3、管道符 |
进程a | 进程b
是将a进程的标准输出(stdout)作为b进程的标准输入(stdin),但是进程a的标准错误(stderr)无法通过管道只能输出到屏幕。
ps -ef|grep ssh
十、进程
1、进程的定义:运行中的程序就是进程(process)
linux下进程的状态:
选项 | 含义 |
du(disk usage) | 命令用于显示目录或文件的磁盘空间。 |
df(disk free) | 主要看文件系统分区 |
free (最常用的命令) | 可以显示系统中的内存使用情况,包括总内存、已用内存、空闲内存等信息。 |
top | 显示系统中运行的进程和它们使用的资源,包括内存 |
2、查看进程的命令
ps aux
以用户为主的格式显示系统中所有用户的所有进程,包括那些没有控制终端的进程。
lzy@lzy-virtual-machine:~/a$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 101928 9464 ? Ss 09:04 0:01 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 09:04 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 09:04 0:00 [rcu_gp]
USER:运行该进程的用户。
PID:进程的ID。
%CPU:该进程占用的CPU百分比。
%MEM:该进程占用的物理内存百分比。
VSZ:虚拟内存大小,以KB为单位。
RSS:常驻集大小,即实际占用的物理内存大小,以KB为单位。
TTY:该进程在哪个终端上运行,如果没有则显示为?。
STAT:进程状态,如S(睡眠)、R(运行)、Z(僵尸)等。
START:进程启动时间。
TIME:CPU时间,即该进程占用的CPU时间总和。
COMMAND:启动该进程的命令名称。
ps -ef
用于显示当前系统中的所有进程信息。
lzy@lzy-virtual-machine:~/a$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:04 ? 00:00:01 /sbin/init splash
root 2 0 0 09:04 ? 00:00:00 [kthreadd]
root 3 2 0 09:04 ? 00:00:00 [rcu_gp]
UID:运行该进程的用户ID。
PID:进程的ID。
PPID:父进程的ID。
C:CPU使用率,这是一个粗略的估计值,表示进程最近使用的CPU时间。
STIME:进程启动的时间。
TTY:该进程在哪个终端上运行,如果与终端无关,则显示为?或pts/n(对于伪终端)。
TIME:CPU时间,即该进程占用的CPU时间总和。
CMD:启动该进程的命令名称或命令行。
top
动态监控进程情况,系统资源使用情况
lzy@lzy-virtual-machine:~/a$ top
top - 11:27:47 up 2:23, 2 users, load average: 0.01, 0.06, 0.02
任务: 290 total, 1 running, 289 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.7 us, 0.0 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1927.8 total, 70.7 free, 909.5 used, 947.6 buff/cache
MiB Swap: 923.3 total, 879.9 free, 43.4 used. 844.1 avail Mem
进程号 USER PR NI VIRT RES SHR %CPU %MEM TIME+ COMMAND
1351 lzy 20 0 3697372 184908 58328 S 1.0 9.4 0:10.21 gnome-shell
750 root 20 0 242788 5708 4688 S 0.3 0.3 0:12.99 vmtoolsd
1519 lzy 20 0 148228 24376 12496 S 0.3 1.2 0:13.10 vmtoolsd
11603 lzy 20 0 15108 3976 3196 R 0.3 0.2 0:00.07 top
%us:表示用户空间程序的cpu使用率(没有通过nice调度)
%sy:表示系统空间的cpu使用率,主要是内核程序。
%ni:表示用户空间且通过nice调度过的程序的cpu使用率。
%id:空闲cpu
%wa:cpu运行时在等待io的时间
%hi:cpu处理硬中断的数量
%si:cpu处理软中断的数量
%st:被虚拟机偷走的cpu
3、搜索进程 1、 搜索 ps -ef | grep 要搜索的内容
lzy@lzy-virtual-machine:~/a$ ps -ef | grep ssh
root 948 1 0 09:04 ? 00:00:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
lzy 1282 1215 0 09:04 ? 00:00:00 /usr/bin/ssh-agent /usr/bin/im-launch env GNOME_SHELL_SESSION_MODE=ubuntu /usr/bin/gnome-session --systemd --session=ubuntu
root 1683 948 0 09:05 ? 00:00:00 sshd: lzy [priv]
root 1685 948 0 09:05 ? 00:00:00 sshd: lzy [priv]
lzy 1809 1685 0 09:05 ? 00:00:00 sshd: lzy@notty
lzy 1821 1683 0 09:05 ? 00:00:00 sshd: lzy@pts/0
lzy 1822 1809 0 09:05 ? 00:00:00 /usr/lib/openssh/sftp-server
lzy 11622 1823 0 11:35 pts/0 00:00:00 grep --color=auto ssh
4、杀死进程
选项 | 含义 |
kill -l | 查看所有信号 |
kill 1234 | 向PID为1234的进程发送终止信号 |
kill -9 1234 | 向PID为1234的进程发送kill信号.会强制进程结束 |
5、任务前台转后台
有两种操作方法:
把任务的输出或者错误重定向到文件中,否则会占前台
第一种:在命令后面加入&便可以直接使任务直接在后台运行。
jobs命令查看后台任务编号
fg 后台编号命令从后台转前台。
lzy@lzy-virtual-machine:~/a$ ping 192.168.2.163 >> ip.txt &
[1] 11042
lzy@lzy-virtual-machine:~/a$ jobs//查看后台任务编号
[1]+ 运行中 ping 192.168.2.163 >> ip.txt &
lzy@lzy-virtual-machine:~/a$ fg 1
ping 192.168.2.163 >> ip.txt
第二种: crtl+z 把当前任务转至后台暂停。
使用jobs可以显示 后台的任务。
bg [ 后台任务编号 ]可以使任务在 后台继续执行。
fg [ 后台任务编号 ]把后台的任务转至前台执行。
^Clzy@lzy-virtual-machine:~/a$ ping 192.168.2.163 >> ip.txt
^Z
[1]+ 已停止 ping 192.168.2.163 >> ip.txt
lzy@lzy-virtual-machine:~/a$ bg 1
[1]+ ping 192.168.2.163 >> ip.txt &
lzy@lzy-virtual-machine:~/a$ fg 1
ping 192.168.2.163 >> ip.txt
6、进程的优先级
十一、网络常用查看命令(也不常用)
选项 | 含义 |
ip | 显示IP地址,MAC地址等信息 |
ping | 检测网络连接是否连通。 |
netstat | 命令显示网络连接、路由表、接口统计等信息。 |
wget | 根据域名下载文件 |
十二、内存
1、内存查看命令:
选项 | 含义 |
du(disk usage) | 命令用于显示目录或文件的磁盘空间。 |
df(disk free) | 主要看文件系统分区 |
free (最常用的命令) | 可以显示系统中的内存使用情况,包括总内存、已用内存、空闲内存等信息。 |
top | 显示系统中运行的进程和它们使用的资源,包括内存 |
-h 选项表示加上单位,该命令是从当前目录开始递归显示的
lzy@lzy-virtual-machine:~/a$ du -h
24K ./b/cc
4.0K ./b/c
56K ./b
88K .
lzy@lzy-virtual-machine:~/a$ df -h
文件系统 容量 已用 可用 已用% 挂载点
udev 921M 0 921M 0% /dev
tmpfs 193M 1.6M 192M 1% /run
/dev/sda5 20G 9.3G 8.8G 52% /
tmpfs 964M 0 964M 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
lzy@lzy-virtual-machine:~/a$ free
总计 已用 空闲 共享 缓冲/缓存 可用
内存: 1974032 933036 66812 2500 974184 862696
交换: 945416 44172 901244
十三、Shell
1、Shell介绍
shell是Linux的一个程序
shell的基本工作原理;
Shell读取用户输入的命令字符串,进行解析确保命令语法格式正常,在环境变量指定目录中查找可执行文件,在这个时候进行任何的命令替换通配符扩展、算术扩展、反引号等,一切准备好后会fork() 创建一个新的进程,而 exec() 将新进程的映像替换为要执行的命令。执行并处理输入输出。
1、shell在用户和操作系统之间起中介作用
真正运行命令的不是shell,而是内核。Shell是在准备和执行一系列系统调用,来请求内核执行相应的操作。最终,是内核在管理和控制硬件资源,以确保命令得以正确和安全地执行。
2、 Shell还负责管理环境变量,这些变量可以影响命令的执行方式。 例如,PATH变量记录了要查找命令的路径顺序
环境变量:当前shell运行时保存的信息
env命令 查看系统环境变量
lzy@lzy-virtual-machine:~/a$ env SHELL=/bin/bash LANGUAGE=zh_CN:zh PWD=/home/lzy/a LOGNAME=lzy XDG_SESSION_TYPE=tty MOTD_SHOWN=pam HOME=/home/lzy LANG=zh_CN.UTF-8
3、Shell脚本
Shell不仅是一个命令行解释器,还是一种编程语言。 用户可以编写Shell脚本来自动化复杂的任务。
脚本操作过程:
写脚本
vim 1.sh //创建一个脚本并进入脚本编写命令
chmod +x 1.sh //添加1.sh的可执行权限,可以选择只添加当前用户或者其他用户
//此时1.sh会变成绿色
./1.sh //有两种执行方法(我这里默认是在当前目录)
bash 1.sh //用bash命令执行脚本文件,脚本文件可以没有可执行权限。
//如果是在其他目录执行当前目录脚本,可以使用绝对路径
/home/user/scripts/myscript.sh
编辑脚本内容
1 #!/bin/bash //#表示单行注释,声明这是一个bash脚本
2 #The test file
3 a=5
4 echo "$a"
5 b=" a b c "
6 echo "${b}"
7 c=8
8 echo "$[a+c]"
9 m=`expr 2 + 3`
10 echo "${m}"
11 <<EOF //11行开始多行注释 <<EOF开始
12 expr $a + $c
13 expr \( 3 + 3 \) \* 3
14 let a--
15 echo $((a--))
16 bc<<-EOF //-EOF回车后按Tab键可以保证输入内容对齐
17 a=7
18 b=3
19 scale=3
20 a/b
21 quit
22 EOF //到25行 EOF
23 read -p "请输入:" n //脚本里read命令,只能在脚本里echo "${a}",在外面命令行无法查看
24 echo "${n}"
25 EOF
26 exit 0 //该命令两个作用:退出脚本;指定脚本退出时的返回值(0~255)
调试脚本命令
+:表示脚本已经运行的语句。
没有+:表示输出结果。
lzy@lzy-virtual-machine:~/a$ bash -x 1.sh
+ a=5
+ echo 5
5
+ b=' a b c '
+ echo ' a b c '
a b c
+ c=8
+ echo 13
13
++ expr 2 + 3
+ m=5
+ echo 5
5
+ exit 0
2、 变量
1、变量定义
//定义变量的 = 左右不能有空格,否则会按照运行命令的方式去执行
//shell中的变量都是以文本的形式存储的
lzy@lzy-virtual-machine:~/a$ b=3
lzy@lzy-virtual-machine:~/a$ a=1+2
lzy@lzy-virtual-machine:~/a$ echo "${a}"
1+2
lzy@lzy-virtual-machine:~/a$ c=a+b
lzy@lzy-virtual-machine:~/a$ echo "${c}"
a+b
环境变量 export a-10 //子进程可以使用父进程
全局变量 a=10 //同一进程范围内可使用
只读变量 readonly a=10 //设置之后无法更改和清除,除非重置shell环境。
局部变量 local a=10 //作用范围在函数大括号内
特殊变量 $# //查看变量参数的个数
$0 //查看脚本的名字
$n //查看第n个位置参数
$! //查看shell后台的pid
$@ //查看传递脚本所有参数的列表
$* //查看所有参数的列表,单字符串形式显示
$$ //脚本本身进程的ID
$? //上一条命令的结果,显示0则成功,不是0则失败
$- //显示Shell使用的当前选项,与set命令功能相同
2、变量查看(env/set)与删除(unset)
set | grep var //set命令搜索变量
env //会列出当前 shell 环境中的所有环境变量及其值
upset a //清除变量a
3、提取变量值(${a}) 与变量赋值
${a} //提取a变量的值
变量赋值的三种方式
1、a=10 //直接赋值
2、read a //使用read命令读一行数据赋值
3、a=`ls ` //使用反单引号,执行命令并将输出赋值给变量a
4、变量的读取(read)与输出(echo)
read m //可不定义变量,输入即定义,默认按行读取
read -p "please keyin:" -t 10 input
-p //可以跟提示字符
-t //跟等待的秒数
=======================================================================================
echo -e "abd\bsy" //--->absy搭配-e使转义符生效
echo -n "hello" //echo输出时默认跟一个换行,要想取消默认的换行,需要加-n。
5、单引号、双引号、反单引号
定义变量时: 没有空格的字符串变量单双引号可以加可以不加。
包含空格的变量必须要加单引号或者双引号。
a="abc"
a=" a b c "
//定义变量中引号的作用就是作一个界定作用。
使用变量时: 单引号:原样输出。
双引号:弱引用,里面可以进行变量置换。
反单引号:优先执行命令
a=abcdefg
echo '${a}' //输出结果是 ${a}
echo "${a}" //输出结果是 abcdefg
a=`cat b1.txt` //输出结果是 b1.txt文件内容
//使用变量echo "${a}"必须加双引号,这样可以避免数据丢失。 最好加上{},这样可以避免歧义。
6、变量的操作
a、查看字符串变量的长度(wc -L / ${#var})
lzy@lzy-virtual-machine:~/a$ a=" a b"
lzy@lzy-virtual-machine:~/a$ echo "${a}"|wc -L
6
lzy@lzy-virtual-machine:~/a$ echo "${#a}"
6
b、字符串变量截取命令(${}/expr substr)
在 Bash 脚本和命令行中
${variable:start}:从变量 variable 的第 start 个字符开始截取,直到字符串的末尾。如果 start 是负数,则表示从字符串的末尾开始计数。
${variable:start:length}:从变量 variable 的第 start 个字符开始,截取长度为 length 的子字符串。
a="abcdefg"
echo "${a:2}" //从第二个字符开始截取,直到字符串末尾. cdefg
echo "${a:2:3}" //从第二个字符开始截取,截取长度为3. cde
echo "${a:2:-3}" //从第二个字符开始截取,截取除倒数三个字符之外的其他字符 cd
echo "${a:0-2:3}" //从倒数第二个字符开始截取三个长度字符串 fg
echo "${a:0-5}" //从倒数第五个字符开始到字符串末尾 cdefg
echo "${a:0-3}" //从倒数第三个字符开始截取到字符串末尾 efg
echo "${a:0-5:2}" //从倒数第五个字符开始,截取两个字符 cd
echo "${a:0-5:-2}" 从倒数第五个字符开始,截取除倒数两个字符之外其他字符 cde
expr实现字符串截取
a='abcdefg'
echo `expr substr "$a" 2 3` //从b位置开始截取3个元素。输出:bcd
echo `expr `index "$a" 'd'` //查找d元素位置。 输出:4
s='/home/xm/test/a.txt'
echo ${s;} //将变量s中所有/替换成; 输出结果:;home;xm;test;a.txt
echo ${s//\//:} //和上面命令一致,这样写清楚易懂 输出结果::home:xm:test:a.txt
echo ${s#/} //从左往右删除第一个 输出结果: home/xm/test/a.txt
echo ${s##*/} //从左往右尽可能长删除*/ 输出结果: a.txt
echo ${s%*/} //从右往左删除第一个/* 输出结果:/home/xm/test/a.txt
echo ${s%/*} //从右往左删除第一个*/ 输出结果:/home/xm/test
echo ${s%%t*} //从右往左尽可能长的删除t* 输出结果: /home/xm/
c、变量参数判断命令
a='haha'
b=''
echo ${a:+hello} //a不为空,返回hello
hello
echo ${b:+hello} //b为空,返回空值
echo ${c:+hello} //c变量既未定义也未被赋予任何非空值,返回空值
echo ${a:-hello} //a不为空,返回a的原值
haha
echo ${b:-hello} //b为空,返回hello
hello
echo ${c:-hello} //c未定义,返回hello
hello
echo ${a:?hello} //a不为空,返回a的原值
haha
echo ${b:?hello} //为空或者未定义,则将hello写入标准错误流,本语句失败。
-bash: b: hello
echo ${a:=hello} //a不为空,返回a的原值
haha
echo ${b:=hello} //b为空,返回hello,并将hello赋值给b。
hello
3、数组
1、数组的介绍
数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组)
初始化时不需要定义数组大小
2、数组有关命令
a、声明数组
可以在赋值时直接声明数组。
array_name=(value1 value2 value3 ...)
数组元素的赋值方式:
1、 arr=(1 2 3) 2、 arr[0]=1 arr[1]=2 arr[2]=3 3、arr=([0]=1 [1]=2 [2]=3) 验证结果: lzy@lzy-virtual-machine:~/a$ echo "${arr[@]}" 1 2 3 4、arr=(`ls ./`) //可以把命令的结果赋值给数组。 验证结果 lzy@lzy-virtual-machine:~/a$ echo "${arr[@]}" 1.sh 1.txt 1.txt.bak 2.sh 2.txt b hard_1.txt ip.txt soft_1.txt
也可以使用declare命令声明数组。
declare -a array_name
b、获取数组长度
可以使用${#array_name[@]}或${#array_name[*]}来获取数组的长度(元素个数)。
length=${#array_name[@]}
echo $length
c、获取数组元素索引
lzy@lzy-virtual-machine:~/a$ a=(1 2 4 5)
lzy@lzy-virtual-machine:~/a$ echo "${!a[@]}"
0 1 2 3
${!a[@]} 这种语法用于获取数组 a 所有元素的索引,该数组赋值了四个元素。对于该数组,你会得到索引 0 1 2 3。
d、获取数组元素
lzy@lzy-virtual-machine:~/a$ echo "${a[@]}"
1 2 4 5
e、遍历数组
for((i=0;i<5;i++))
do
echo ${a1[$i]}
done
for i in "${a1[@]}"
do
echo "$i"
done
f、修改数组元素
通过指定索引来修改数组中的元素。
array_name[0]="new_value" # 修改数组的第一个元素
g、删除数组元素
使用unset
命令可以删除数组中的特定元素。
unset array_name[1] # 删除数组的第二个元素
h、删除整个数组
unset array_name # 删除整个数组
i、数组切片
echo "${array_name[@]:1:2}" # 获取从索引1开始的2个元素
通过数组切片可以在数组中间插入数组元素,
a1=("${a1[@]:0:2}" 3 "${a1[@]:2}")
echo ${a1[@]}
j、元素替换
lzy@lzy-virtual-machine:~/a$ a=(1 2 3 xm 22 xl 32)
lzy@lzy-virtual-machine:~/a$ echo ${a[@]//[a-z]/A}
1 2 3 AA 22 AA 32
lzy@lzy-virtual-machine:~/a$ echo ${a[@]}
1 2 3 xm 22 xl 32
lzy@lzy-virtual-machine:~/a$ A=("${a[@]//[a-z]/A}")
lzy@lzy-virtual-machine:~/a$ echo A
A
lzy@lzy-virtual-machine:~/a$ echo ${A[@]}
1 2 3 AA 22 AA 32
3、算数运算
a、整数运算符操作
示例 | 说明 |
((+3)) | 单目运算符正号 |
((-3)) | 单目运算符负号 |
((a=b++)) ((a=++b)) | 自增(变量前,先运算在取值;变量后,先取值在运算) |
((a=b--)) ((a=--b)) | 自减(变量前,先运算在取值;变量后,先取值在运算) |
expr 3 + 2 | 加法 |
expr 3 - 2 | 减法 |
expr 3 \* 2 | 乘法 |
expr 3 / 2 | 除法 |
expr 3 % 2 | 取模 |
((3**2)) | 幂运算 |
expr进行运算时,表达式和运算符之间必须加空格,乘号*和小括号()前面要加\做转移字符。
b、运算操作符
(( )) | 用于整数运算,效率很高,推荐使用 |
let | 用于整数运算,和(())类似 |
$[] | 用于整数运算,不如(())灵活 |
expr | 可用于整数运算,也可以处理字符串。 |
bc | linux下的一个计算器程序,可以处理整数和小数 |
declare -i | 将变量定义为整数,然后进行数学运算时就不会当作字符串 ,功能有限。 |
lzy@lzy-virtual-machine:~$ a=' ab c d '
lzy@lzy-virtual-machine:~$ echo ${a}//直接输出字符串变量会导致不完整输出
ab c d
lzy@lzy-virtual-machine:~$ echo "${a}"//使用双引号可以保证数据不丢失
ab c d
lzy@lzy-virtual-machine:~$ echo "$a"|wc -L//查看该变量的字符长度
15
lzy@lzy-virtual-machine:~$ echo "\${a}"//双引号内转移符起作用。
${a}
lzy@lzy-virtual-machine:~$ echo '\${a}'
\${a}
lzy@lzy-virtual-machine:~$ a=10
lzy@lzy-virtual-machine:~$ b=3
lzy@lzy-virtual-machine:~$ echo $a+$b //echo原样输出
10+3
//想要计算a+b的值有三种方法
lzy@lzy-virtual-machine:~$ echo "$((a+b))" // 1、$((运算表达式))
13
lzy@lzy-virtual-machine:~$ echo "$[a+b]" // $[运算表达式]
13
lzy@lzy-virtual-machine:~$ expr $a + $b // 2、expr 命令(操作数和运算符之间要有空格)
13
lzy@lzy-virtual-machine:~$ expr \( 2 + 3 \) \* 2 //expr 小括号和*都要做转义处理
10
lzy@lzy-virtual-machine:~$ let m=$[a+b] //3、let 命令(不允许出现空格)
lzy@lzy-virtual-machine:~$ echo $m
13
//执行++或--操作的两种方法
lzy@lzy-virtual-machine:~$ let a--//1、let 命令
lzy@lzy-virtual-machine:~$ echo $a
9
lzy@lzy-virtual-machine:~$ echo $((a--))// 2、$(())命令
9
c、bc 精度运算命令
bc命令行代码
lzy@lzy-virtual-machine:~$ bc <<EOF
> a=7
> b=3
> scale=2
> a/b
> quit
> EOF
2.33
lzy@lzy-virtual-machine:~$ echo "a=7;b=3;scale=2;a/b"|bc
2.33
//bc命令(Binary Calculator)是一个提供任意精度算术的交互式进程,能够执行高精度的数学运算。
lzy@lzy-virtual-machine:~$ bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
a=7;b=3;a/b
2
a=7;b=3;scale=3;a/b //scale后面是跟要保留几位小数。可以横着写,需要加分号
2.333
a=7//一行一行写不需要加分号
b=3
scale=3
a/b
2.333
quit //输入quit回车退出bc命令
lzy@lzy-virtual-machine:~$
4、shell test 命令
用于检查某个条件是否成立,它可以进行数值、字符串和文件的测试。
a、数值
选项 | 含义 |
-gt | > |
-ge | >= |
-lt | < |
-le | <= |
-eq | == |
-ne | != |
b、字符串
选项 | 含义 |
= | 相等 |
!= | 不相等 |
-z | 长度是否为0,长度为0则为真 |
-n | 长度是否不为0,长度不为0则为真 |
c、文件
选项 | 含义 |
-e | 判断对象是否存在 |
-s | 判断对象是否存在,并且size不为0 |
-d | 判断对象是否存在,并且为目录 |
-f | 判断对象是否存在,并且为常规文件 |
-O | 判断对象是否存在,并且属于当前用户 |
-L | 判断对象是否存在,并且为符号链接 |
-h | 判断对象是否存在,并且为硬链接 |
-r | 判断对象是否存在,并且可读 |
-w | 判断对象是否存在,并且可写 |
-x | 判断对象是否存在,并且可执行 |
-G | 判断对象是否存在,并且属于当前用户组 |
-nt | 判断file1是否比file2新 [ "/data/file1" -nt "/data/file2" ] |
-ot | 判断file1是否比file2旧 [ "/data/file1" -ot "/data/file2" ] |
56 DIR=/home/lzy/a
57 FILE=${DIR}/1.txt
58 if [ -s "${FILE}" ];then
59 echo "${FILE} not is null"
60 else
61 echo "${FILE} is null"
62 fi
d、逻辑判断
-a | 相当于&&,区别是&&有短路特性 -a是先计算两边再去比较,没有短路特性。 |
-o | || |
! | ! |
5、shell 流程控制
1、if语句
if [条件]
then
command
elif [条件]
then
command
else
command
fi
示例:
13 str1='abcdf'
14 str2='abcd'
15 a=2
16 if [ "$str1" = "$str2" ]
17 then
18 echo "Y"
19 else
20 echo "N"
21 fi
22 if [ $a -lt 3 -a $a -ge 1 ];then
23 echo 'y'
24 else
25 echo 'n'
26 fi
27
28 if [ $a -lt 3 ] && [ $a -ge 1 ];then
29 echo 'y'
30 else
31 echo 'n'
32 fi
33
34 if [ $a -gt 3 ];then
35 echo 'Y'
36 else
37 echo 'N'
38 fi
39
40 if [ -z "$str1" ];then
41 echo "str1 is null"
42 else
43 echo "str1 is value: $str1"
44 fi
执行结果如下:
lzy@lzy-virtual-machine:~/a$ bash 1.sh
N
y
y
N
str1 is value: abcdf
2、case语句
case语句主要适用于:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列
expression是要评估的表达式,通常是一个变量或命令的输出。pattern是你要匹配的值或模式。当expression的值与某个pattern匹配时,将执行与该pattern相关联的代码块。
case expression in
pattern1)
# 代码块1
;;
pattern2)
# 代码块2
;;
...)
# 其他代码块
;;
*)
# 默认代码块
;;
esac
举例子:使用 case 语句根据运算符执行不同的运算
16 # 使用 case 语句根据运算符执行不同的运算
17 case $op in
18 '+')
19 result=$((num1 + num2))
20 ;;
21 '-')
22 result=$((num1 - num2))
23 ;;
24 '*')
25 result=$((num1 * num2))
26 ;;
27 '/')
28 if ((num2 == 0)); then
29 echo "错误:除数不能为0。"
30 exit 1
31 fi
32 result=$((num1 / num2))
33 ;;
34 *)
35 echo "未知的运算符"
36 exit 1
37 ;;
38 esac
Shell提供了几种不同类型的循环结构,包括for循环、while循环和until循环。
3、for循环语句
C风格for循环
for (( i=1; i<=5; i++ ));do
echo "Number: $i"
done
遍历数字序列
for i in {1..5}; do
echo "Number: $i"
done
遍历数组中元素
fruits=("apple" "banana" "cherry")
for fruit in "${fruits[@]}"; do
echo "Fruit: $fruit"
done
4、while语句
while
循环会一直执行,直到给定的条件不再为真
count=1
while [ $count -le 5 ]; do
echo "Count is: $count"
((count++))
done
从文件循环读一行
25 while read str_line
26 do
27 echo "$str_line"
28 done<1.txt
5、until循环
until
循环与while
循环相反,它会一直执行,直到给定的条件为真时停止。
count=1
until [ $count -gt 5 ]; do
echo "Count is: $count"
((count++))
done
6、特殊命令
break n 如果省略n,则表示跳出循环,n表示跳出循环的层数
continue n 如果省略n,则表示跳过本次循环,进入下一次循环,n表示退出到第n次循环。
exit n 返回脚本状态。退出当前Shell程序,n为上一次程序执行的状态返回值,n可以省略,在下一个Shell里通过 $? 接收exit n 的值
return n 返回程序运行状态 用于在函数里作为函数的返回值,以判断函数执行是否正确,0~255
函数
如果要返回一串字符串用echo
6、shell函数
1、定义函数(三种方式)
3 function add(){ //函数定义
4 echo "Hello!"
5 }
6 add //函数调用
7
8 my_function(){
9 echo "Hellow!"
10 }
11 my_function
12
13 function fun {
14 echo "Hellow1!"
15 }
16 fun
2、调用函数
在脚本中调用函数,通过运行脚本来调用函数。
通过命令行参数控制选择调用哪个函数
3、传递参数给函数
脚本外传参到脚本里
//传递位置参数$1、$2
if [ "$1" = "hello" ];then
echo "y"
else
echo "n"
fi
if [ $2 -eq 6 ];then
echo "6"
else
echo "0"
fi
//调用脚本时提供实参,位置参数根据实参位置匹配。
./ 1.sh hello 6
脚本外传参到函数里
脚本内
sum(){
echo $[$1+$2] //参数传入后按函数内位置参数替换,即$1为3,$2为7。
}
sum $3 $4
脚本外
1.sh haha 6 3 7 //脚本外传四个参数,脚本内sum函数只接收第3、4个参数
脚本内函数传参
sub(){
local a=12 //local关键字声明变量为局部变量
echo $a
echo $[$1-$2]
}
a=3 //未用local关键字声明变量为全局变量
echo $a
b=5
sub $a $b
echo $a
7、多脚本调用
8、定时任务(crontab)
sudo crontab -e //选择文本编辑工具在其中添加、编辑或删除任务。
ps -ef | grep cron //查看cron任务是否在执行,结果为cron -f代表正在执行
service cron start //开启cron服务
service cron stop //关闭cron服务
tail -f /a/b/1.txt //动态监测该文件的变化
时间表示:
* * * * * //分别表示分(0~59)、时(0~23)、日(1~31)、月(1~12)、周(1~7)
时间特殊符号
, //代表不连续的符号
- //代表连续的时间范围
/ //代表间隔多久执行一次
0 8,12,16 * * * //表示8时、12时、16时0分都执行一次命令
0 5 * * 1-6 //表示周一到周六的5shi0分执行命令
*/10 * * * * //表示每隔10分钟执行一次命令
十四、三剑客(grep、awk、sed)
1. grep(Global Regular Expression Print)
是一个强大的文本搜索工具,可以根据正则表达式匹配文本,并打印出匹配的行。grep命令通常用于在文件中搜索指定的字符串,也可以通过管道(|)与其他命令结合使用。
基本格式:grep [选项] "匹配的内容" 文件名
常用选项: -v:取反,显示不匹配的行。
-o:只显示匹配到的内容,而不是整行。
-i:忽略大小写。
-n:显示匹配行的行号。
示例: grep "hello" example.txt //搜索文件example.txt中包含“hello”的行
grep -v "hello" example.txt //显示不匹配“hello”的行
2. sed(Stream Editor)
是一个流式文本编辑器,它可以对文件进行逐行处理,实现文本的替换、删除、插入等操作。sed命令通常与管道结合使用,对输入的文本进行修改后输出。
基本格式:sed [选项] '操作' 文件名
常用选项:-i:直接修改文件内容,而不是输出到标准输出。
示例: sed 's/hello/world/g' example.txt //将文件example.txt中的“hello”替换为“world”
//此命令不会直接修改原文件,除非使用-i选项
sed -i 's/hello/world/g' example.txt //直接修改文件内容(使用-i选项):
3. awk
awk是一种文本处理工具,它可以根据指定的规则对文本进行处理和分析。awk命令通常用于对文本进行分割、筛选、计算等操作。awk将文本按照指定的分隔符分成多个字段,并可以通过变量和函数进行相应的处理和操作。
基本格式:awk -F"分隔符" '{print $字段号}' 文件名
-F选项用于指定字段分隔符,默认为空格或制表符。
'{print $字段号}'表示打印指定字段号的字段。
示例:awk -F":" '{print $1}' user.txt
//假设文件user.txt的内容为user1:password1、user2:password2等,使用awk打印用户名
十五、Linux搭建c/c++开发环境
1、搭建开发环境以及编译处理(gcc/g++)
apt-get install gcc g++ //Ubuntu上安装C/c++开发环境
g++ -v //检查是否安装成功
******************************************************************************************
c语言开发过程中源文件到可执行文件有以下几个过程:
编辑 -> 预处理 -> 编译 -> 汇编 -> 链接 -> 可执行文件
.c .i .s .o .exe
========================================================================================
c语言的两种编译生成可执行文件的命令:
vim 0803.c
gcc -E 0803.c -o 0803.i //使用-E选项处理.c文件,生成预处理后文件.i
gcc -S 0803.i -o 0803.s //使用GCC的-S选项将预处理后的文件0803.i编译成汇编语言文件0803.s。
gcc -c 0803.s -o 0803.o // 使用GCC的-c选项将汇编文件0803.s汇编成0803.o
gcc -o 0803 0803.o //使用GCC的-o选项将.o文件链接成可执行文件0803
./0803 //执行0803
gcc -o 0803 0803.c //生成可执行文件0803
./0803 //执行0803
g++ -o 0803 0803.c //g++生成可执行文件0803
./0803
========================================================================================
c++编译生成可执行文件的命令:
vim 0803.cpp
g++ -o 0803 0803.cpp
./0803
gcc -o helloplus helloplus.cpp -lstdc++
//gcc在链接c++代码时不能自动链接c++标准库。后跟-lstdc++ 可链接标准库,生成正常可执行文件,效果与g++相同。
2、C语言的静态库的生成与使用
假设已经有了一个包含基础算术运算(加法、减法、乘法、除法)的四个C源文件(add.c, sub.c, mul.c, div.c)以及一个主程序文件main.c。
gcc -c add.c sub.c mul.c div.c
//GCC编译器将add.c, sub.c, mul.c, div.c这些C源文件编译成相应的对象文件(.o文件)
ar crv libop.a add.o sub.o mul.o div.o
//使用ar工具将add.o, sub.o, mul.o, div.o这些对象文件归档到一个静态库文件libop.a中。
//c选项表示创建一个新的归档文件,
//r选项表示将文件插入到归档文件中
//v选项表示在创建归档文件时显示详细信息。
gcc -o main main.c -L. -lop
//链接主程序和静态库生成可执行文件:
//-L.选项告诉GCC在当前目录(.表示当前目录)中查找库文件
//-l,选项告诉GCC链接libop.a库(注意,-l选项后面跟的是库名去掉前缀lib和后缀.a的部分)。
./main
//执行main文件
3、C语言的动态库(共享库)的生成与使用
gcc -c -fpic add.c sub.c mul.c div.c // 编译源代码生成目标文件,-fpic 用于生成位置无关代码
gcc -shared add.o sub.o mul.o div.o -o libdp.so //链接目标文件生成动态库
sudo cp libdp.so /usr/lib //复制到了系统的库目录中(/usr/lib)
gcc -o main main.c -ldp //链接主程序main.c生成可执行文件并链接动态库
./main //执行可执行文件
4、查看一个可执行程序依赖的动态库(ldd)
ldd main //main 可执行文件依赖的库
5、新安装一个库之后如何让系统能够找到
对于C/C++的头文件Linux系统默认搜索路径是 :/usr/include
对于C/C++的库文件Linux系统默认的搜索路径是:/usr/lib64和/lib64
如果安装在/lib或者/usr/lib下,那么ld默认能够找到,无需其他操作。
如果安装在其他目录,可以通过设置环境变量(如 LD_LIBRARY_PATH 对于动态库)或
修改链接器的配置文件来实现。需要将其添加到/etc/ld.so.cache文件中,步骤如下
1.编辑/etc/ld.so.conf文件,加入库文件所在目录的路径
2.运行ldconfig,该命令会重建/etc/ld.so.cache文件
6、C++开发流程
g++ -std=c++11 -c add.cpp //默认生成同名不同后缀的.o文件
g++ -std=c++11 -c sub.cpp
g++ -std=c++11 -c main.cpp //-std=c++11 指定版本
g++ -std=c++11 -o main.exe main.o add.o sub.o
//将多个.o文件链接生成目标执行文件(头文件可不参与链接)
./main.exe //执行目标文件
===========================================================================================
g++ -std=c++11 -o main.exe main.cpp add.cpp sub.cpp //所有文件同时编译加链接生成可执行文件
十六、makefile
sudo apt install make //安装
vim makefile
1 all:one //:前为目标 :后为依赖/先决条件
2 echo "hhh" // 规则/命令
3 one:
4 echo "YYY"
文件夹中:add.c div.c main.c makefile mul.c op.h sub.c
vim makefile
1 main:add.o sub.o mul.o div.o main.o
2 gcc -o main add.o sub.o mul.o main.o
3 add.o:add.c //如果其中的一个源文件改动,我们只修改与他相关的源文件
4 gcc -c add.c
5 sub.o:sub.c
6 gcc -c sub.c
7 div.o:div.c
8 gcc -c div.c
9 mul.o:mul.c
10 gcc -c mul.c
11 main.o:main.c
12 gcc -c main.c
13 clean:
14 rm add.o sub.o div.o mul.o main.o
15 rm main
lzy@lzy-virtual-machine:~/a/b/cc$ make
gcc -c add.c
gcc -c sub.c
gcc -c mul.c
gcc -c div.c
gcc -c main.c
gcc -o main add.o sub.o mul.o main.o
lzy@lzy-virtual-machine:~/a/b/cc$ ./main
6,2,12,3l
lzy@lzy-virtual-machine:~/a/b/cc$ make
make: “main”已是最新。
lzy@lzy-virtual-machine:~/a/b/cc$ make clean
rm add.o sub.o div.o mul.o main.o
rm main
十七、GDB调试
//1、安装gdb
sudo apt install gdb
//2、编译.c文件,生成可调试、可执行文件
gcc -o main main.c -g
//3、查看代码
l //向下查看代码,默认十行。
l - //向上查看代码,默认十行。
set listsize 函数 //设置一次显示的行数。
shell cat main.c //使用cat命令查看全部main.c代码。
//4、打断点
b 行号/函数名/if条件 //向固定行、函数名、或者if条件后打断点
//5、查看断点信息
i b //查看全部断点信息
i b 断点编号 //查看指定断点信息
disable 断点编号 //禁用断点
enable 断点编号 //解除禁用
d 断点编号 //删除断点,断点编码在当前此次调试过程会一直加上去
//6、运行程序
r //run 使程序运行到第一个断点处
start //运行至程序main的初始位置
//7、单步执行
n //next 执行下一步
s //step 进入函数,逐语句调试
return //不执行完当前函数,跳回主函数调用的地方
finish //执行完当前函数,跳回主函数调用的地方
continue //跳到下一个断点处
//8、查看变量
p 变量名 //查看变量的值
p &变量名 //查看变量的地址
display 变量名 //每执行一步打印一次变量
undisplay 变量编号 //取消变量值常显示
set var 变量名=值 //改变变量的值
//9、查看函数
info function 函数名 //查看函数信息。
GDB分屏调试
layout split //用于分割窗口,可以一边查看代码,一边测试:显示源代码和反汇编窗口
layout src //显示源代码窗口
layout asm //显示反汇编窗口
layout regs //显示源代码/反汇编和CPU寄存器窗口
Ctrl + L //刷新窗口
查看和操作当前的调用堆栈:
bt/where //显示当前线程调用的堆栈列表,从当前执行的函数开始,一直回溯到main函数。
frame 栈帧号 //选择特定栈帧并设置为当前栈帧,可以使用info frame查看详细信息
info frame 栈帧号 //显示指定栈帧的详细信息
up/down //改变堆栈的显示深度,跳上一层或者下一层函数
gdb调试产生core文件
core文件是Linux系统提供的一种重要的调试工具,它可以帮助开发人员快速定位和解决程序崩溃的问题。常见产生core文件的原因:
程序访问了无效的内存地址:包括数组下标访问越界、使用未初始化的指针、非法指针操作(如空指针解引用、不合法的指针转换、野指针使用)等。
运行时错误:程序在运行时遇到无法处理的错误,如除零错误、堆栈溢出等,也可能导致core文件的生成。
ulimit -c
ulimit -a //查看core文件的生成大小,默认为0;
十八、ftp服务
sudo apt-get install vsftpd //安装ftp服务
sudo mkdir ftp
cd ftp
sudo mkdir new ftp
sudo useradd admin -d /home/ftp/ -s /bin/bash
sudo passwd admin
sudo vim /etc/vsftpd.conf
sudo service vsftpd restart
十九、Git
1、安装配置Git。
//1、git安装
sudo apt-get install git
//2、git配置
git config --global user.name "lzy"
git config --global user.email "2453530862@qq.com"
//3、检查配置是否成功
git config --list
//4、git与gitee账户建立ssh安全链接(公钥)
ssh-keygen -t rsa -C "245353062@qq.com"
//5、查看公钥并拷贝,并添加到gitee账号的公钥中
cat ~/.ssh/id_rsa.pub
//6、测试链接是否成功
ssh -T git@gitee.com
产生公钥
查看公钥
复制公钥到gitee中的ssh公钥
测试链接是否成功
2、仓库更新代码
//1、仓库初始化,第一次在本地项目目录先初始化,会自动生成.git文件,该目录可以作为git文件上传
git init
//2、文件从工作区上传到缓存区,如果要修改的文件较多,可以直接把当前目录以及子目录所有都add
git add 1.cpp sys.h
//3、缓存区上传到本地仓
git commit -m "修改内容描述注释"
//4、本地仓和远程仓建立链接
git remote add origin 远程库ssh
//5、如果远端代码文件数量和名称和本地有冲突,需要进行冲突合并
git pull --rebase origin master
//6、最后push到远端仓库完成代码更新
git push -u origin master
仓库下拉
工作区传到缓存区传到本地包
本地包到远端
先拉后推保证最新
其他
通配符
touch test_{1..10}.txt //批量创建多个文件名类似的文件
ls test_[0-9]* //查看所有以test开头后跟0-9任意数字的文件。
* 可以匹配任意数量的任意字符
? 可以匹配一个任意字符
[ ] 可以匹配中括号中的任意一个字符
[^ ] 匹配指定范围之外的任意单个字符
Linux命令中什么时候需要加空格
需要空格的情况:
1、命令与选项之间:例如,在ls -l中,ls是命令,-l是选项,它们之间需要空格分隔。
2、选项与参数之间:当选项后面需要跟参数时,选项和参数之间通常也需要空格。例如,在grep "pattern" file.txt中,grep是命令,"pattern"是参数,它们之间需要空格分隔。
3、多个选项之间:如果命令有多个选项,这些选项之间通常也需要空格分隔。例如,在tar -czvf archive.tar.gz directory/中,-c、-z、-v和-f都是选项,它们之间需要空格分隔。
4、命令与重定向符号之间:当使用重定向符号(如>、>>、<)时,命令与重定向符号之间需要空格。例如,在echo "Hello, World!" > output.txt中,echo是命令,>是重定向符号,它们之间需要空格分隔。
5、expr进行运算时,表达式和运算符之间必须加空格。
不需要空格的情况:
1、命令或选项内部的连字符:在命令或选项内部,连字符(如-)用于组合选项,此时不需要空格。例如,在tar -czvf中,-czvf是一个组合选项,用于压缩、归档、显示详细信息和指定文件名,这些选项之间不需要空格分隔。
2、引号内的内容:当使用引号(单引号或双引号)将参数括起来时,引号内部的内容被视为一个整体,不需要在引号内部添加空格。例如,在grep "Hello World"中,"Hello World"被视为一个整体参数,引号内部没有空格。
常用查看长度命令
在Linux中,查看“长度”通常指的是查看文件的内容长度(即文件大小)、字符串长度或者是数组中元素的个数。
1、查看文件大小:
使用ls
命令可以查看文件的大小。
ls -lh filename # `-l` 表示长格式显示,`-h` 表示以人类可读的格式(例如KB, MB, GB)显示文件大小
lzy@lzy-virtual-machine:~/a$ ls -lh 1.txt
-rw-rw-r-- 1 lzy lzy 3 7月 27 12:46 1.txt
使用du
命令来查看文件或目录的磁盘使用情况:
du -sh filename # `-s` 表示总计,`-h` 表示以人类可读的格式显示
lzy@lzy-virtual-machine:~/a$ du -sh 1.txt
4.0K 1.txt
2、查看字符串长度:
在Bash脚本中,你可以使用${#string}来获取字符串的长度。
string="Hello, World!"
echo ${#string} # 输出字符串的长度
3、查看数组长度:
对于Bash数组,你可以使用${#array[@]}或${#array[*]}来获取数组的长度(即数组中元素的个数)。
array=(element1 element2 element3)
echo ${#array[@]} # 输出数组中元素的个数
date查看时间命令
lzy@lzy-virtual-machine:~$ date +%H:%M:%S
09:17:12
lzy@lzy-virtual-machine:~$ date
2024年 07月 30日 星期二 09:17:19 CST
lzy@lzy-virtual-machine:~$ date +%Y-%m-%d
2024-07-30
4、chown更改用户以及所属组
sudo chown root:root 1.txt | 修改1.txt文件的用户和所属组为root |
sudo chown root 1.txt | 修改1.txt文件的用户为root |
sudo chown :root 1.txt | 修改1.txt文件的所属组为root |
lzy@lzy-virtual-machine:~/a/b$ cat b1.txt > b2.txt//b1.txt替换到b2.txt文件中
lzy@lzy-virtual-machine:~/a/b$ cat b1.txt
wojued
weiwuzhuyi
weixinzhuyi
doushimakesizhuyi
lzy@lzy-virtual-machine:~/a/b$ cat b2.txt
wojued
weiwuzhuyi
weixinzhuyi
doushimakesizhuyi
//1.txt内容重定向输出到2.txt
lzy@lzy-virtual-machine:~/a$ cat 1.txt > 2.txt
lzy@lzy-virtual-machine:~/a$ cat 2.txt
udo apt install
//将1.txt内容追加到2.txt
lzy@lzy-virtual-machine:~/a$ cat 1.txt >> 2.txt
lzy@lzy-virtual-machine:~/a$ cat 2.txt
udo apt install
udo apt install
//标准错误重定向输出到2.txt文件
lzy@lzy-virtual-machine:~/a$ cat -X 1.txt 2> 2.txt
lzy@lzy-virtual-machine:~/a$ cat 2.txt
cat: 不适用的选项 -- X
请尝试执行 "cat --help" 来获取更多信息。
//标准错误追加到2.txt文件
lzy@lzy-virtual-machine:~/a$ cat -X 1.txt &>> 2.txt
lzy@lzy-virtual-machine:~/a$ cat 2.txt
cat: 不适用的选项 -- X
请尝试执行 "cat --help" 来获取更多信息。
cat: 不适用的选项 -- X
请尝试执行 "cat --help" 来获取更多信息。
echo命令将内容重定向输入到1.txt
lzy@lzy-virtual-machine:~$ echo 'ABC'
ABC
lzy@lzy-virtual-machine:~/a$ cat 1.txt
udo apt install
lzy@lzy-virtual-machine:~/a$ echo "阿萨姆" >> 1.txt//通过echo命令将内容重定向输入到1.txt文件中
lzy@lzy-virtual-machine:~/a$ cat 1.txt
udo apt install
阿萨姆
lzy@lzy-virtual-machine:~/a$ echo -n abcdf//-n表示取消换行
abcdflzy@lzy-virtual-machine:~/a$ echo -e "a\tbc\b"//-e 表示转义字符
a bc