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 系统下最流行的运维自动化语言就是ShellPython了。

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.使用#变量
shell 复制代码
#!/bin/bash
#获取字符串长度
name="shan"
echo ${#name}
2.2.1.2.使用length和expr
shell 复制代码
expr length "$name";

没有用echo length "$name"是因为length本身是个计算式,只有用expr才能解析这个计算式的值,如果使用echo的话,会直接原样输出length "$name"

注意:使用expr命令时,表达式中的运算符左右必须包含空格,如果不包含空格,将会输出表达式本身。

shell 复制代码
expr 5+6    // 直接输出 5+6
expr 5 + 6       // 输出 11

同时对于某些运算符,还需要我们使用符号\进行转义,否则就会提示语法错误。

shell 复制代码
expr 5 * 6       // 输出错误
expr 5 \* 6      // 输出30

2.2.2.截取子字符串

shell 复制代码
#从字符串第 1 个字符开始往后截取 10 个字符
str="Thanks to javaGuide"
echo ${str:0:10}
shell 复制代码
#!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.数组

shell 复制代码
#!/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 # 遍历数组,数组元素为空,没有任何输出内容
相关推荐
K·Herbert2 小时前
最新CentOS 7 yum源失效的解决方案(2025年6月)
linux·运维·centos
别骂我h2 小时前
部署KVM虚拟化平台
linux·运维·服务器
繢鴻2 小时前
紧急救援!Ubuntu崩溃修复大赛
linux·服务器·ubuntu
showmethetime2 小时前
优化nginx参数(基本通用参数)
运维·nginx
老六ip加速器3 小时前
获取ip地址安全吗?如何获取静态ip地址隔离ip
运维·网络·智能路由器
净心净意11 小时前
浅谈DaemonSet
运维·jenkins
Apex Predator17 小时前
jenkins流水线打包vue无权限
运维·jenkins
hujun861021 小时前
Ubuntu安装无线网卡
linux
Johny_Zhao21 小时前
CentOS Stream 8 高可用 Kuboard 部署方案
linux·网络·python·网络安全·docker·信息安全·kubernetes·云计算·shell·yum源·系统运维·kuboard
卖猪肉的痴汉1 天前
1.1 Linux 编译FFmpeg 4.4.1
linux·ffmpeg