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

《深度剖析Linux 系统 Shell 核心用法与原理_666》

1. 管道符的用法

查找当前目录下所有txt文件并统计行数

# 使用管道符将ls命令的结果传递给wc命令进行行数统计 ls *.txt | wc -l

在/etc目录下查找包含"network"的文件并统计数量

# 使用find命令查找文件,并通过grep查找包含特定字符串的文件,最后统计文件数量 find /etc -type f -exec grep -l "network" {} \; | wc -l

2. 更改Ubuntu自带的软件源

备份原软件源文件

# 使用sudo提升权限,复制文件到备份位置 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup

使用vim打开软件源文件
sudo提升权限,使用vim编辑器打开软件源文件 sudo vim /etc/apt/sources.list
替换为清华源地址

# 修改文件内容,替换为清华源地址 # 清华源地址示例:deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse

更新软件源

# 更新软件包列表以应用新的源配置 sudo apt-get update

3. 在线下载软件的指令

下载并安装

# 安装指定软件包 sudo apt-get install software-name

下载安装包

# 下载指定软件包但不安装 sudo apt-get download software-name

卸载(完全卸载)

# 卸载软件包及其配置文件 sudo apt-get remove software-name --purge

4. 软件包的命名规范

示例解释

sl_5.02-1_amd64.deb # sl: 软件名 # 5.02-1: 版本号 # amd64: 架构 # deb: 扩展名,表示Debian/Ubuntu格式的软件包

5. 离线安装(dpkg)

# 使用dpkg安装本地deb包 sudo dpkg -i package-name.deb

# 卸载软件包(保留配置文件) sudo dpkg -r package-name # 卸载软件包及其配置文件 sudo dpkg -P package-name

6. 通配符

匹配一个字符

# ?匹配单个字符,如a?.txt匹配a1.txt、a2.txt等 ls a?.txt

匹配一个或多个字符

# *匹配任意数量的字符,如*.txt匹配所有扩展名为txt的文件 ls *.txt

匹配指定范围字符

# []匹配指定范围内的字符,如[a-z].txt匹配以小写字母开头的txt文件 ls [a-z].txt

7. find以文件名为条件进行查找

# 在指定路径下查找文件名为file-name的文件 find /path -name "file-name"

8. a.out的文件类型(file)

# 使用file命令查看文件类型 file a.out

9. grep

# 在文件中查找包含特定字符串的行 grep "string" file-name

10. cut

# 使用cut命令按分隔符提取字段 cut -d delimiter -f field file-name

11. 软链接文件和硬链接文件的创建、注意事项

软链接

# 创建软链接,源文件可以不在同一文件系统 ln -s source-file target-link # 注意事项:软链接指向的是源文件的路径,如果源文件移动或删除,链接将失效

硬链接

# 创建硬链接,源文件必须在同一文件系统 ln source-file target-link # 注意事项:硬链接指向的是源文件的inode,即使源文件删除,硬链接仍然有效

12. 关机和重启的指令

关机

# 立即关机 sudo shutdown -h now # 或者使用poweroff命令 sudo poweroff

重启

# 立即重启 sudo shutdown -r now # 或者使用reboot命令 sudo reboot

13. 权限的操作chmod(字母和八进制)、chown

修改所属组和其他用户权限
字母表示法

# 给所属组添加写权限,给其他用户添加读权限 chmod g+w,o+r 1.c

八进制表示法

# 设置文件权限为664 (rw-rw-r--) chmod 664 1.c

修改文件所有者和所属组

# 修改文件所有者和所属组 sudo chown user:group file-name

14. 磁盘的操作:从连接到虚拟机到挂载的全过程

查看磁盘设备

# 列出所有磁盘设备 sudo fdisk -l

对磁盘进行分区

# 使用fdisk工具对磁盘进行分区 sudo fdisk /dev/sdb

格式化分区

# 将分区格式化为ext4文件系统 sudo mkfs.ext4 /dev/sdb1

创建挂载点

# 创建挂载点目录 sudo mkdir /mnt/newdisk

挂载磁盘

# 将分区挂载到指定目录 sudo mount /dev/sdb1 /mnt/newdisk

15. tar指令(打包并压缩、拆包并解压缩)

