第02章 CentOS基本操作

 2.文件基本操作【文件操作(一)】

目标

  • 理解Linux下路径的表示方法
  • 能够使用命令(mkdirtouch)在指定位置创建目录和文件
  • 能够使用命令(rm)删除指定的目录和文件
  • 能够使用命令(ls)列出目录里的文件
  • 能够使用命令(cat,head,tail,less,more)查看文件内容
  • 理解标准输入、标准输出和标准错误的含义

 

2.1 CentOs6.7桌面环境操作

2.1.1桌面环境介绍

用户登录成功后,会进入CentOS桌面环境,桌面环境大致分为三部分:控制面板工作区任务栏

2.1.2 终端的基本操作

  1. 操作系统与用户交互模式有两种:图形界面和命令行

所有的命令需要在一个载体上执行,这个载体就叫做终端。终端上所有命令都需要一个 东西翻译解析一下,计算机才能理解并执行。这个翻译解析的东西叫SHELL解释器 RedHat和Centos默认shell解释器叫bash。

  1. 打开多个终端 Ctrl+Alt+F1-F6
  2. 快捷键设置

快捷

作用

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

第三方源码包默认安装目录

类似windowsC:\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文件

思考:这2file1文件是同一个文件吗?

答:不是同一个文件,因为路径不一样。

