当前位置: 首页 > news >正文

第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、常见自动变量:

$@ 规则的目标文件名

$< 规则的依赖文件名

$^ 依赖的文件集合

 

相关文章:

第02章 CentOS基本操作

2.文件基本操作【文件操作&#xff08;一&#xff09;】 目标 理解Linux下路径的表示方法能够使用命令(mkdir和touch)在指定位置创建目录和文件能够使用命令(rm)删除指定的目录和文件能够使用命令(ls)列出目录里的文件能够使用命令(cat,head,tail,less,more)查看文件内容理解标…...

241113.学习日志——[CSDIY] [ByteDance] 后端训练营 [02]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…...

【HOT100第三天】和为K的子数组,最大子数组和,合并区间,轮转数组

今天练的是子串和子数组专题 ~ &#xff08;前缀和那里差点学死了&#xff09; 560.和为K的子数组 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 先写个暴力法&#xff0c;用昨天刚学…...

设计模式-Adapter(适配器模式)GO语言版本

前言 个人感觉Adapter模式核心就在于接口之间的转换。将已有的一些接口转换成其他接口形式。并且一般用于对象上&#xff0c;而不是系统上 问题 就用一个简单的问题&#xff0c;懂数据结构的同学可能知道双端队列。那么就用双端队列实现一个栈&#xff08;stack&#xff09;或…...

SAM_Med2D 训练完成后boxes_prompt没有生成mask的问题

之前对着这这篇文章去微调SAM_Med2D(windows环境),发现boxes_prompt空空如也。查找了好长时间问题SAM-Med2D 大模型学习笔记&#xff08;续&#xff09;&#xff1a;训练自己数据集_sam训练自己数据集-CSDN博客 今天在看label2image_test.json文件的时候发现了一些端倪: 官方…...

游戏引擎学习第18天

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

Kotlin return与return@forEachIndexed