打包并压缩
tar.gz格式

# 打包并压缩为tar.gz格式 tar -zcvf archive.tar.gz file1 file2 directory1

tar.bz2格式

# 打包并压缩为tar.bz2格式 tar -jcvf archive.tar.bz2 file1 file2 directory1

拆包并解压缩
tar.gz格式

# 解压tar.gz文件 tar -zxvf archive.tar.gz

tar.bz2格式

# 解压tar.bz2文件 tar -jxvf archive.tar.bz2

16. 压缩工具的对比

gzip vs bzip2 vs xz
  • gzip:速度快,压缩比适中。
  • bzip2:压缩比更高,速度较慢。
  • xz:压缩比最高,速度最慢。

17. 用户操作

修改sudoers文件

# 使用visudo安全地编辑sudoers文件 sudo visudo # 添加或修改用户权限,例如允许user执行某些命令而无需密码 user ALL=(ALL) NOPASSWD:ALL

修改用户信息(修改用户的家目录)

# 修改用户的家目录 sudo usermod -d /new/home/directory username

18. 内核的五大功能

  • 进程管理:负责创建、调度和销毁进程。
  • 内存管理:管理物理内存和虚拟内存。
  • 文件系统管理:提供文件系统的接口。
  • 设备管理:管理硬件设备。
  • 网络管理:处理网络通信。

19. C语言的外部参数

int argc, const char *argv[]
#include <stdio.h>

int main(int argc, const char *argv[]) 
{
    // argc表示命令行参数的数量,argv是参数数组
    printf("Number of arguments: %d\n", argc);
    for (int i = 0; i < argc; i++) 
    {
        printf("Argument %d: %s\n", i, argv[i]);
    }
    return 0;
}
示例解释
// argv[0]是程序名称,argv[1]及之后是命令行参数
printf("%d\t%c\n", *(argv[1]+2)-*argv[2], *(argv[0]+2));
// *(argv[1]+2)表示argv[1]的第三个字符,*argv[2]表示argv[2]的第一个字符
// 计算两个字符的ASCII差值,并打印结果
argv指向说明
argv[0]指向程序名称。
argv[1]及之后指向命令行参数。
字符指针数组元素取值解释
*(argv[1]+2)表示argv[1]的第三个字符。
*argv[2]表示argv[2]的第一个字符。
argv指向说明
  • argv[0]指向程序名称。
  • argv[1]及之后指向命令行参数。
字符指针数组元素取值解释
  • *(argv[1]+2)表示argv[1]的第三个字符。
  • *argv[2]表示argv[2]的第一个字符。

20. shell变量

# 定义变量 variable_name=value

21. 访问变量的方式

# 使用echo命令访问变量 echo $variable_name

22. 命令置换符的使用

# 将命令输出赋值给变量 result=$(command)

23. 数组

什么是稀疏数组
  • 稀疏数组是指数组中大部分元素为空或零,只有少量元素有实际值。
获取所有外部参数和数组中所有元素

# 获取所有外部参数 "$@" # 获取数组中所有元素 "${array[@]}"

获取外部参数个数和数组中元素个数

# 获取外部参数个数 "$#" # 获取数组中元素个数 "${#array[@]}"

24. 修改PATH的三种方式

终端生效

# 修改当前终端的PATH环境变量 PATH=$PATH:/new/path

单个用户生效

# 修改单个用户的PATH环境变量 echo "PATH=\$PATH:/new/path" >> ~/.bashrc source ~/.bashrc

所有用户生效

# 修改所有用户的PATH环境变量 sudo echo "PATH=\$PATH:/new/path" >> /etc/profile sudo source /etc/profile

25. #!/bin/bash

#!/bin/bash # shebang行,指定bash解释器

26. (( ))

书写

((expression))

获取运算结果

((a=5+3)) echo $a

支持幂运算

((result=2**3)) echo $result

27. expr(指令)

按位与和按位或示例

expr 5 & 3 expr 5 \| 3

关系运算示例

expr 5 \> 3 expr 5 \< 3 expr 5 != 3