修改文件的时间(目标文件存在

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开始relatimeatime延迟修改,必须满足其中一个条件:

1. 自上次atime修改后,已达到86400秒;

2. 发生写操作时;

2.3.5 查看文件内容

 cat 命令:一般查看小文件,从第一行到最后一行列出来

常见选项:

-n:显示行号

-A:显示控制字符,如换行符,制表符等( linux $ Windows ^M$

 tac 命令:一般查看小文件,从最后一行到第一行列出来

 moreless 命令:一般查看大文件,q退出查看,可以搜索,建议less命令

 head 命令:默认查看文件前10行, head -n 15head -15 表示查看前15

 tail 命令:默认查看文件后10行, tail -n 15tail -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                           删掉文本的18

: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年的11日到现在的天数)

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

账户过期的时间,账户过期的用户不能登录;密码过期用户不能用原来的密码登录。以197011日算起。

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用户的UID1100

[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,指定组的GID1111

[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:表示所有人

  1. 环境准备

[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

  1. 使用字母形式修改文件权限

[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用户的umask0007

问: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两种人机交互模式:

  1. GUI(图形用户界面),特点是操作简单、易学易用,适合使用电脑来工作的人。
  2. 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”

注意:变量名和等号之间不能有空格,同时,变量名的命名必须遵循如下规则:

  1. 首个字符必须为字母(a-z, A-Z)
  2. 中间不能有空格,可以使用下划线(_)
  3. 不能使用标点符号
  4. 不能使用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 条件判相关参数

① 判断文件类型

② 判断文件权限

③ 判断文件新旧

说明:这里的新旧指的是文件的修改时间

④ 判断整数

⑤ 判断字符串

⑥ 多重条件判断

特别说明

&& 前面的表达式为真,才会执行后面的代码

|| 前面的表达式为假,才会执行后面的代码

; 用于分割命令或表达式

示例说明:

  1. 数值比较

[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

  1. 类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 $?

  1. 字符串比较

注意:双引号引起来,看作一个整体;=  ==  [ 字符串 ] 比较中都表示判断

[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            需要执行的语句

;;                        两个分号代表命令结束
pattern 2)

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说明:

  1. return可以“结束一个函数”。类似于循环控制语句break(结束当前循环,执行循环体后面的代码)。
  2. return默认返回函数中最后一个命令状态值,也可以给定参数值,范围是0-256之间。
  3. 如果没有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、常见自动变量:

$@ 规则的目标文件名

$< 规则的依赖文件名

$^ 依赖的文件集合

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918713.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

案例精选 | 某知名教育集团基于安全运营平台的全域威胁溯源实践

某知名教育集团成立于1999年&#xff0c;总部位于北京海淀中关村。集团专注于K-12基础教育&#xff0c;构建了从幼儿园到高中的全面教育体系&#xff0c;涵盖学校管理、教学科研、师资培训、信息化服务等多个方面。集团在全国范围内设有15所小学、12所初中、9所高中、6个国际部…

Java-01 深入浅出 MyBatis - MyBatis 概念 ORM映射关系 常见ORM 详细发展历史

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

nodejs和npm在gitbash中提示Not Found情况的解决办法

很多小伙伴学习了node以后&#xff0c;在cmd命令行中可以正常的获取node版本和npm版本&#xff0c;但是我们经常使用gitbash来管理git&#xff0c;这时候下载完gitbash后&#xff0c;在gitbash中输入node -v和npm -v会提示Not Found。这种情况如何处理&#xff1f;&#xff1f;…

Linux:调试器-gdb/cgdb

文章目录 一、编译成debug1、-g 选项 二、gdb调试命令1、在CentOS系统下检查安装gdb2、进入gdb模式3、quit 退出gdb4、list &#xff08;简写 l&#xff09;显示文件内容5、b 打断点6、 r / run运行程序7、c 让程序直接运行完 三、cgdb1、info b查看打的所有断点2、d 删除断点3…

数据结构 -- 二叉搜索树

二叉搜索树 概念 二叉搜索树又称为二叉排序树&#xff0c;它或为空树&#xff0c;或为具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于等于根节点的值。若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于等于根节…

VScode使用Batch Runner插件在终端运行bat文件

搜索并安装插件Batch Runner 创建测试文件 echo off echo "Hello world"按F5运行

4.STM32之通信接口《精讲》之USART通信---实验串口发送程序

本节将进行实战&#xff0c;基础了解请查看第1&#xff0c;2&#xff0c;3节&#xff08;Whappy&#xff09; 开始背&#xff01;&#xff01; USART ---》全双工 异步/同步 点对点 C语言基础printf用法&#xff0c;这节将用到printf的重定向&#xff0c;来打印到串口助手上…

特征融合篇 | CARAFE:轻量级通用上采样算子,可提高目标检测性能

前言:Hello大家好,我是小哥谈。CARAFE算子的主要特点是在保持轻量级功能的同时,能够提供比其他上采样算子更好的性能。它通过少量的参数和计算量来实现高效的图像上采样。CARAFE算子能够根据像素之间的关系进行自适应的上采样,从而更好地保留图像的细节和语义信息。🌈 …

游戏引擎学习第18天

clang-format 相关的配置可以参考下面 .clang-format 是用来配置代码格式化规则的文件&#xff0c;主要用于 Clang-Format 工具。以下是 .clang-format 文件中的一些常用设置&#xff1a; 1. 基础设置 Language: Cpp # 指定语言 (C, C, Java, JavaScript, etc…

递归(3)----力扣40组合数2,力扣473火柴拼正方形

给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 示例 1: 输入: candidates [10,1,2,7,6,1…

SpringBoot Data Redis连接Redis-Cluster集群

使用SpringBoot Data Redis无法连接Redis-Cluster集群 最近在研究系统高并发下的缓存架构&#xff0c;因此自己在自己买的云服务器上搭建好Redis 5.0 版本的集群后&#xff0c;使用springboot的 RedisTemplate连接是发现总是访问不到集群节点。上网百度了发现没有好的解决办法&…

【插件】重复执行 pytest-repeat

安装 pip3 install pytest-repeat 用法 1.命令行 pytest --count num pytest --count 32.装饰器 pytest.mark.repeat(num) #num运行次数 pytest.mark.repeat(5)#执行结果如下&#xff1a;

强制放大缩小(适用于所有ctrl-,ctrl+)

以下操作&#xff1a; 使用资源管理器打开启动文件夹&#xff1a; 按下 Win R 键打开“运行”对话框。输入 shell:startup&#xff0c;然后按下 Enter。这应该会打开启动文件夹。 手动定位启动文件夹&#xff1a; 打开资源管理器并导航到以下路径&#xff1a; C:\Users\admin…

web前端开发网页--css样式的使用

1、css层叠性 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>css层叠性</title><style type"text/css">p{font-size: 12px;font-family: "微软雅黑";}.special{font-size: 24px;}#one{c…

idea 通过git撤销commit但未push的操作

1、undo commit 适用情况&#xff1a;代码修改完了&#xff0c;已经Commit了&#xff0c;但是还未push&#xff0c;然后发现还有地方需要修改不想提交本次记录了。这时可以进行Undo Commit&#xff0c;修改后再重新Commit。注意&#xff1a;如果已经进行了Push&#xff0c;线上…

『VUE』30. 生命周期的介绍(详细图文注释)

目录 生命周期生命周期的8阶段生命周期小例子总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 生命周期 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xf…

远程jupyter lab的配置

打开虚拟环境 conda activate test 在环境下安装ipykernel软件包&#xff0c;这个软件包允许jupyter notebookl使用特定环境的python版本。 conda install ipykernel 将该环境添加到Jupyter Notebook中 python -m ipykernel install --user --nametest --display-name&quo…

C指针之舞——指针探秘之旅

❤博客主页&#xff1a;折枝寄北-CSDN博客 ❤专栏内容&#xff1a;C语言学习专栏https://blog.csdn.net/2303_80170533/category_12794764.html?spm1001.2014.3001.5482 指针基础学习 在之前的博客文章中&#xff0c;简单总结了指针的基础概念 我们知道了指针的概念&#xf…

MATLAB绘制克莱因瓶

MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…

Spring Cloud微服务下如何配置I8n

什么是I8n 国际化&#xff08;I18n&#xff09;指的是设计和开发产品的过程&#xff0c;使得它们能够适应多种语言和文化环境&#xff0c;而不需要进行大量的代码更改。这通常涉及到创建一个基础版本的产品&#xff0c;然后通过配置和资源文件来添加对不同语言和地区的支持。 这…