2.文件基本操作【文件操作(一)】
目标
- 理解Linux下路径的表示方法
- 能够使用命令(mkdir和touch)在指定位置创建目录和文件
- 能够使用命令(rm)删除指定的目录和文件
- 能够使用命令(ls)列出目录里的文件
- 能够使用命令(cat,head,tail,less,more)查看文件内容
- 理解标准输入、标准输出和标准错误的含义
2.1 CentOs6.7桌面环境操作
2.1.1桌面环境介绍
用户登录成功后,会进入CentOS桌面环境,桌面环境大致分为三部分:控制面板,工作区,任务栏。
2.1.2 终端的基本操作
- 操作系统与用户交互模式有两种:图形界面和命令行。
所有的命令需要在一个载体上执行,这个载体就叫做终端。终端上所有命令都需要一个 东西翻译解析一下,计算机才能理解并执行。这个翻译解析的东西叫SHELL解释器, RedHat和Centos默认shell解释器叫bash。
- 打开多个终端 Ctrl+Alt+F1-F6
- 快捷键设置
快捷键 | 作用 |
Tab键 | 命令或文件补全 |
Ctrl+A | 把光标移动到命令行开头。 |
Ctrl+E | 把光标移动到命令行结尾。 |
Ctrl+C | 强制终止当前的命令 |
Ctrl+L | 清屏,相当于clear命令 |
Ctrl+U | 删除或剪切光标之前的命令。 |
Ctrl+Y | 粘贴Ctrl+U剪切的内容。 |
2.1.3 命令格式
重要:Linux下,一切皆文件!!!
命令 [可选项] 参数
[root@localhost ~]# ls -l /root
命令:整条shell命令的主体
选项:会影响或微调命令的行为,通常以-, --
参数:命令作用的对象
2.2 Linux的目录树结构
2.2.1了解目录树结构
目录 | 说明 | 备注 |
/root | 管理员root的家目录 | |
/home | 普通用户的默认家目录 | /home/bozai /home/heima |
/bin—>/usr/bin | 普通用户的命令 | /usr/bin/date /usr/bin/ls |
/sbin—>/usr/sbin | 管理员使用的命令 | /usr/sbin/shutdown |
/usr/local | 第三方源码包默认安装目录 | 类似windows下 C:\Program Files |
/etc | 系统和服务相关配置文件 | /etc/passwd |
/var | 动态,可以变化的数据文件日志文件 | (/var/log/xxx) |
/tmp | 临时文件存放目录 | 全局可写(系统或程序产生临时文件) |
/dev | 设备文件 | /dev/sda /dev/nvme0n1 |
/lib—>/usr/lib | 库文件 | 软连接文件 |
/lib64—>/usr/lib64 | 库文件 | 软连接文件 |
/proc | 虚拟的文件系统 | 反映出来的是内核,进程信息或实时状态 |
/boot | 系统内核,引导程序相关文件 | |
/media | 移动设备默认的挂载点 | |
/mnt | 手工挂载设备的挂载点 |
说明: usr 是 unix system resources 的缩写;
2.2.2 理解文件路径表示方法
Who?——>当前登录系统的用户
Where?——>路径
我要在哪儿创建文件?
我要删除什么地方的什么文件?
我所要查看的文件在哪里?
What?——>操作命令
How?——>理清思路,找到方法,做就对了
◆ 绝对路径
1. 一定是以"/"(根)开头,它是唯一一个绝对能够描述文件所在路径的方式。
2. "/" 根目录是linux操作系统最顶级的目录,没有任何路径比它还要靠前。
3. 表示bozai家目录:/home/bozai/file1
◆ 相对路径
1. 路径是相对的,文件所在的路径是相对于当前所在路径而言的。
2. 当前路径使用.或./ 表示;当前目录的上一级目录使用..或../ 表示
3. 当前用户家目录使用~ 表示;上次工作路径使用- 表示
◆ 路径切换和查看的相关命令
举例说明
[root@heima ~]# pwd 打印当前工作路径
/root
[root@heima ~]# cd /home 切换到/home目录下
[root@heima home]# cd ../ 切换到当前路径的上一级目录
[root@heima /]# pwd
/
[root@heima /]# cd ~ 切换到当前用户家目录
[root@heima ~]# cd - 切换到上一次工作路径
/
[root@heima /]# cd 切换到当前用户家目录
[root@heima ~]# pwd
/root
2.3 CentOs6.7文件操作管理
2.3.1 判断文件类型(file)
◆ 常见文件类型
◆ 用file 命令来判断文件类型
[root@localhost ~]# file /root
/root: directory 目录
[root@localhost ~]# file /root/install.log
/root/install.log: ASCII text 普通的文本文件
[root@localhost ~]# file /dev/sda
/dev/sda: block special 块设备文件,存放数据
[root@localhost ~]# file /dev/tty1
/dev/tty1: character special 字符设备
[root@localhost ~]# file /bin/sh
/bin/sh: symbolic link to bash 软连接文件
2.3.2 列出目录内容(ls)
常见选项 -a all,查看目录下的所有文件,包括隐藏文件 -l 长列表显示 -h human,以人性化方式显示出来 -d 只列出目录名,不列出其他内容 -t 按修改时间排序 -r 逆序排列 -S 按文件的大小排序 -i 显示文件的inode号(索引号) -R 递归列出目录中的内容 -m 用逗号分隔显示内容 示例:以不同的选项列出/root目录里的内容 [root@localhost ~]# ls -a /root [root@localhost ~]# ls -l /root [root@localhost ~]# ls -lh /root [root@localhost ~]# ls -lt /root [root@localhost ~]# ls -S /root [root@localhost ~]# ls -R /root [root@localhost ~]# ls -d /root 查看/root目录本身的信息 |
注意:ls列出的结果颜色说明,其中蓝色的名称表示文件夹,黑色的表示文件,绿色的其权限为拥有所有权限。
2.3.3 创建目录(mkdir)
常见选项 -p 级联创建 [root@localhost ~]# mkdir /test/ 在根下创建test目录 [root@localhost ~]# mkdir ./test/ 在当前目录下创建test目录 [root@localhost ~]# mkdir -p /test/yunwei/redhat 说明: 1.如果创建的目录的上一级目录不存在,就需要加-p参数;-p在前面和后面都可以 |
2.3.4 创建文件(touch)
注意:Linux下文件的命名规则
1. 文件名严格区分大小写 file FILE
2. 文件名不能包含特殊符号,如(/或*等)
3. 文件名最多可达255个字符
● 创建一个新的空文件(目标文件不存在)
[root@localhost ~]# touch /tmp/file1 在/tmp目录下创建file1文件 [root@localhost ~]# touch file1 在当前目录下创建file1文件 思考:这2个file1文件是同一个文件吗? 答:不是同一个文件,因为路径不一样。 |
● 修改文件的时间(目标文件存在)
1)查看文件的相关时间
[root@localhost tmp]# stat file1 查看文件的状态信息 File: `file1' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 915714 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-04-01 17:36:00.353096343 +0800 Modify: 2019-04-01 17:36:00.353096343 +0800 Change: 2019-04-01 17:36:00.353096343 +0800 Access:文件的查看访问时间 Modify:文件的修改时间 Change:文件的属性时间,文件的大小、权限等信息发生改变时,该时间会变化 |
2)修改文件的时间
[root@localhost tmp]# touch file1 [root@localhost tmp]# stat file1 查看文件的状态信息 File: `file1' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd00h/64768d Inode: 915714 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2019-04-01 17:41:00.353096343 +0800 Modify: 2019-04-01 17:41:00.353096343 +0800 Change: 2019-04-01 17:41:00.353096343 +0800 其他修改: [root@localhost tmp]# touch -a file1 -t 201506161320 修改文件点访问时间 [root@localhost tmp]# touch -m file1 -t 201612121330 修改文件修改时间 -a:访问时间 -m:修改时间 -t:时间类型格式 [root@localhost tmp]# touch -d 20110808 file1 修改文件日期 [root@localhost tmp]# touch -d 1215 file1 修改文件时间 [root@localhost tmp]# touch -d "20101012 11:11:11" file1 修改文件的日期和时间 说明:大家只需要掌握touch -d的用法即可。 注:RHEL6开始relatime,atime延迟修改,必须满足其中一个条件: 1. 自上次atime修改后,已达到86400秒; 2. 发生写操作时; |
2.3.5 查看文件内容
● cat 命令:一般查看小文件,从第一行到最后一行列出来
常见选项:
-n:显示行号
-A:显示控制字符,如换行符,制表符等( linux $ 和 Windows ^M$ )
● tac 命令:一般查看小文件,从最后一行到第一行列出来
● more和less 命令:一般查看大文件,q退出查看,可以搜索,建议less命令
● head 命令:默认查看文件前10行, head -n 15或head -15 表示查看前15行
● tail 命令:默认查看文件后10行, tail -n 15或tail -15 表示查看后15行; -f 表示动态查看
● ldd 命令:一般用来查看二进制的命令文件
[root@localhost tmp]# cat /etc/passwd 查看/etc/passwd文件内容 [root@localhost tmp]# cat -n /etc/passwd 查看/etc/passwd文件内容,并打印行号 [root@localhost tmp]# tac /etc/passwd 查看/etc/passwd文件内容 [root@localhost tmp]# head -5 /etc/passwd 查看/etc/passwd文件的前5行内容 [root@localhost tmp]# tail -5 /etc/passwd 查看/etc/passwd文件的后5行内容 [root@localhost tmp]# more /var/log/messages [root@localhost tmp]# less /var/log/messages [root@localhost tmp]# ldd /bin/mkdir 查看mkdir命令文件(二进制)的内容 |
2.3.6 拷贝文件(cp)
注意:本地文件拷贝
1)用法 cp [选项] 需要拷贝的文件 拷贝到哪里去
2)常用选项
3)举例说明
# cp /root/file1 /home 拷贝/root/下的file1文件到/home目录下 # cp -r /home/itcast /root 拷贝/home/itcast目录到/root目录下 # su - user01 切换到user01用户下 $ touch file1 # cp -p /home/user01/file1 /tmp/ 拷贝home/user01/file1文件(包含属性信息)到/tmp下 # cp /root/file1 /tmp/test1 拷贝文件并且重命名 问:-a和-p有什么区别? 答:相同点都是需要拷贝文件的属性信息,比如拥有者(谁创建的等);不同点在于,-p只能拷贝文件,-a既可以拷贝文件也可以拷贝目录。 |
2.3.7 移动或重命名文件(mv)
移动文件用法(不同路径下): # mv 需要移动的文件 移动到新的路径下 注意:文件的路径不一样 重命名用法(相同路径下): # mv 原来文件的名字 新文件的名字 注意:老文件和新文件的路径一样 # mv /root/file1 /tmp 移动/root/file1文件到/tmp目录下 # mv /tmp/file1 /tmp/test1 将/tmp目录下的file1文件重命名成test1 |
2.3.8 删除文件(rm)
常用选项 -r 递归删除,一般用于删除目录 -f 直接删除,不提示 [root@localhost tmp]# rm file1 删除当前目录下的file1文件,有提示 [root@localhost tmp]# rm -r dir1 删除当前目录下的dir1目录,有提示 [root@localhost tmp]# rm -f /root/file1 强制删除/root/file1文件,不提示,直接删 |
2.4 Linux下如何获取帮助(扩展补充)
2.4.1 简约求帮助(help)
help命令:知道该命令的含义,相关参数不知道可以使用help 内部命令求帮助:help 命令 外部命令求帮助:命令 --help cp --help help cd 如何判断一个命令是内部命令还是外部命令 type 命令 内部命令:shell内置的命令,bash 外部命令:第三方程序,软件带来的命令 |
2.4.2 详细求帮助(man)
# man man ANUAL SECTIONS The standard sections of the manual include: 1 User Commands 所有用户使用命令 2 System Calls 系统调用 3 C Library Functions 函数库 4 Devices and Special Files 设备与特殊文件 5 File Formats and Conventions 文档格式说明 6 Games et. Al. 游戏 7 Miscellanea 杂项 8 System Administration tools and Deamons 系统管理员与程序用户相关 一般情况是不需要使用章节号,例如: # man 1 ls # man ls # man useradd # man setfacl (/EXAMPLES) # man -f passwd 列出所有章节中的passwd手册 # man 1 passwd passwd命令的帮助 # man 5 passwd 用户配置文件的帮助 # man -a passwd 在所有章节中查找 # man -k passwd 以关键字导出man page |
2.5 Bash的标准输入输出(扩展补充)
2.5.1 名词解释
● 标准输入(stdin):键盘上的输入 文件描述符—>0
● 标准输出(stdout):屏幕上正确的输出 文件描述符—>1
● 标准错误(stderr):屏幕上错误的输出 文件描述符—>2
2.5.2 相关符号
一般命令的输出都会显示在终端中,有些时候需要将一些命令的执行结果想要保存到文件中进行后续的分析/统计,则这时候需要使用到的输出重定向技术。
> :标准输出重定向, 覆盖重定向, 1>或> 标准输出重定向, 2> 标准错误重定向
>> :重定向追加, 1>> 标准输出追加, 2>> 标准错误追加
< :标准输入
&> :标准输出标准错误重定向
2.5.3 举例说明
① 环境准备
编写简单脚本(先直接复制用,后面说): [root@localhost ~]# echo -e 'date\nuuu' > 1.sh 创建1.sh脚本文件 [root@localhost ~]# cat 1.sh date uuu 执行1.sh脚本,屏幕上有输出结果,如下: [root@localhost ~]# bash 1.sh Thu Feb 28 21:22:27 CST 2019 正确的结果叫标准输出 1.sh: line 2: uuu: command not found 错误的结果叫标准错误 |
② 需求1:
将标准输出(屏幕上的正确结果)重定向到/tmp/1.log文件中
[root@localhost ~]# bash 1.sh > /tmp/1.log 1.sh: line 2: uuu: command not found 标准错误(错误结果)依然在屏幕,正确结果到文件中了 [root@localhost ~]# cat /tmp/1.log 文件里是标准输出的结果 Thu Feb 28 21:24:12 CST 2019 |
③ 需求2:
将标准错误(屏幕上的错误结果)重定向到/tmp/2.log文件中
[root@localhost ~]# bash 1.sh 2> /tmp/2.log Thu Feb 28 21:26:15 CST 2019 标准输出依然在屏幕,标准错误重定向到了文件中 [root@localhost ~]# cat /tmp/2.log 1.sh: line 2: uuu: command not found 文件里是标准错误的结果 注意:>或者2>都表示覆盖重定向 查看/etc/hosts文件内容,并将标准输出重定向到/tmp/1.log [root@localhost ~]# cat /etc/hosts > /tmp/1.log [root@localhost ~]# cat /tmp/1.log 查看该文件,发现原来内容被覆盖 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 总结:>或者1>表示标准输出重定向;2>表示标准错误重定向 |
④ 需求3:
将标准输出和标准错误一起重定向到/tmp/3.log里
[root@localhost ~]# bash 1.sh &>/tmp/3.log [root@localhost ~]# cat /tmp/3.log Thu Feb 28 21:33:36 CST 2019 1.sh: line 2: uuu: command not found 说明: &>表示标准输出和标准错误一起重定向 |
2.5.4 echo命令
echo会将输入的字符串送往标准输出,并在最后加上换行符。 可以理解为打印字符串。
常见选项: -n :不输出最后的换行符“\n” -e:解释转义字符(字符串中出现\n、\t等特殊字符,则特别加以处理,而不会将它当成一般文字输出) |
举例说明:
[root@localhost ~]# echo hello world 打印hello world hello world [root@localhost ~]# echo aaaa 打印aaaa aaaa [root@localhost ~]# echo hello > file1 将hello重定向到file1文件中 [root@localhost ~]# cat file1 Hello 总结: 1. echo表示打印字符串,默认将字符串送往标准输出;默认会打印一个换行符 2. echo可以结合>或者>>符号来使用,进行文件的创建或内容追加。 常见控制字符: \t 表示制表符 \n 表示换行符 [root@localhost ~]# echo -e 'date\nuuu' > 1.sh //-e表示将\n解释为换行符 [root@localhost ~]# cat 1.sh date uuu |
2.2 文件操作(二)
目标:
- 能够使用find命令根据文件类型查找文件
- 能够使用find命令根据文件的修改时间来查找文件
- 能够使用find命令根据文件的大小来查找文件
- 能够使用gzip、bzip2、xz相关工具对文件进行压缩和解压缩
- 能够使用tar工具进行打包压缩文件
- 能够使用date命令查看和设置系统时间
2.2.1 Linux下文件查找命令
2.2.1.1 命令查找
Linux下一切皆文件!
which 命令:找出命令的绝对路径
whereis 命令:找出命令的路径以及文档手册信息
[root@heima ~]# which mkdir /usr/bin/mkdir [root@heima ~]# whereis mkdir mkdir: /usr/bin/mkdir /usr/share/man/man1/mkdir.1.gz /usr/share/man/man1p/mkdir.1p.gz /usr/share/man/man2/mkdir.2.gz /usr/share/man/man3p/mkdir.3p.gz |
2.2.1.2 文件查找(find)
find 命令:精确查找,磁盘搜索,IO读写,CPU开销大
(1)用法1:找出来输出到屏幕
根据需求查找出来直接输出到屏幕
find 查找路径 选项 关键字
举例说明:
0)环境准备 # mkdir /test # touch /test/file1 # touch /test/FILE1 # cp -a /home/heima/* /test/ 1)根据文件名查找 [root@heima ~]# find /test -name "file1" [root@heima ~]# find /test -iname "file1" [root@heima ~]# find /etc -name "*.conf" 2)根据文件类型查找 [root@heima ~]# find /usr/bin/ -type l [root@heima ~]# find /dev -type b [root@heima ~]# cd /test [root@heima test]# find . -type d [root@heima test]# find . -type f 3)根据文件大小查找 [root@heima test]# find . -type f -size +1M [root@heima test]# find . -type f -size -1M [root@heima test]# find . -type f -size -1024k [root@heima test]# find . -type f -size 9M 4)根据文件属性(权限,创建者和所属组) [root@heima test]# find . -user heima -group heima -type f [root@heima test]# find . -type f -perm 644 |
-mtime选项举例:
[root@heima test]# find ./ -type f -mtime +2 [root@heima test]# find ./ -type f -mtime -2 [root@heima test]# find ./ -type f -mtime 2 |
(2)用法2:找出来执行命令
根据需求查找出来后执行某个动作(命令)
find 路径 选项 关键字 动作
举例说明:
语法结构: 注意: 1. -exec或者-ok后面写完命令必须以空格反斜杠\;结尾( \;) 2. {}表示find命令所找出来的内容 |
2.2.2 Linux下文件压缩工具
2.2.2.1 常见的压缩与解压缩工具
2.2.2.2 工具的用法
① zip工具
压缩: zip 压缩后的文件 需要压缩的文件 选项: -r 递归压缩,压缩目录 注意:zip压缩默认压缩后的格式就是.zip;当然也可以加后缀.zip,一般都加上 解压缩: -d 指定解压缩路径 |
② gzip工具
压缩: gzip 需要压缩的单个文件 选项: -d 解压缩 -r 递归压缩(目录) 解压缩: gunzip 需要解压的文件 或者 gzip -d 需要解压的文件 gunzip file* 一次解压多个文件,*代表通配符;file*表示以file开头所有文件 |
③ bzip2工具
压缩: bzip2 需要压缩的文件 选项: -d 解压缩 |
④ xz工具
选项: -z 压缩,默认 -d 解压缩 或者 unxz 压缩: xz 文件名 解压缩: unxz 文件名 或者 xz -d 文件名 |
2.2.3 Linux下文件打包工具
tar 命令:可以将多个文件打包成一个并且压缩,不会改变文件的属性,很常用。
2.2.3.1 用法
tar 选项 打包后的文件 需要打包的文件
注意:
1. 以上选项前面的横杠"-"可以省略 2. 如果已经将文件压缩打包,那么就不能追加;如果只是打包就可以追加。 3. 参数顺序需要注意,最好把-f参数放到所有参数后面。 4. 当出现以下提示时,加一个大P参数解决。 tar: Removing leading `/' from member names |
2.2.3.2 示例
1. 将/tmp目录里的dir1目录和/etc/hosts文件打包到/tmp/dir4里叫dabao.tar [root@localhost tmp]# tar -cvf /tmp/dir4/dabao.tar ./dir1 /etc/hosts ./dir1/ ./dir1/test1.gz.bz2 ./dir1/aaa/ ./dir1/aaa/file2.gz ./dir1/file1.gz.bz2 tar: Removing leading `/' from member names /etc/hosts 注意:以上错误提示可以忽略 查看打包后的文件内容: [root@localhost tmp]# tar -tf dir4/dabao.tar ./dir1/ ./dir1/test1.gz.bz2 ./dir1/aaa/ ./dir1/aaa/file2.gz ./dir1/file1.gz.bz2 etc/hosts 2. 将/boot目录和/root/install.log文件打包并压缩到/tmp目录下叫backup_boot.tar.gz [root@localhost ~]# tar -cvzf /tmp/backup_boot.tar.gz /boot install.log 3. 解压tar包 [root@localhost tmp]# tar -xf backup_boot.tar.gz 解压到当前路径 [root@localhost tmp]# tar -xf backup_boot.tar.gz -C dir1/ 解压到指定路径 |
2.2.4 日期相关指令(扩展补充)
2.2.4.1 date命令(重点)
date :打印或者设置当前系统日期和时间
date --help 自己先求帮助
(1)打印日期或时间
打印系统当前日期或时间 [root@heima ~]# date [root@heima ~]# date +%D [root@heima ~]# date +%F [root@heima ~]# date +%Y-%m-%d [root@heima ~]# date +%T [root@heima ~]# date +%X [root@heima ~]# date +'%F %X' [root@heima ~]# date +%c 打印系统非当前日期或时间 [root@heima ~]# date -d '+3days' +%F [root@heima ~]# date -d '-3days' +%F [root@heima ~]# date -d '3days' +%F [root@heima ~]# date -d '3days ago' +%F [root@heima ~]# date --date='30days' +%F |
(2)设置系统日期或时间
选项:-s 设置当前系统时间,只有root权限才能设置,其他只能查看。 date -s 20200523 设置成20100523,这样会把具体时间设置成空00:00:00 date -s "01:01:01 2020-05-2" 这样可以设置全部时间 date -s "01:01:01 20200523" 这样可以设置全部时间 date -s "2020-05-23 01:01:01" 这样可以设置全部时间 date -s "20200523 01:01:01" 这样可以设置全部时间 |
(3)应用案例
有时候我们需要用到当前的系统时间,如何调用?比如以当前系统日期命名创建目录或文件。
2020-10-10.log.tar.gz 2020-10-11.log.tar.gz $():括号里面的命令优先执行 date +%F 2019-06-23 创建目录和文件,以当前系统日期命名 [root@heima ~]# mkdir $(date +%F) [root@heima ~]# touch $(date -d '+3days' +%Y%m%d).log |
2.2.4.2 cal命令(了解)
cal :查看日历
cal 或者 cal -1 表示直接输出当前月份的日历 cal -3 表示输出上一个月+本月+下个月的日历 cal -y 年份 表示输出某一个年份的日历 |
2.3 文件编辑工具(vim)
目标:
- 能够使用vim编辑器修改并保存文件
2.3.1 vim概述
Linux平台下的文本编辑器:emas、nano、gedit、vi、vim
vi(visual editor)编辑器通常被简称为vi,它是linux和unix系统上最基本的文本编辑器,类似于windows系统下的记事本。学会它后,我们将在linux的世界里游刃有余。
为什么要学习vim?
① 所有的Unix like系统都会内置vi编辑器。其它的文本编辑器不一定会存在
② 很多软件的编辑接口都会主动调用vi
③ vim具有程序编辑的能力,可以主动以字体颜色辨别语法的正确性,方便程序设计
④ 程序简单,编辑速度快
⑤ vim是vi的升级版
2.3.2 vim编辑器三种模式
2.3.2.1 命令行模式
问:命令行可以干什么?
答:可以进行一些基本的复制、删除、跳转、撤销、移动等操作。
举例说明:
① 环境准备
1) 删除 /tmp/目录里的所有内容
2) 将/etc/passwd文件拷贝到/tmp目录里
# rm -rf /tmp/* # cp /etc/passwd /tmp/ |
② 使用vim工具打开文件
用法1: vim 文件名 默认会进入命令行模式
[root@localhost ~]# vim /tmp/passwd |
用法2: vim +数字 文件名 打开指定的文件,并且将光标移动到指定行
[root@localhost ~]# vim +5 /tmp/passwd |
用法3: vim +/关键字 文件名 打开指定的文件,并且高亮显示关键词
[root@localhost ~]# vim +/shutdown /tmp/passwd |
2.3.2.2 编辑模式
功能:编辑文件内容
2.3.2.3 底行模式
(1)如何进入底行模式?
命令模式进入底行模式:按冒号:
编辑模式进入底行模式:先按Esc键退出命令模式,然后按冒号:
(2)底行模式能做什么?
① 保存和退出
● 保存文件,命令:w;另存为其他文件,命令:w 文件名
● 保存退出,命令:wq;强制保存退出:wq!
● 退出不保存,命令:q;强制退出:q!
● 命令:x在文件没有修改的情况下,表示直接退出(等价于:q),在文件修改的情况下表
示保存并退出(:wq)
② 搜索替换
搜索摸索 :/root n往下匹配;N往上匹配 替换模式 :%s/root/ROOT/ 全文搜索,替换每一行匹配到的第一个关键字 :%s/root/ROOT/g 全文搜索,替换每一行所有匹配的关键字 :%s/root/ROOT/gc 交互式替换 :%s/\/sbin\/nologin/\/bin\/bash/ \转义符 :%s#/sbin/nologin#/bin/bash#g 更换分隔符 :7s/shutdown/SHUTDOWN/g 只替换第7行的内容 取消高亮 :noh (no highlight) |
③ 其他功能
临时设置行号 :set number 或 :set nu 永久设置行号 echo "set number" >> /etc/vimrc :set list 查看控制符 地址定位 :1,5 w /tmp/5.txt 保存前5行内容到/tmp/5.txt :r /tmp/5.txt 在光标所在行下面读取/tmp/5.txt文件内容 :3r /tmp/5.txt 在当前文本的第3行后读取/tmp/5.txt文件 :1,8d 删掉文本的1到8行 :nr !command 在第n行下面读取命令所执行的结果 :n! command 用命令的执行结果替换第n行内容 |
2.3.3 vim编辑器三种模式切换
2.3.4 多窗口编辑问题
当两个终端同时打开或者意外结束文件时,会产生一个.swap文件(交换文件)
举例说明:
你在两个终端同时打开/tmp/passwd文件,会产生/tmp/.passwd.swp。这时,有六个按钮可以使用:
O(pen for Read-Only):打开成只读文件。 E(dit):用正常方式打开要编辑的文件,并不会载入暂存文件的内容。这很容易出现两个用户相互改变对方的文件的问题。 R(ecover):加载暂存文件的内容。 D(elete):如果你确定这个暂存文件是没有用的,则可以删除。 Q(uit):不进行任何操作,回到命令行。 A(bort):忽略这个编辑行为,和Q类似。 需要注意的是: 这个暂存文件不会因为你结束vim后自动删除,必须要手动删除。否则每次打开对应的文件时都会出现这样的提示。 |
2.3.5 可视化模式(了解)
按键:ctrl+v(可视块)或v(可视行),然后按下↑ ↓ ← →方向键来选中需要复制的区块,按下y键进行复制(不要按下yy),最后按下p键粘贴
退出可视模式按下Esc键
2.4 Linux下用户管理和组管理
目标:
- 能够根据需求创建普通用户
- 能够根据需求修改用户基本信息
- 能够将用户加入到指定组里
- 能够使用两种方法给用户设置密码
- 能够删除用户
- 能够创建并删除组
2.4.1 Linux下用户管理
2.4.1.1 用户概念及作用(了解)
用户:指的是linux操作系统中用于管理系统或者服务的人
一问:管理系统到底在管理什么?
答:linux下一切皆文件,所以用户管理的是相应的文件
二问:如何管理文件呢?
答:①文件基本管理:比如文件的创建、删除、复制、查找、打包压缩等等;文件的权限增加、减少等;
②文件高级管理:比如程序文件的安装、卸载、配置等。终极目的是对外提供稳定的服务。
2.4.1.2 用户的分类(了解)
(1)超级用户
超级用户,也叫管理员,root。该用户(root)具有所有权限,UID=0并且绝对只能是0。
(2)系统用户
系统用户,也叫程序用户。一般都是由程序创建,用于程序或者服务运行时候的身份。
默认不允许登录系统。1<=UID<=499
比如后面学的web服务的管理用户apache,文件共享ftp服务的管理用户ftp等
注意Centos7/RHEL8中,系统用户UID范围: 1<=UID<=999
(3)普通用户
普通用户,一般都是由管理员创建,用于对系统进行有限的管理维护操作。
默认可以登录系统,500<=UID<=60000
注意Centos7/RHEL8中,普通用户UID范围: 1000<=UID<=60000
特别说明:
①用户指的是操作系统上管理系统或服务的人,是人,就有相关的属性信息
②用户的属性信息包括但不限于,如:家目录、唯一身份标识(UID)、所属组(GID)等
③今天我们讨论的用户指的是普通用户,即由管理员创建的用户。
2.4.1.3 用户的基本管理(掌握)
(1)创建用户(useradd)
① 基本语法和选项
useradd [选项] 用户名 常用选项: -u 指定用户uid,唯一标识,必须唯一 -g 指定用户的默认组(主组) -G 指定用户附加组(一个用户可以加入多个组,但是默认组只有一个) -d 指定用户家目录(每个用户都有一个自己的家,并且默认在/home/xxx) -s 指定用户默认shell 查看系统支持的shell(命令解释器) [root@heima ~]# cat /etc/shells /bin/sh 软连接文件 /bin/bash 系统默认的解释器 /usr/bin/sh 软连接文件 /usr/bin/bash 系统默认的解释器 其他shell: /sbin/nologin 不能登录操作系统,也叫非交互式shell /bin/dash /bin/tcsh /bin/csh |
② 示例说明
1) 创建默认用户
创建一个用户stu1 [root@heima ~]# useradd stu1 查看用户信息 [root@heima ~]# id stu1 uid=501(stu1) gid=501(stu1) groups=501(stu1) 注意:当创建一个默认用户时,系统会给该用户以下东西,以stu1为例说明 1)用户的UID(唯一标识) 501(系统自动分配) 2)用户的默认组(主组) stu1组,默认跟该用户的用户名一致;组ID(501),默认和用户UID一致 3)用户的家目录 /home/stu1 4)拷贝相应的文件到用户的家里 [root@heima ~]# su - stu1 [stu1@localhost ~]$ ls -a . .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla |
2) 根据需求创建用户
1. 创建用户stu2,但是不能登录操作系统 注意: -s 指定用户的默认shell,/sbin/nologin表示不能登录系统,也叫非交互 [root@heima ~]# useradd -s /sbin/nologin stu2 验证: [root@heima ~]# id stu2 uid=502(stu2) gid=502(stu2) groups=502(stu2) 切换用户失败,说明该用户不能登录系统 [root@heima ~]# su - stu2 This account is currently not available. 2. 创建用户stu2,同时指定该用户的家目录为/rhome/stu2 注意: -d 指定用户的家目录,前提该用户家目录的上一级目录/rhome必须存在 [root@heima ~]# mkdir /rhome [root@heima ~]# useradd -d /rhome/stu2 stu2 [root@heima ~]# id stu2 uid=502(stu2) gid=502(stu2) groups=502(stu2) 说明:指定stu2家目录/rhome/stu2时,只需要/rhome存在即可,系统会默认在/rhome下创建stu2目录 |
(2)用户密码设置(passwd)
passwd 用户名 表示给指定用户修改密码 passwd 直接回车 表示给当前用户修改密码 [root@heima ~]# passwd stu1 Changing password for user stu1. New password: 密码不显示 BAD PASSWORD: it is WAY too short BAD PASSWORD: is too simple Retype new password: 密码不显示 passwd: all authentication tokens updated successfully. 说明: 1.管理员root可以给任何用户修改密码 2.普通用户可以自己给自己修改密码,但是密码复杂度要符合规范 [root@heima ~]# echo 123|passwd --stdin stu2 更改用户 stu2 的密码 。 passwd:所有的身份验证令牌已经成功更新。 说明:使用这种方法不用交互可以直接设置成功,一般用于脚本中。 |
① 保存用户信息的文件
1. 用户信息保存文件/etc/passwd 了解相关配置文件内容,可以通过求man文档解决,即 man 5 passwd 以冒号:分割为7列,如下: account --> stu1 用户名称 password --> x 密码,将密码单独存放在另外一个文件中 UID --> 501 用户ID GID --> 501 组ID GECOS --> 用户自定义, 描述说明 directory --> /home/stu1 用户的家目录 shell --> /bin/bash 用户的默认shell,其中/sbin/nologin表示非交互,不能登录系统 2. 用户密码信息保存文件/etc/shadow 了解相关配置文件内容,可以通过求man文档解决,即 man 5 shadow 以冒号:分隔为9列,如下: login name 登录的用户名 encrypted password 加密后的密码;!!表示没有设置密码 date of last password change 最后一次更改密码的天数(距离1970年的1月1日到现在的天数) minimum password age 密码的最小生存周期;0表示可以立刻修改密码;如果是3,则表示3天后才能更改密码 maximum password age 密码的最大生存周期;如果30表示每隔30天需要更新一次密码 password warning period 密码过期前几天发出警告;7表示过期前7天开始警告 password inactivity period 密码的宽限期;如果3表示允许密码过期3天,3天内还能登录系统,但是要求修改密码。3天后(密码过期3天后账户被封锁,需要联系管理员) account expiration date 账户过期的时间,账户过期的用户不能登录;密码过期用户不能用原来的密码登录。以1970年1月1日算起。 reserved field 保留 |
② 更改用户的账号信息(chage)
chage --help -d 修改用户最后一次更改密码的时间 -m 修改密码的最小存活期(几天后才能修改密码) -M 修改密码的最大存活期(每隔多少天更新一次密码) -W 修改密码过期前警告(过期前几天发出警告) -I 修改允许密码过期几天 -E 修改账户过期时间 -l 列出账户的信息 举例说明: 查看用户账号的相关信息命令:chage -l stu1 [root@heima ~]# chage -l stu1 Last password change : Mar 04, 2019 Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 修改用户账号的过期时间:2019-03-10过期 [root@heima ~]# chage -E '2019-03-10' stu1 [root@heima ~]# chage -l stu1 Last password change : Mar 04, 2019 Password expires : never Password inactive : never Account expires : Mar 10, 2019 Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7 修改用户账号的过期时间为10天以后: [root@heima ~]# chage -E $(date +%F -d '+10days') stu1 |
(3)修改用户信息(usermod)
① 基本语法选项
usermod [选项] 用户名 常用选项: -u 指定用户uid,唯一标识,必须唯一 -g 指定用户的默认组(主组) -G 指定用户附加组(一个用户可以加入多个组,但是默认组只有一个) -d 指定用户家目录(每个用户都有一个自己的家,并且默认在/home/xxx) -s 指定用户默认shell -m 移动用户家目录,和-d一起使用 |
② 举例说明
1. 修改stu3用户的UID为1100 [root@heima ~]# usermod -u 1100 stu3 [root@heima ~]# tail -5 /etc/passwd yunwei:x:1001:1001::/home/yunwei:/sbin/nologin stu1:x:1002:1002::/home/stu1:/bin/bash stu2:x:1003:1003::/rhome/stu2:/bin/bash stu3:x:1100:1004::/rhome/stu3:/bin/bash stu4:x:1005:1005::/home/stu4:/sbin/nologin 2.修改stu4用户的默认shell为可登录系统 [root@heima ~]# su - stu4 This account is currently not available. [root@heima ~]# usermod -s /bin/sh stu4 [root@heima ~]# tail -5 /etc/passwd yunwei:x:1001:1001::/home/yunwei:/sbin/nologin stu1:x:1002:1002::/home/stu1:/bin/bash stu2:x:1003:1003::/rhome/stu2:/bin/bash stu3:x:1100:1004::/rhome/stu3:/bin/bash stu4:x:1005:1005::/home/stu4:/bin/sh 3.修改stu5用户的家目录 [root@heima ~]# useradd -d /rhome/stu5 stu5 [root@heima ~]# usermod -md /home/stu5 stu5 |
(4)删除用户(userdel)
① 基本语法选项
userdel [选项] 用户名 常用选项: -r 删除用户并且移除其家目录和邮箱 -f 强制删除正在登录的用户 |
② 举例说明
说明: 创建完用户后,家目录默认在/home/用户名下;用户的邮箱在/var/spool/mail/用户名 1. 删除stu4用户以及家目录 [root@heima ~]# userdel -r stu4 [root@heima ~]# id stu4 id: stu4: No such user 2.强制删除一个正在登录的用户 [root@heima ~]# userdel -r stu5 userdel: user stu5 is currently used by process 7998 [root@heima ~]# id stu5 uid=1101(stu5) gid=1101(stu5) 组=1101(stu5) [root@heima ~]# userdel -rf stu5 userdel: user stu5 is currently used by process 7998 [root@heima ~]# id stu5 id: “stu5”:无此用户 3. 只删除用户user02,不删除其家目录 [root@heima ~]# userdel stu1 |
2.4.1.4 总结
(1)创建用户(useradd)
①useradd 用户名 -à家目录/home/用户名、邮箱、UID、默认组GID [用户主组]
② useradd [选项] 用户名 -à常用选项:-d/ -s/ -u/ -g/ -G
(2)设置用户密码(passwd)
① passwd 用户名 -à给指定的用户(管理员可以给任何人设置任何密码)
② echo 密码|passwd –stdin 用户名 -à非交互式(用于脚本中)
③ 用户基本信息和用户密码信息保存文件 -à/etc/passwd和/etc/shadow
④ 扩展chage命令-à用来修改用户密码信息(账号过期时间、密码最小生存周期等)
(3)修改用户信息(usermod)
① usermod [选项] 用户名 -à usermod –md 新家 用户名
(4)删除用户(userdel)
① userdel 用户名 -à 只删除用户,不删除用户家目录、邮箱等信息
② userdel –r 用户名 -à 删除用户以及其他信息
③ userdel –f 用户名 -à 强制删除用户(删除正在登录的用户)
2.4.2 Linux下组管理
2.4.2.1 组和用户的关系(理解)
(1)核心:组的目的是为了方便管理用户
◆ 用户是操作系统上管理维护系统或服务的人
◆ 组是用户的一个属性信息
◆ 任何一个用户默认都会有一个主组(默认组)
◆ 一个用户除了主组也可以有多个其他组(附加组)
(2)用户的主组和附加组到底有啥关系?
用户的主组和附加组半毛钱的关系都木有
(3)那要这个主组和附加组有什么用呢?
组的目的是方便管理用户,用户的目的是管理操作文件,文件又有权限这个属性。
①用户要操作一些文件,文件是由用户创建,不同用户创建的文件的属性信息也就不一样
②文件的属性都有啥呢?比如,文件的创建者,文件属于哪个组,文件大小,文件时间等
③其中,不同用户所创建的文件的属组就是该用户的主组(默认组)
④A用户附加组也有可能是其他用户的主组,道理同上(权限章节再细细体会组的作用)
2.4.2.2 组的管理(掌握)
(1)创建组(groupadd)
① 基本语法
groupadd [选项] 组名 常用选项: -g 指定组的GID(编号),默认唯一 |
② 举例说明
1.创建一个组admin [root@heima ~]# groupadd admin 2.查看组信息 [root@heima ~]# tail -1 /etc/group admin:x:1005: 说明:关于/etc/group配置文件说明,可以man 5 group找帮助 3.创建一个组sysadmin,指定组的GID为1111 [root@heima ~]# groupadd -g 1001 sysadmin [root@heima ~]# tail -1 /etc/group admin:x:1005: sysadmin:x:1111 |
(2)删除组(groupdel)
① 基本语法
groupdel 组名 |
② 举例说明
[root@heima ~]# groupdel admin [root@heima ~]# groupdel stu2 groupdel: cannot remove the primary group of user 'stu2' 注意:以上信息说明不能删除属于其他用户的主组 |
(3)组成员管理(gpasswd)
① 基本语法
gpasswd [选项] 组名 常见选项: -a 添加用户到组 -d 从组中删除成员 -A 指定管理员 -M 指定组成员,可以批量添加用户到组中 -r 删除密码 gpasswd 组名 给组设置密码 |
② 举例说明
1)添加用户到组里
1. 创建3个用户user01~user03 2. 将user01添加到sysadmin组里 方法:1:指定user01用户的附加组为sysadmin(站在用户角度) # usermod -G sysadmin user01 方法2:使用gpasswd命令添加用户到组里 # gpasswd -a user01 sysadmin -a选项:表示往组里追加用户 # gpasswd -M user02,user03 sysadmin 设置sysadmin组成员为user02,user03 -M选项:表示覆盖设置组成员(会覆盖原来的成员列表) |
2)删除组成员
将user03用户从组sysadmin里移除 # gpasswd -d user03 sysadmin |
2.4.2.3 总结
(1)创建组(groupadd)
组的信息保存文件-à/etc/group和/etc/gshadow
(2)删除组(groupdel)
什么样的组不能删除?-à不能删除属于其他用户的主组
(3)管理组成员(gpasswd)
①添加用户到组里-àgpasswd –a user1 组名 或 gpasswd –M user1,user2,… 组名
②从组里移除用户--àgpasswd –d user1 组名
2.5 Linux下文件权限管理
目标:
- 理解rwx分别对于普通文件和目录的不同含义
- 能够使用chmod命令的数字、字母形式修改文件的权限
- 能够使用chown命令更改文件的拥有者和所属组
2.5.1 权限概述
2.5.1.1 什么是权限?
权限:在计算机系统中,权限是指某个计算机用户具有使用软件资源的权利。
思考:计算机资源分为哪两部分?
● 硬件资源 硬盘、CPU、内存、网卡等物理硬件资源
● 软件资源
软件:操作系统(特殊的软件)、应用程序。只要不启动,这些软件就是一堆静态的文件,并且静静的躺在我们计算机的磁盘中。
软件资源:linux系统中,一切皆文件!SO,这里的软件资源就是文件资源。
总结:
我们今天所讲的权限,指的就是:文件资源所拥有的相关权限,即文件权限。
2.5.1.2 权限设置的目的
文件权限设置的目的:是想让某个用户(linux操作系统中的用户)有权利操作文件
2.5.1.3 文件权限的分类
□ 普通权限
用户正常情况去操作文件所具有的权限
□ 高级权限
用户对某个文件操作有特殊需求,而普通权限不能满足,需要给文件设置高级权限
□ 默认权限
用户在系统中创建一个文件,该文件默认都有一个权限,该权限是默认的
注意:
权限是设置在文件上的,而不是用户;设置权限的目的是让相应的人(用户)去操作相应的文件。
2.5.2 普通权限(重点)
2.5.2.1 理解普通权限rwx含义
(1)读权限—r(read)
- 针对目录
一个目录有r权限,说明可以查看该目录里的内容(ls命令列出)
- 针对普通文件
一个普通文件拥有r权限,说明可以查看该文件的内容(cat/head/tail/less/more等命令查看)
- 读权限r(read)用数字表示是4
(2)写权限—w(write)
- 针对目录
一个目录有w权限,说明可以在该目录里创建、删除、重命名等操作(mkdir/touch/mv/rm等)
- 针对普通文件
一个普通文件拥有w权限,说明可以修改该文件的内容(vi/vim编辑器编辑文件)
- 写权限w(write)用数字表示是2
(3)执行权限—x(execute)
- 针对目录
一个目录拥有x权限,说明可以进入或切换到该目录里(cd命令)
- 针对普通文件
一个普通文件拥有x权限,说明可以执行该文件 (一般程序文件、脚本文件、命令都需要执行权限)
- 执行限x(execute)用数字表示是1
(4)没有权限—横杠-
- 没有任何权限用横杠-表示,数字表示是0
2.5.2.2 理解UGO的含义
(1)UGO指的是什么
UGO,指的是用户身份,每个字母代表不同的用户身份。
◆ U (the user who owns it)
文件的拥有者(owner)或者创建者
◆ G (other users in the file’s group)
在文件的所属组(默认是创建文件的用户的主组)里的用户
◆ O (other users not in the file’s group)
既不是文件的创建者,也不是文件属组里的用户,称为其他人
注意: 除了上面ugo以外,还有一个字母a (all users),表示所有用户,包含ugo
(2)如何判断不同身份的用户对文件的权限
查看文件详细信息,包含权限信息: [root@localhost ~]# ls -l total 144 -rw-r--r--. 1 root root 9 Mar 2 20:38 1.sh -rw-------. 1 root root 1651 Feb 28 11:00 anaconda-ks.cfg drwxr-xr-x. 2 root root 4096 Mar 6 18:34 Desktop drwxr-xr-x. 2 root root 4096 Feb 28 14:12 dir1 |
2.5.2.3 修改文件普通权限(chmod)
(1)chmod命令用法
chmod [选项] 模式 文件名 常见选项: -R, --recursive 递归更改目录和目录里文件的权限 |
(2)举例说明
① 通过字母形式更改文件权限
u:表示文件拥有者 g:表示文件属组里的用户 o:表示其他人,即不是文件的创建者,也不在文件属组里 a:表示所有人 |
- 环境准备
[root@heima ~]# mkdir /tmp/dir1 [root@heima ~]# touch /tmp/dir1/file{1..5} [root@heima ~]# touch /tmp/test{1..3} [root@heima ~]# ll /tmp/ -R |
- 使用字母形式修改文件权限
[root@heima tmp]# pwd /tmp [root@heima tmp]# ll test1 -rw-r--r--. 1 root root 0 Mar 6 20:45 test1 [root@heima tmp]# chmod u+x test1 [root@heima tmp]# ll test1 -rwxr--r--. 1 root root 0 Mar 6 20:45 test1 [root@heima tmp]# chmod g+w test1 [root@heima tmp]# ll test1 -rwxrw-r--. 1 root root 0 Mar 6 20:45 test1 [root@heima tmp]# chmod o-r test1 [root@heima tmp]# ll test1 -rwxrw----. 1 root root 0 Mar 6 20:45 test1 [root@heima tmp]# ll test2 -rw-r--r--. 1 root root 0 Mar 6 20:45 test2 [root@heima tmp]# chmod a+x test2 [root@heima tmp]# ll test2 -rwxr-xr-x. 1 root root 0 Mar 6 20:45 test2 [root@heima tmp]# ll test3 -rw-r--r--. 1 root root 0 Mar 6 20:45 test3 [root@heima tmp]# chmod u+x,g+w,o-r test3 [root@heima tmp]# ll test3 -rwxrw----. 1 root root 0 Mar 6 20:45 test3 [root@heima tmp]# chmod u=rw,g=rx,o+r test3 [root@heima tmp]# ll test3 -rw-r-xr--. 1 root root 0 Mar 6 20:45 test3 修改目录的权限: [root@heima tmp]# ll -d dir1/ drwxr-xr-x. 2 root root 4096 Mar 6 20:45 dir1/ [root@heima tmp]# ll dir1/ total 0 -rw-r--r--. 1 root root 0 Mar 6 20:45 file1 -rw-r--r--. 1 root root 0 Mar 6 20:45 file2 -rw-r--r--. 1 root root 0 Mar 6 20:45 file3 -rw-r--r--. 1 root root 0 Mar 6 20:45 file4 -rw-r--r--. 1 root root 0 Mar 6 20:45 file5 1.只修改目录本身的权限 [root@heima tmp]# chmod g+w dir1/ [root@heima tmp]# ll -d dir1/ drwxrwxr-x. 2 root root 4096 Mar 6 20:45 dir1/ [root@heima tmp]# ll dir1/ total 0 -rw-r--r--. 1 root root 0 Mar 6 20:45 file1 -rw-r--r--. 1 root root 0 Mar 6 20:45 file2 -rw-r--r--. 1 root root 0 Mar 6 20:45 file3 -rw-r--r--. 1 root root 0 Mar 6 20:45 file4 -rw-r--r--. 1 root root 0 Mar 6 20:45 file5 说明:目录下面文件的权限并没有修改 2.修改目录以及目录里所有文件的权限(递归修改),使用-R参数 [root@heima tmp]# chmod -R o+w dir1/ [root@heima tmp]# ll -d dir1/ drwxrwxrwx. 2 root root 4096 Mar 6 20:45 dir1/ [root@heima tmp]# ll dir1/ total 0 -rw-r--rw-. 1 root root 0 Mar 6 20:45 file1 -rw-r--rw-. 1 root root 0 Mar 6 20:45 file2 -rw-r--rw-. 1 root root 0 Mar 6 20:45 file3 -rw-r--rw-. 1 root root 0 Mar 6 20:45 file4 -rw-r--rw-. 1 root root 0 Mar 6 20:45 file5 |
② 通过数字形式更改文件权限
● 学会用数字表示权限
字母和数字对应关系: r——4 w——2 x——1 -——0 rw- r-x r-- 用数字表示就是654 rwx rw- --- 用数字表示就是760 755 用字母表示就是rwx r-x r-x 644 用字母表示就是rw- r-- r-- |
● 使用数字形式修改文件权限
# chmod 644 file1 rw-r--r-- # chmod 700 file2 # chmod -R 755 dir1 |
2.5.2.4 总结
(1)普通权限当中rwx含义
● 目录:r(ls列出目录内容),w(创建、删除、重命名等操作),x(cd进入目录)
● 文件:r(cat等相关工具查看文件内容),w(修改文件内容),x(可执行,程序,脚
本文件等)
(2)理解用户身份(UGO)
● U:文件的拥有者(创建)
● G:文件所属组里成员
● O:陌生人(其他人)
(3)如何设置文件的权限:-àchmod命令
● 用字母形式
chmod u+x,g=rw,o-x filename |
● 用数字形式
r——>4 w——>2 x——>1 -——>0 rw- r-x r-- = 654 chmod 755 filename rwx r-x r-x |
(4)是否可以在目录里创建或删除文件?
看当前目录本身是否由w权限!!
(5)对于正常操作目录而言,一般都会具有r和x权限
2.5.3 默认权限(了解)
2.5.3.1 什么是文件的默认权限
所谓文件的默认权限(遮罩权限),是指用户创建文件后,文件天生就有的权限,不需要设置。
2.5.3.2 文件默认权限由谁控制
文件默认权限由一个叫做umask的东西来控制。
2.5.3.3 umask如何控制文件默认权限
(1)临时控制
● 什么是临时控制?
临时控制,指的是用命令umask临时设置,只在当前终端当前进程中生效。
查看当前用户的umask: [root@localhost ~]# umask 0022 [root@localhost ~]# su - user01 [user01@localhost ~]$ umask 0002 注意: 1. 管理员和普通用户的umask不同,就表示管理员和普通用户创建的文件的默认权限不同! 2. 第1位数字表示高级权限;后面3位数字表示普通权限 |
● 如何临时设置用户的umask?
写在前面:
linux系统中,默认创建目录的最大权限是0777;文件的最大权限是0666
[root@localhost ~]# umask 0007 临时设置root用户的umask为0007 问:umask=0007,那么在当前终端上root用户所创建目录和普通文件的权限分别是什么呢? 计算过程如下: umask=文件的最大权限-文件的默认权限 目录: 目录的默认权限=0777-umask=0777-0007=0770 rwxrwx--- 普通文件: 文件的默认权限=0666-umask=0666-0007=0660 rw-rw---- 说明: 1.权限用数字表示时没有负数,所以最小就是0 2.默认权限规则遵循Linux系统中权限最小化原则 特殊情况: $ stu1 umask 0003 目录:0777-0003=0774 rwxrwxr-- 文件:0666-0003=0663 rw-rw--wx 实际权限:rw-rw-r-- $ user01 umask 0005 文件:0666-0005=0661 rw-rw---x 实际权限:rw-rw--w- |
(2)永久控制
● 什么是永久设置?
永久设置,指的是通过修改配置文件设置,对用户的所有终端所有进程生效。
● 修改哪个配置文件呢?
① 相关配置文件介绍
全局配置文件(针对所有用户所有进程) /etc/profile 系统和用户的环境变量信息,当用户第一次登录时,该文件被读取 /etc/bashrc 每个运行的bash信息(系统别名、函数及默认权限的定义),当bash被打开时,该文件被读取 局部配置文件(针对某个特定用户以及用户的所有进程) ~/.bashrc 当前用户的bash信息,当用户登录和每次打开新的shell时该文件被读取 ~/.bash_profile 当前用户的环境变量,当用户登录时,该文件被读取 ~/.bash_history 保存当前用户历史命令的文件 ~/.bash_logout 当用户退出bash或者终端时,会首先执行该文件里的代码,然后再退出 |
② 如何永久设置用户的umask?
1.针对所有用户生效 # vim /etc/bashrc 在该文件的最后增加以下内容: umask 0007 重新读取该配置文件让其立马生效 # source /etc/bashrc 或者 # . /etc/bashrc 2.针对某个用户生效 比如,只针对user01用户生效 [user01@localhost ~]$ vim ~/.bashrc 在该文件的最后增加以下内容: umask 0007 总结: 1. 配置文件,分为全局配置和局部配置 2. 全局和局部配置冲突,一般情况下以局部配置为准;二般情况,看情况 |
2.5.3.4 默认权限总结
(1)什么是文件的默认权限?
文件被(用户)创建出来后,天生自带的权限
(2)文件的默认权限由谁来控制?
由umask的值来控制文件的默认权限
umask值针对的是用户
(3)如何去更改或设置用户的umask?
① 临时设置
umask 007 只针对当前用户在当前终端生效
② 永久设置
针对所有人生效 --à /etc/bashrc(重新读取生效)
针对某个人生效 --à ~/.bashrc(重新读取生效)
2.5.4 文件的属主和属组
2.5.4.1 如何查看文件的属主和属组
2.5.4.2 如何修改文件的属主和属组
(1)chown命令修改
chown命令既可以修改文件的属主,也可以修改文件的属组。
只修改文件的属主 # chown 用户名 文件名 修改文件的属主和属组 # chown 用户名.组名 文件名 # chown 用户名:组名 文件名 # chown 用户名. 文件名 //没有指定组名,默认是用户的主组 只修改文件的属组 # chown .组名 文件名 # chown :组名 文件名 可以加-R选项,表示递归修改 |
(2)chgrp命令修改
chgrp命令只能修改文件的属组
# chgrp 组名 文件名 |
2.6 shell编程
2.6.1 shell与shell脚本的概念
Shell介于内核与用户之间,负责命令的解释。
Shell是一个用C语言编写的程序,通过Shell用户可以访问操作系统内核服务。它类似于DOS下的command和后来的cmd.exe。
Shell既是一种命令语言,又是一种程序设计语言。
Shell语言是解释型语言, shell解析器会逐行的解释shell程序代码,然后一行一行的去运行。
Shell就是人机交互的一个桥梁。有GUI和cmdline两种人机交互模式:
- GUI(图形用户界面),特点是操作简单、易学易用,适合使用电脑来工作的人。
- cmdline(命令行界面),譬如linux的终端和windows的cmd,特点是不易用易学,优点是可以进行方便的shell编程,适合做开发的人。
linux的Shell种类众多,一个系统可以存在多个shell,可以通过cat/etc/shells命令查看系统中安装的shell。
[root@MissHou ~]# cat /etc/shells /bin/sh #是bash的一个快捷方式 /bin/bash #bash是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能 /sbin/nologin #表示非交互,不能登录操作系统 /bin/dash #小巧,高效,功能相比少一些 /bin/csh #具有C语言风格的一种shell,具有许多特性,但也有一些缺陷 /bin/tcsh #是csh的增强版,完全兼容csh |
Bash由于易用和免费,在日常工作中被广泛使用。同时,,Bash也是大多数linux系统默认的shell。
Shell script是一种为Shell编写的脚本程序。Shell编程一般指shell脚本编程,不是指开发shell本身。
Shell编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
脚本的作用:重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。
2.6.2 shell脚本基本格式
使用vi编辑器新建一个文件xx.sh。扩展名并不影响脚本执行,见名知意。比如用php写shell脚本,扩展名就用.php。
#!/bin/env bash # 以下内容是对脚本的基本信息的描述 # Name: 名字 # Desc:描述describe # Path:存放路径 # Usage:用法 # Update:更新时间 #下面就是脚本的具体内容 commands ... |
1)脚本第一行,魔法字符#!指定解释器【必写】
#!/bin/bash 表示以下内容使用bash解释器解析
注意: 如果直接将解释器路径写死在脚本里,可能在某些系统就会存在找不到解释器的兼容性问题,所以可以使用: #!/bin/env 解释器
2)脚本第二部分,注释(#号)说明,对脚本的基本信息进行描述【可选】
3)脚本第三部分,脚本要实现的具体代码内容
示例:
#!/bin/sh //指定脚本编辑器,这里是用/bin/sh做解释器 cd ~ mkdir shell_tut //创建一个目录shell_tut cd shell_tut //切换到shell_tut目录 for ((i=0; i<10; i++)); do //循环条件,一共循环10次 touch test_$i.txt //创建一个test_0…9.txt文件 done //循环体结束 |
说明:mkdir, touch都是系统自带的程序,一般在/bin或者/usr/bin目录下。
for, do, done是sh脚本语言的关键字。
2.6.3 shell程序的运行
shell程序的运行有多种方法,这里介绍三种方法:
第一种:./xx.sh,和运行二进制可执行程序方法一样。这样运行shell要求shell程序必须具有可执行权限。chmod a+x xx.sh来添加可执行权限。
第二种:source xx.sh,source是linux的一个命令,这个命令就是用来执行脚本程序的。这样运行不需要脚本具有可执行权限。
第三种:bash xx.sh,bash是一个脚本程序解释器,本质上是一个可执行程序。这样执行相当于我们执行了bash程序,然后把xx.sh作为argv[1]传给他运行。
2.6.4 Shell变量
2.6.4.1 语法格式
变量=值,如:your_name=”itcast.cn”
注意:变量名和等号之间不能有空格,同时,变量名的命名必须遵循如下规则:
- 首个字符必须为字母(a-z, A-Z)
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
2.6.4.2 变量使用
使用一个定义过的变量,只要在变量名前面加$即可。
your_name=”itcast.cn”
echo $your_name
echo ${your_name}
花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。
已定义的变量,可以被重新定义。
2.6.4.3 变量类型
局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
环境变量 所有的程序,包括shell启动的程序,都能访问环境变量。有些程序需要环境变量来保证其正常运行。可以用set命令查看当前环境变量。
shell变量 shell 变量是由shell程序设置的特殊变量。Shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。
2.6.5 Shell参数传递
在执行Shell脚本时,可以向脚本传递参数。
脚本被获取参数的格式为:$n。n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,依次类推….. $0表示当前脚本名称。
2.6.5.1 特殊字符
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误 |
例子:
#!/bin/bash
echo “第一个参数为:$1”;
echo “参数个数为:$#”;
echo “传递的参数作为一个字符串显示:$*”;
执行脚本:./test.sh 12,38,56,79
2.6.5.2 $*和$@区别
相同点:都表示传递给脚本的所有参数。
不同点:
不被””包含时,$*和$@都以$1 $2 …$n的形式组成参数列表。
被””包含时,$*会将所有的参数作为一个整体,以 ”$1 $2 …$n”的形式组成一个
整串,” $@”会将各个参数分开,以”$1 $2 …$n”的形式组成一个参数列表。
2.6.6 Shell运算符
Shell和其他编程语言一样,支持包括算术、关系、布尔、字符串等运算符。原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如expr。expr是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加:
val=`expr 2 + 2`
echo $val
注意:
表达式和运算符之间要有空格,例如2+2是不对的,必须写成2 + 2。
完整的表达式要被``包含,注意不是单引号,在Esc键下边。
2.6.7 条件判断
2.6.7.1 条件判断语法结构
格式1: test 条件表达式 格式2: [ 条件表达式 ] 格式3: [[ 条件表达式 ]] 支持正则 说明: [ ] 为test命令的另一种形式,但要注意: 1.必须在左括号的右侧和右括号的左侧各加一个空格,否则会报错。 2.test命令使用标准的数学比较符号来表示字符串的比较,而用文本符号来表示数值的比较。 3.大于符号或小于符号必须要转义,否则会被理解成重定向。 [[ ]] 测试变量时如果变量为空且变量未加引号,不会报错,但[]会; [[ ]] 测试字符串支持正则表达式匹配; [[ ]] 是内建于bash的,[ ]可能是个外部命令; |
2.6.7.2 条件判相关参数
① 判断文件类型
② 判断文件权限
③ 判断文件新旧
说明:这里的新旧指的是文件的修改时间。
④ 判断整数
⑤ 判断字符串
⑥ 多重条件判断
特别说明:
&& 前面的表达式为真,才会执行后面的代码
|| 前面的表达式为假,才会执行后面的代码
; 只用于分割命令或表达式
示例说明:
- 数值比较
[root@server ~]# [ $(id -u) -eq 0 ] && echo "the user is admin" [root@server ~]$ [ $(id -u) -ne 0 ] && echo "the user is not admin" [root@server ~]$ [ $(id -u) -eq 0 ] && echo "the user is admin" || echo "the user is not admin" [root@server ~]# uid=`id -u` [root@server ~]# test $uid -eq 0 && echo this is admin this is admin [root@server ~]# [ $(id -u) -ne 0 ] || echo this is admin this is admin [root@server ~]# [ $(id -u) -eq 0 ] && echo this is admin || echo this is not admin this is admin [root@server ~]# su - stu1 [stu1@server ~]$ [ $(id -u) -eq 0 ] && echo this is admin || echo this is not admin this is not admin |
- 类C风格的数值比较
注意:在(( ))中,=表示赋值;==表示判断 [root@server ~]# ((1==2));echo $? [root@server ~]# ((1<2));echo $? [root@server ~]# ((2>=1));echo $? [root@server ~]# ((2!=1));echo $? [root@server ~]# ((`id -u`==0));echo $? [root@server ~]# ((a=123));echo $a [root@server ~]# unset a [root@server ~]# ((a==123));echo $? |
- 字符串比较
注意:双引号引起来,看作一个整体;= 和 == 在 [ 字符串 ] 比较中都表示判断 [root@server ~]# a='hello world';b=world [root@server ~]# [ $a = $b ];echo $? [root@server ~]# [ "$a" = "$b" ];echo $? [root@server ~]# [ "$a" != "$b" ];echo $? [root@server ~]# [ "$a" !== "$b" ];echo $? 错误 [root@server ~]# [ "$a" == "$b" ];echo $? [root@server ~]# test "$a" != "$b";echo $? |
2.6.8 流程控制
2.6.8.1 if else语句
方式一:
if [ condition ];then command1 else command2 fi |
方式二:
if [ condition1 ];then command1 结束 elif [ condition2 ];then command2 结束 else command3 fi 注释: 如果条件1满足,执行命令1后结束;如果条件1不满足,再看条件2,如果条件2满足执行命令2后结束;如果条件1和条件2都不满足执行命令3结束. |
示例:
让用户自己输入字符串,如果用户输入的是hello,请打印world,否则打印“请输入hello”
#!/bin/env bash read -p '请输入一个字符串:' str if [ "$str" = 'hello' ];then echo 'world' else echo '请输入hello!' fi 1 #!/bin/env bash 2 3 read -p "请输入一个字符串:" str 4 if [ "$str" = "hello" ] 5 then 6 echo world 7 else 8 echo "请输入hello!" 9 fi echo "该脚本需要传递参数" 1 if [ $1 = hello ];then 2 echo "hello" 3 else 4 echo "请输入hello" 5 fi |
2.6.8.2 for循环语句
(1)列表循环
列表for循环:用于将一组命令执行已知的次数
for variable in {list} do command command … done 或者 for variable in a b c do command command done |
示例:
# for var in {1..10};do echo $var;done # for var in 1 2 3 4 5;do echo $var;done # for var in `seq 10`;do echo $var;done # for var in $(seq 10);do echo $var;done # for var in {0..10..2};do echo $var;done # for var in {2..10..2};do echo $var;done # for var in {10..1};do echo $var;done # for var in {10..1..-2};do echo $var;done # for var in `seq 10 -2 1`;do echo $var;done |
(2)不带列表循环
不带列表的for循环执行时由用户指定参数和参数的个数
for variable do command command … Done |
示例:
#!/bin/bash for var do echo $var done echo "脚本后面有$#个参数" |
(3)类C风格的for循环
for(( expr1;expr2;expr3 )) do command command … Done for (( i=1;i<=5;i++)) do echo $i done expr1:定义变量并赋初值 expr2:决定是否进行循环(条件) expr3:决定循环变量如何改变,决定循环什么时候退出 |
示例:
# for ((i=1;i<=5;i++));do echo $i;done # for ((i=1;i<=10;i+=2));do echo $i;done # for ((i=2;i<=10;i+=2));do echo $i;done |
2.6.8.3 while循环语句
特点:条件为真就进入循环;条件为假就退出循环
while 表达式 do command... done while [ 1 -eq 1 ] 或者 (( 1 > 2 )) do command command ... done |
示例:循环打印1-5数字
FOR循环打印: for ((i=1;i<=5;i++)) do echo $i done while循环打印: i=1 while [ $i -le 5 ] do echo $i let i++ done |
let命令是BASH中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上$来表示变量。自加操作:let no++ 自减操作:let no--
2.6.8.4 case语句
case语句为多重匹配语句,如果匹配成功,执行相匹配的命令
case var in 定义变量;var代表是变量名 pattern 1) command1 需要执行的语句 ;; 两个分号代表命令结束 command2 ;; pattern 3) command3 ;; *) default,不满足以上模式,默认执行*)下面的语句 command4 ;; esac esac表示case语句结束 |
2.6.9 函数的使用
所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
[function] funname[()] { action; [return int;] } |
说明:可以带function fun()定义,也可以直接fun()定义,不带任何参数。
示例1:
#!/bin/env bash demoFun() { echo “这是我的第一个shell函数!” } echo “-------函数开始执行-------” demoFun echo “-------函数执行完毕-------” |
函数中return说明:
- return可以“结束一个函数”。类似于循环控制语句break(结束当前循环,执行循环体后面的代码)。
- return默认返回函数中最后一个命令状态值,也可以给定参数值,范围是0-256之间。
- 如果没有return命令,函数将返回最后一个指令的退出状态值。
示例2:
#!/bin/env bash funWithReturn() { echo “这个函数会对输入的两个数字进行相加运算…” echo “输入第一个数字:” read aNum echo “输入第二个数字:” read anotherNum echo “两个数字分别为$aNum和$anotherNum !” return $(($aNum + $anotherNum)) } funWithReturn echo “输入的两个数字之和为$? !” 函数返回值在调用该函数后通过$? 来获得。 |
在shell中,调用函数时可以向其传递参数。在函数体内部,通过$n的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…
注意,当n>=10时,需要使用${n}来获取参数。
#!/bin/env bash funWithParam(){ echo “第一个参数为$1 !” echo “第二个参数为$2 !” echo “第十个参数为$10 !” echo “第十个参数为${10} !” echo “第十一个参数为${11} !” echo “参数总数有$# 个!” echo “作为一个字符串输出所有参数$* !” } funWithParam 1 2 3 4 5 6 7 8 9 34 73 |
2.7 Makefile工程管理器
2.7.1 Makefile概述
1、为什么需要Makefile:Makefile是用来管理工程的,在一个正式的软件项目中,由很多个.c和.h文件构成,此时如果直接在命令行编译,需运行:“gcc *.c *.S -o exe”命令,每次编译都要重新输入该命令,此问题严重影响工作效率,我们通过Makefile来进行一键编译。
2、Makefile中的一些基本概念:
- 目标(目标顶格写,后面是冒号,冒号后面是依赖);
- 依赖(依赖是用来产生目标的原材料);
- 命令(命令前面一定是Tab,不能是顶格,也不能是多个空格,命令即要生成目标需要做的动作)。
3、Makefile的基本工作原理:当我们执行“make xx”的时候,Makefile会自动执行xx这个目标下面的命令语句;当我们“make xx”的时候,是否执行命令是取决于依赖的,依赖如果成立就会执行命令,否则不执行;我们直接执行make和make第1个目标的效果是相同的(第1个目标即默认目标)。
4、进阶学习Makefile的资料:我们学习Makefile的思路为先学会基本的概念和应用,先理解Makefile的概念和使用方法及工作原理;先自己会写简单的Makefile来管理工程,一般先学到这里就可以了,更深入的内容可在工作中碰到再学习即可;若需深入学习Makefile建议参考《跟我一起学Makefile》(作者:陈皓)学习(前期学习前6个章节内容即可)。
示例:
用编辑器编辑源文件hello.c #include<stdio.h> int main(void){ printf(“Hello World!”); return 0; } gcc hello.c -o hello //生成可执行文件hello gcc hello.c //默认生成可执行文件a.out Makefile文件: hello:hello.c <Tab>gcc –o hello hello.c 或者: hello:hello.o <Tab>gcc –o hello hello.o hello.o:hello.c <Tab>gcc –c –o hello.o hello.c 或者: hello:hello.o <Tab>gcc –o hello hello.o hello.o:hello.c <Tab>gcc –o hello.o –c hello.c .PHONY:clean all clean: -rm -rf *.o Makefile文件的执行: Makefile //默认第一个目标文件为生成文件 Makefile hello //生成可执行文件 |
2.7.2 通配符%和Makefile自动推导(规则)
1、%是Makefile中的通配符,代表一个或几个字母。也就是说%.o就代表所有以.o为结尾的文件。
2、所谓自动推导其实就是Makefile的规则。当Makefile需要某一个目标时,他会把这个目标去套规则说明,一旦套上了某个规则说明,则Makefile会试图寻找这个规则中的依赖,如果能找到则会执行这个规则用依赖生成目标。
2.7.3 Makefile中定义和使用变量
Makefile中定义和使用变量,和shell脚本中非常相似。相似是说:都没有变量类型,直接定义使用,引用变量时用$var
2.7.4 伪目标(.PHONY)
1、伪目标意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件或东西,而是单纯为了执行这个目标下面的命令。
2、伪目标一般都没有依赖,因为执行伪目标就是为了执行目标下面的命令。既然一定要执行命令了那就不必加依赖,因为不加依赖意思就是无条件执行。
3、伪目标可以直接写,不影响使用;但是有时候为了明确声明这个目标是伪目标会在伪目标的前面用.PHONY来明确声明它是伪目标。
2.7.5 使用Makefile时的注意事项
1、Makefile的文件名合法的一般有2个:Makefile或者makefile
2、有时候Makefile总体比较复杂,因此分成好几个Makefile来写。然后在主Makefile中引用其他的,用include指令来引用。引用的效果也是原地展开,和C语言中的头文件包含非常相似。
3、Makefile中注释使用#,和shell一样。
2.7.6 命令前面的@用来静默执行
1、在makefile的命令行中前面的@表示静默执行。
2、Makefile中默认情况下在执行一行命令前会先把这行命令给打印出来,然后再执行这行命令。
3、如果你不想看到命令本身,只想看到命令执行就静默执行即可。
2.7.7 Makefile中几种变量赋值运算符
1、= 最简单的赋值
2、:= 一般也是赋值
以上这两个大部分情况下效果是一样的,但是有时候不一样。
用=赋值的变量,在被解析时他的值取决于最后一次赋值时的值,所以你看变量引用的值时不能只往前面看,还要往后面看。
用:=来赋值的,则是就地直接解析,只用往前看即可。
3、?= 如果变量前面并没有赋值过则执行这条赋值,如果前面已经赋值过了则本行被忽略。(实验可以看出:所谓的没有赋值过其实就是这个变量没有被定义过)
4、+= 用来给一个已经赋值的变量接续赋值,意思就是把这次的值加到原来的值的后面,有点类似于strcat。(在shell makefile等文件中,可以认为所有变量都是字符串,+=就相当于给字符串stcat接续内容)(注意一个细节,+=续接的内容和原来的内容之间会自动加一个空格隔开)
注意:Makefile中并不要求赋值运算符两边一定要有空格或者无空格,这一点比shell的格式要求要松一些。
2.7.8 Makefile中使用通配符
1、* 若干个任意字符
2、? 1个任意字符
3、[] 将[]中的字符依次去和外面的结合匹配
还有个%,也是通配符,表示任意多个字符,和*很相似,但是%一般只用于规则描述中,又叫做规则通配符。
2.7.9 Makefile的自动变量
1、为什么使用自动变量。在有些情况下文件集合中文件非常多,描述的时候很麻烦,所以我们Makefile就用一些特殊的符号来替代符合某种条件的文件集,这就形成了自动变量。
2、自动变量的含义:预定义的特殊意义的符号。就类似于C语言编译器中预制的那些宏__FILE__一样。
3、常见自动变量:
$@ 规则的目标文件名
$< 规则的依赖文件名
$^ 依赖的文件集合