字符串运算示例
# 匹配运算
expr match "hello" 'h\([a-z]*\)'
# 截取子串
expr substr "hello" 2 3
# 查找返回下标
expr index "hello" "e"
# 求长度
expr length "hello"

28. shell中if的格式

if [ condition ]; then
    # do something
elif [ another_condition ]; then
    # do something else
else
    # do something else
fi

29. test指令

整数判断示例

if [ 5 -gt 3 ]; then echo "5 is greater than 3" fi

字符串判断示例

if [ "hello" = "hello" ]; then echo "Strings are equal" fi

文件判断示例

if [ -f "file.txt" ]; then echo "File exists" fi

30. while循环

test表达式示例

while [ condition ]; do # do something done

31. for循环

C风格格式示例

for ((i=0; i<5; i++)); do echo $i done

另一种格式示例

for i in 1 2 3 4 5; do echo $i done

字符串列表示例

for var in string1 string2 string3; do echo $var done

32. case···in

格式示例
case $var in
    value1)
        # do something
        ;;
    value2)
        # do something else
        ;;
    *)
        # default case
        ;;
esac
;; *)解释
  • ;;表示结束一个case分支。
  • *)表示默认分支,当没有匹配到任何case时执行。
常量值可以重复示例

case $var in value1|value2) # do something ;; *) # default case ;; esac

33. select···in

打印选项示例

select var in option1 option2 option3; do echo "You selected $var" break done

和case···in结合示例
select var in option1 option2 option3; do
    case $var in
        option1)
            echo "Selected option1"
            ;;
        option2)
            echo "Selected option2"
            ;;
        option3)
            echo "Selected option3"
            ;;
        *)
            echo "Invalid option"
            ;;
    esac
    break
done

34. continue n

for i in 1 2 3 4 5; do if [ $i -eq 3 ]; then continue 1 fi echo $i done

35. 函数

定义格式

function_name() { # function body }

参数获取

function_name() { local arg1=$1 local arg2=$2 # use arguments }

返回值接收

function_name() { echo "return value" } result=$(function_name) echo $result

修饰变量的关键字
  • local:定义局部变量。
  • global:默认全局变量。

36. Makefile

是什么
  • Makefile是一个描述编译规则的文件,用于自动化编译过程。
由什么构成
  • 目标(target)、依赖(dependencies)、命令(commands)。
一条规则的特点
  • 目标通常是生成的文件,依赖是生成目标所需的文件,命令是生成目标的具体步骤。
Makefile重新编译文件的依据
  • Make根据文件的时间戳来决定是否需要重新编译。
伪目标的作用
  • 伪目标不会生成实际文件,通常用于执行特定任务,如清理、安装等。
四版Makefile
  • GNU Makefile、BSD Makefile、CMakeLists.txt、Rakefile等。

37. gdb调试

流程
  • 启动gdb、加载程序、设置断点、运行程序、检查变量、继续执行。
gdb调试core文件有什么作用
  • core文件记录了程序崩溃时的状态,gdb可以通过core文件分析程序崩溃的原因。

38. 知识点思维导图


http://www.kler.cn/a/560688.html

相关文章:

  • [AI相关]问问DeepSeek如何基于Python,moviePy实现视频字幕功能
  • Java 新手宝典(带案例)
  • 点击修改按钮图片显示有问题
  • stm32-电源控制
  • 深入理解与实战SQL IFNULL()函数
  • 深入理解 QVectorQString:Qt 中动态数组的强大力量
  • FFmpeg进化论:从av_register_all手动注册到编译期自动加载的技术跃迁
  • 深入剖析:基于红黑树实现自定义 map 和 set 容器
  • 零工市场小程序利用 Java 连接企业与自由职业者?
  • Matlab Simulink创建Clark和Park变换模型
  • 开源测试_POmronFINSTCP
  • check spring configuration解决方法
  • 剑指offer第2版:搜索算法(二分/DFS/BFS)
  • html中的元素(1)
  • Prompt:创造性的系统分析者
  • DeepSeek-R1:通过强化学习激发大语言模型的推理能力
  • Linux系统需要学习的内容和学习计划
  • [ComfyUI] 【AI】如何获得一张人物图片的优质描述
  • mysql 学习17 SQL 锁
  • 动态链接器(九):.init和.init_array