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

news/2025/2/25 19:51:56

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.niftyadmin.cn/n/5865901.html

相关文章

永洪科技旗下BI产品,成功入选“金融信创优秀解决方案“

3月28日至29日&#xff0c;金融信创生态实验室在京举办金融信创解决方案研讨会&#xff0c;发布第三期金融信创优秀解决方案、实验室推荐解决方案&#xff0c;启动解决方案的分享活动。 永洪科技凭借旗下的敏捷BI数据分析平台&#xff0c;成功入选“金融信创优秀解决方案&…

【FAQ】HarmonyOS SDK 闭源开放能力 —Ads Kit(2)

1.问题描述&#xff1a; 应用需要获取一个唯一不变的标识生成deviceID。 当前通过OAID生成&#xff0c;但每次重启PC样机&#xff0c;获取到的OAID都会变化&#xff0c;无法满足唯一不变的需求。 解决方案&#xff1a; 需要获取一个唯一不变的标识&#xff0c;可以尝试使用O…

嵌入式项目:STM32刷卡指纹智能门禁系统

本文详细介绍基于STM32的刷卡指纹智能门禁系统。 获取资料/指导答疑/技术交流/选题/帮助&#xff0c;请点链接&#xff1a; https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt 1 系统功能 1.1 功能概述 本系统由STM32硬件端&#xff08;下位机&#xff09;…

【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)

本章将详细介绍四大主流金融数据源&#xff08;Tushare、AkShare、Baostock、通联数据&#xff08;DataAPI&#xff09;&#xff09;&#xff0c;分析其特点与适用场景&#xff0c;并通过实战案例展示数据获取与处理的全流程。 &#x1f449; 点击关注不迷路 &#x1f449; 点击…

新型物联网电瓶车充电桩在居民区的应用优势

安科瑞刘鸿鹏 摘要 随着电动自行车的普及&#xff0c;居民住宅区对安全、便捷的充电设施需求日益增加。ACX10A型电瓶车智能充电桩作为一种新型的充电设备&#xff0c;具备多种智能化功能&#xff0c;能够有效解决居民住宅区内的充电问题。本文将从ACX10A型电瓶车充电桩的功能…

单片机延时函数怎么写规范?

我们以前在开发产品的时候&#xff0c;肯定会碰到一些延时需求&#xff0c;比如常见的LED闪烁&#xff0c;按键消抖&#xff0c;控制IO口输出时序等等。 别小看延时&#xff0c;这个小问题&#xff0c;想做好&#xff0c;甚至要考虑到程序架构层面。 在开发板上&#xff0c;可能…

《数据库索引设计与优化》译本错误纠正(1)

今天在学习《数据库索引设计与优化》第十一章第198页的时候遇到一个问题&#xff0c;即参数的文字描述与实际不符。我看的是从网络上找到的译本&#xff0c;许多喜欢白嫖的朋友可能也会像我一样遇到这种问题。 可以看到&#xff0c;上面对参数Z的描述是&#xff1a;Z上一次索引…

快速排序、大根堆排序比较,C++详解

目录 实验题目 问题分析 快速排序 大根堆排序 两种排序方法时间复杂度的比较 总的代码 运行结果 实验题目 实验题目: 对快速排序、大根堆排序&#xff0c;两种排序方法进行比较&#xff0c;写出大根堆排序算法。并对它们最坏、最好&#xff0c;平均情况进行比较…