Kotlin return与returnforEachIndexed fun main() {val data arrayOf(0, 1, 2, 3, 4)println("a")data.forEachIndexed { index, v ->if (v 2) {//类似while循环中的continue//跳过&#xff0c;继续下一个forEachIndexed迭代returnforEachIndexed}println("…...

基于Canny边缘检测和轮廓检测

这段代码实现了基于Canny边缘检测和轮廓检测&#xff0c;从图像中筛选出面积较大的矩形&#xff0c;并使用OpenCV和Matplotlib显示结果。主要流程如下&#xff1a; 步骤详解&#xff1a; 读取图像&#xff1a; img cv2.imread(U:/1.png)使用cv2.imread()加载图像。 转换为灰…...

力扣题目解析--合并k个升序链表

题目 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1a;链表数组如下…...

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…...

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

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

Python 人脸检测:使用 Dlib 和 OpenCV

简介 本文用Python、Dlib 和 OpenCV 库来检测图像中的人脸&#xff0c;并在人脸上绘制矩形框进行窗口显示。 环境准备 在开始之前&#xff0c;请确保您的计算机上已安装 Python。此外&#xff0c;您还需要安装以下库&#xff1a; dlib&#xff1a;一个包含多种机器学习算法…...

【大数据学习 | flume】flume的概述与组件的介绍

1. flume概述 Flume是cloudera(CDH版本的hadoop) 开发的一个分布式、可靠、高可用的海量日志收集系统。它将各个服务器中的数据收集起来并送到指定的地方去&#xff0c;比如说送到HDFS、Hbase&#xff0c;简单来说flume就是收集日志的。 Flume两个版本区别&#xff1a; ​ 1&…...

torch.is_storage()

torch.is_storage() 判断给定的对象是否是一个 PyTorch 存储对象 PyTorch 存储对象&#xff1a;PyTorch 中&#xff0c;存储对象&#xff08;Storage&#xff09;是一个低级别的对象&#xff0c;它表示一个存储数据的连续内存块。存储对象不包含任何关于数据如何解释的信息&a…...

2411rust,编译时自动检查配置

原文 Cargo和编译器团队很高兴地宣布,从Rust1.80(或nightly-2024-05-05)开始,会自动检查每个可访问的#[cfg],看看是否与期望的配置名和值匹配. 这帮助验证crate,是否正确处理不同目标平台或函数的条件编译.它确保在期望和使用设置的配置间保持一致,帮助在开发过程的早期抓住潜…...

在 Ubuntu 中用 VSCode 配置 C 语言项目的编译与调试(详解教程)

目录 一、准备工作二、配置 VSCode 的编译任务三、配置 VSCode 的调试任务四、编译与调试流程五、常见问题排查六、总结 在 C 语言开发过程中&#xff0c;调试与编译是不可缺少的环节&#xff0c;而 VSCode&#xff08;Visual Studio Code&#xff09;作为一个强大且轻量级的编…...

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…...

HTML5实现趣味飞船捡金币小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 游戏中界面1.2 飞船边界框效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143799554 HTML5实现趣味飞船捡金币小游戏(附源码)&…...

Excel表数学于三角函数、统计函数

一、数学与三角函数 函数说明ABS返回数值的绝对值ACOS反余弦函数ACOSH反双曲余弦函数ASIN反正弦函数ASINH反双曲正弦函数ATAN反正切函数ATAN2以 x、y 坐标返回反正切值ATANH反双曲正切函数CEILING向上舍入&#xff08;指定倍数的整数&#xff09;COMBIN组合公式COS余弦函数COS…...

小试银河麒麟系统OCR软件

0 前言 今天在国产电脑上办公&#xff0c;需要从一些PDF文件中复制文字内容&#xff0c;但是这些PDF文件是图片转换生成的&#xff0c;不支持文字选择和复制&#xff0c;除了手工输入&#xff0c;我们还可以使用OCR。 1 什么是OCR OCR &#xff08;Optical Character Recogni…...

Dubbo RPC线程模型

消费端线程模型&#xff0c;提供者端线程模型 消费端线程模型 对 2.7.5 版本之前的 Dubbo 应用&#xff0c;尤其是一些消费端应用&#xff0c;当面临需要消费大量服务且并发数比较大的大流量场景时&#xff08;典型如网关类场景&#xff09;&#xff0c;经常会出现消费端线程…...

三角波生成函数

% 设置时间范围和采样频率 t 0:0.01:2; % 时间从0到2秒&#xff0c;步长为0.01秒% 定义频率 f 和角频率 theta f 5; % 频率为5Hz theta 2 * pi * f * t;% 初始化输出向量 y zeros(size(t));% 根据给定的公式计算 y for k 1:fy y (-1)^(k-1)*(2 /(k * pi)) * sin(k * the…...

使用Python实现对接Hadoop集群(通过Hive)并提供API接口

安装必要的库 首先&#xff0c;确保已经安装了以下库&#xff1a; pip install flask pip install pyhive代码实现 1. app.py&#xff08;主应用文件&#xff09; from flask import Flask, jsonify, request, abort from pyhive import hive import re from datetime impo…...

Qt学习笔记(四)多线程

系列文章目录 Qt开发笔记&#xff08;一&#xff09;Qt的基础知识及环境编译&#xff08;泰山派&#xff09; Qt学习笔记&#xff08;二&#xff09;Qt 信号与槽 Qt学习笔记&#xff08;三&#xff09;网络编程 Qt学习笔记&#xff08;四&#xff09;多线程 文章目录 系列文章…...

java的小数计算如何保证精度不丢失

前言 学java的肯定都知道&#xff0c;要保证小数运算精度不丢失我们得用BigDecimal对象。这篇文章就分析一下为什么用浮点数会造成精度丢失&#xff1f;BigDecimal是怎么解决精度丢失问题的?下面我们一起看看吧&#xff01; 浮点数的表示 浮点数在计算机中通常采用 IEEE 75…...

分布式----Ceph应用(下)

目录 创建 Ceph 对象存储系统 RGW 接口 1、对象存储概念 2、创建 RGW 接口 //在管理节点创建一个 RGW 守护进程&#xff08;生产环境下此进程一般需要高可用&#xff0c;后续介绍&#xff09; //开启 httphttps &#xff0c;更改监听端口 //创建 RadosGW 账户 //S3 接口…...

小鹏汽车嵌入式面试题及参考答案

static 变量放在哪个段中? 在 C 和 C++ 等编程语言中,static 变量根据其定义的位置不同放置的段也不同。对于全局的静态变量(在函数体外定义的静态变量),它会被放在数据段(.data 段或者.bss 段)。如果这个静态变量被初始化了非零值,那么它会被放在.data 段,这个段存储…...

qt5半成品飞机大战小游戏

最近在学Qt&#xff0c;心血来潮做了个飞机大战小游戏&#xff0c;由于一些资源比较难找&#xff0c;就做了个半成品。效果图如下&#xff1a; 目前已做功能&#xff1a;人物飞机的自由移动&#xff0c;子弹的发射&#xff0c;子弹与敌机的物体碰撞,碰撞特效。 缺少功能&#x…...

一文速学---红黑树

文章目录 一、红黑树简介二、 红黑树特性三、红黑树插入3.1 红黑树为空3.2 父节点为黑色3.3 父节点为红色3.3.1 父亲和叔叔都是红色3.3.2 父节点为红色&#xff0c;叔叔节点为黑色3.3.2.1 父节点在左节点&#xff0c;插入节点在父亲左节点3.3.2.2 父节点在左节点&#xff0c;插…...

【graphics】图形绘制 C++

众所周知&#xff0c;周知所众&#xff0c;图形绘制对于竞赛学僧毫无用处&#xff0c;所以这个文章&#xff0c;专门对相关人员教学&#xff08;成长中的码农、高中僧、大学僧&#xff09;。 他人经验教学参考https://blog.csdn.net/qq_46107892/article/details/133386358?o…...

美工网站/百家号关键词排名优化

「博客专家」申请及审核执行标准 博客等级&#xff0c;博客积分规则...

wordpress购买服务器/如何在百度推广网站

1 什么是回调函数&#xff1f; 首先什么是“回调”呢&#xff1f;我的理解是&#xff1a;把一段可执行的代码像参数传递那样传给其他代码&#xff0c;而这段代码会在某个时刻被调用执行&#xff0c;这就叫做回调。如果代码立即被执行就称为同步回调&#xff0c;如果过后再执行&…...

苏省住房和城乡建设厅网站首页/宠物美容师宠物美容培训学校

为什么刷开发版&#xff0c;想必太多的小伙伴是为了root&#xff0c;ROOT虽然会让我们的手机变的并不安全&#xff0c;但是刷入开发版还是必要的&#xff0c;今天ROM乐园小编就教大家如何刷入小米CC9和小米CC9美图版MIUI开发版&#xff0c;获取ROOT权限小米玩机第一步解锁BL&am…...

手机网站做安卓客户端/互联网销售是做什么的

&#xfeff;&#xfeff;1&#xff1a;获得.png图片&#xff0c;可以截图获得&#xff0c;千万注意图片不能大于lcd屏幕&#xff0c;最好小点&#xff0c;大了有时显示不了。我几次没有显示就是图片原因。2 使用Linux命令将图片转换为ppm图片&#xff1a;也可以使用logomaker或…...

深圳网站建设51duoshi/关联词有哪些四年级

课程结束了&#xff0c;老师要求我们每人写一篇关于软件工程课建议的博客&#xff0c;现在&#xff0c;我就这学期软件工程课程浅谈一下自己的感受&#xff1a; 1、软件工程课程对于我们来说是一个必备的课程&#xff0c;这一整个学期&#xff0c;我们都是以小团队的形式完成课…...

完全不收费的聊天软件/seo评测论坛

《支持向量机(SVM)多分类matlab程序代码》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《支持向量机(SVM)多分类matlab程序代码(2页珍藏版)》请在读根文库上搜索。1、%模型训练及数据整理model_12svmtrain(class_12_label,class_12_value);model_13svmtrain(class_13…...