Linux相关知识(文件系统、目录树、权限管理)和Shell相关知识(字符串、数组)
仅供自学,请去支持javaGuide原版书籍。
1.Linux
1.1.概述
Linux
是一种类Unix
系统。
严格来讲,Linux 这个词本身只表示 Linux内核
,单独的 Linux 内核并不能成为一个可以正常工作的操作系统。所以,就有了各种 Linux 发行版(Red Hat、Ubuntu、CentOS等)
。
Linux之父
(林纳斯·本纳第克特·托瓦兹 Linus Benedict Torvalds):他是 Linux内核 的最早作者,还发起了 Git
这个开源项目,并为主要的开发者。
1.2.文件系统(一切皆文件)
在 Linux 操作系统中,一切被操作系统管理的资源,如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或目录等,都被视为文件。这是 Linux 系统中一个重要的概念,即一切都是文件。
这种概念源自 UNIX
哲学,即将所有资源都抽象为文件的方式来进行管理和访问。
1.2.1.inode
硬盘以
扇区 (Sector)
为最小物理存储单位,通常为 4KB。
而操作系统和文件系统以块 (Block)
为单位进行读写,块由多个扇区组成。文件数据存储在这些块中。
固态硬盘 (SSD) 虽然没有物理扇区,但使用逻辑块,其概念与传统硬盘的块类似。
文件元信息(例如权限、大小、修改时间以及数据块位置)存储在inode(索引节点)
中。每个文件都有唯一的inode
。
inode
本身不存储文件数据,而是存储指向数据块的指针,操作系统通过这些指针找到并读取文件数据。 并且具有以下特性:
- inode 是一种固定大小的数据结构,其大小在文件系统创建时就确定了,并且在文件的生命周期内保持不变。
- inode 的访问速度非常快,因为系统可以直接通过 inode 号码定位到文件的元数据信息,无需遍历整个文件系统。
- inode 的数量是有限的,每个文件系统只能包含固定数量的 inode。这意味着当文件系统中的 inode 用完时,无法再创建新的文件或目录,即使磁盘上还有可用空间。因此,在创建文件系统时,需要根据文件和目录的预期数量来合理分配 inode 的数量。
- 可以使用 stat 命令可以查看文件的 inode 信息,包括文件的 inode 号、文件类型、权限、所有者、文件大小、修改时间。
使用inode
的好处是:
- 即使文件名被修改或删除,文件的 inode 号码不会改变,从而可以避免一些因文件重命名、移动或删除导致的错误。
- 同时,inode 也可以提供更高的文件系统性能,因为 inode 的访问速度非常快,可以直接通过 inode 号码定位到文件的元数据信息,无需遍历整个文件系统。
1.2.2.目录树
常见目录说明:
/bin
: 存放二进制可执行文件(ls、cat、mkdir
等),常用命令一般都在这里;/etc
: 存放系统管理和配置文件;/home
: 存放所有用户文件的根目录,是用户主目录的基点,比如用户 user 的主目录就是/home/user,可以用~user 表示;/usr
: 用于存放系统应用程序;/opt
: 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里;/proc
: 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;/root
: 超级用户(系统管理员)的主目录;/sbin
: 存放二进制可执行文件,只有 root 才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig
等;/dev
: 用于存放设备文件;/mnt
: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;/boot
: 存放用于系统引导时使用的各种文件;/lib 和/lib64
: 存放着和系统运行相关的库文件 ;/tmp
: 用于存放各种临时文件,是公用的临时文件存储点;/var
: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;/lost+found
: 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows 下叫什么.chk)就在这里。
1.2.3.权限管理
通过 ls -l
命令我们可以 查看某个目录下的文件或目录的权限。
在 linux 中的每个用户必须属于一个组,不能独立于组外。在 linux 中每个文件有 所有者(u)、所在组(g)、**其它组(o)**的概念。
Linux 中文件的类型:
d
:代表目录-
:代表文件l
:代表软链接(可以认为是 window 中的快捷方式)
对于文件:
权限名称 | 可执行操作 |
---|---|
r / 4 | 可以使用 cat 查看文件的内容 |
w / 2 | 可以修改文件的内容 |
x / 1 | 可以将其运行为二进制文件 |
对于目录:
权限名称 | 可执行操作 |
---|---|
r / 4 | 可以查看目录下列表 |
w / 2 | 可以创建和删除目录下文件 |
x / 1 | 可以使用 cd 进入目录 |
需要注意的是:超级用户可以无视普通用户的权限,即使文件目录权限是 000,依旧可以访问。
1.2.3.1. chmod修改权限
示例:修改aaa.txt
的权限为:文件所有者 有全部权限,文件所有者所在的组 有读写权限,其他用户只有读的权限。
chmod u=rwx,g=rw,o=r aaa.txt 或者 chmod 764 aaa.txt
用户级别环境变量 : ~/.bashrc
、~/.bash_profile
。
系统级别环境变量 : /etc/bashrc
、/etc/environment
、/etc/profile
、/etc/profile.d
。
上述配置文件执行先后顺序为:/etc/environment –> /etc/profile –> /etc/profile.d –> ~/.bash_profile –> /etc/bashrc –> ~/.bashrc
建议用户级别环境变量在 ~/.bash_profile
中配置,系统级别环境变量在/etc/profile.d
中配置。
2.Shell
目前 Linux 系统下最流行的运维自动化语言就是Shell
和Python
了。
2.1.为什么运行shell脚本一定要用./
开头?
譬如,运行脚本./helloworld.sh
。如果我们直接写 helloworld.sh
,linux 系统会去 PATH
里寻找有没有叫helloworld.sh
的,而你的当前目录通常不在 PATH
里,所以写成 helloworld.sh
是会找不到命令的,要用./helloworld.sh
告诉系统说,就在当前目录找。
2.2.字符串
Shell
中的字符串可以用单引号,也可以用双引号。
在单引号中所有的特殊符号,如$
和反引号都没有特殊含义。
在双引号中,除了$
、\
、反引号和感叹号(需开启 history expansion
),其他的字符没有特殊含义。
2.2.1.取字符串长度
2.2.1.1.使用#变量
#!/bin/bash
#获取字符串长度
name="shan"
echo ${#name}
2.2.1.2.使用length和expr
expr length "$name";
没有用echo length "$name"
是因为length
本身是个计算式,只有用expr
才能解析这个计算式的值,如果使用echo
的话,会直接原样输出length "$name"
注意:使用expr
命令时,表达式中的运算符左右必须包含空格,如果不包含空格,将会输出表达式本身。
expr 5+6 // 直接输出 5+6
expr 5 + 6 // 输出 11
同时对于某些运算符,还需要我们使用符号\进行转义,否则就会提示语法错误。
expr 5 * 6 // 输出错误
expr 5 \* 6 // 输出30
2.2.2.截取子字符串
#从字符串第 1 个字符开始往后截取 10 个字符
str="Thanks to javaGuide"
echo ${str:0:10}
#!bin/bash
#author:amau
var="https://www.runoob.com/linux/linux-shell-variable.html"
# 注: *为通配符, 意为匹配任意数量的任意字符
# %%表示删除从后匹配, 最长匹配结果
s1=${var%%t*} #h
# %表示删除从后匹配, 最短结果
s2=${var%t*} #https://www.runoob.com/linux/linux-shell-variable.h
# #表示删除从头匹配, 最短结果
s3=${var#*/} #/www.runoob.com/linux/linux-shell-variable.html
# ##表示删除从头匹配, 最长匹配结果
s4=${var##*/} #linux-shell-variable.html
2.3.数组
#!/bin/bash
array=(1 2 3 4 5);
# 获取数组长度
length=${#array[@]}
# 或者
length2=${#array[*]}
#输出数组长度
echo $length #输出:5
echo $length2 #输出:5
# 输出数组第三个元素
echo ${array[2]} #输出:3
unset array[1]# 删除下标为1的元素也就是删除第二个元素
for i in ${array[@]};do echo $i ;done # 遍历数组,输出:1 3 4 5
unset array; # 删除数组中的所有元素
for i in ${array[@]};do echo $i ;done # 遍历数组,数组元素为空,没有任何输出内容