一、linux操作系统介绍

① Linux内核5大功能:

  • 内存管理:负责系统内存的分配与回收
  • 进程调度:实现 CPU 时间片分配和进程调度
  • 文件系统:遵循"一切皆文件"的设计理念
  • 进程通信:管理进程间的数据交互
  • 网络通信:实现网络协议栈功能

② Linux内核:

  •  Linux内核是由系统调用组成的一些纯C代码
  •  不允许与用户直接交互
  • 内核功能复杂,不容易被调用,所以通过shell编写一系列命令来完成内核功能(shell命令解释器)

③ shell作用:

  • 保护内核
  • 命令解释器

④ 库函数:

  • 库函数是对系统调用的封装,能够处理一些复杂的应用场景
  • 系统调用是Linux内核中的函数接口,只有在Linux系统中才能使用,功能强大,但十分简练
  • 库函数可以移植,所以具有通用性

二、Shell

2.1 shell命令

2.1.1 文件目录操作

命令 作用
ls 查看目录,ls -l 详细信息,ls -a 显示隐藏文件
touch 新建普通文件
rm 删除文件;rm -rf 强制删除目录
mkdir 创建文件夹
rmdir 删除空文件夹
cp 复制,复制目录需要加 -rf
mv 移动 / 重命名

文件类型:

  • b: block 块设备文件
  • c: character 字符设备文件
  • d: directory 目录文件
  • -:普通文件
  • l: link 链接文件
  • s: socket 套接字文件
  • p: pipe 管道文件

2.1.2 文件查看命令

cat filename直接显示整个文件内容,适合处理小文件

more/less支持分页浏览,适合查看大文件内容,两者功能类似。

 more 的操作:

  • 空格键:向下翻一页
  • Enter 键:向下翻一行
  • q:退出查看
  • / + 搜索词:搜索内容(more 的搜索功能较弱)

 less 的操作:

  • 空格键或 Page Down:向下翻一页
  • Page Up:向上翻一页
  • j 或 :向下移动一行
  • k 或 :向上移动一行
  • / + 搜索词:向下搜索
  • ? + 搜索词:向上搜索
  • n:跳转到下一个匹配项
  • N:跳转到上一个匹配项
  • q:退出查看
  • 在 less 中使用 -N 参数显示行号
  • 使用 less 时,输入 G 可直接跳转到文件末尾,输入 gg 跳转到文件开头
  • 可以一次打开多个文件,通过 :n 切换到下一个文件,:p 切换到上一个文件

head/tail查看文件首尾部分内容,例如:

  • tail -n 20 filename 查看文件末尾20行
  • head -n 10 filename 查看文件开头10行

2.1.3 文件查找

  • find . -name "文件名":递归搜索当前目录及其子目录中匹配指定名称的文件
  • grep "字符串" 文件名:在指定文件中查找包含特定字符串的行并输出

2.1.4 通配符

  • *:匹配任意长度任意字符
  • ?:匹配单个任意字符
  • []:匹配括号内指定单个字符
ls file_*.txt
ls file_??.txt
ls file_[1,3,5].txt
ls file_[1-5].txt
ls file_[^6].txt

2.1.5 压缩解压 tar

# 压缩 gz
tar -zcvf filename.tar.gz dirname/*
# 解压 gz
tar -zxvf filename.tar.gz
# 压缩 bz2
tar -jcvf filename.tar.bz2 dirname/*
# 解压 bz2
tar -jxvf filename.tar.bz2

2.1.6 组合命令

管道 |:把前一条命令输出,当做后一条命令输入

ps -ef | grep "bash"

重定向

  • > 覆盖重定向,清空文件写入
  • >> 追加重定向,在文件末尾追加
ps -ef > file.txt
在/usr/include/stdio.h文件中的后200行, 找到和extern 相关的内容, 并把这些
内容所在的行记录到file.txt文件中, 使用一条shell命令实现
tail -n 200 /usr/include/stdio.h | grep "extern" > file.txt

2.1.7 其余命令

  • echo:打印内容到终端
  • history:查看历史执行命令
  • du:查看文件 / 目录大小,du -k / du -m
  • od -c file.txt:按字符格式查看文件原始内容 (od 按照指定的方式查看文件中的内容
    )
  • date:查看系统时间
  • uname -a:查看内核、平台架构信息
  • ifconfig:网卡信息
  • ping:测试网络连通

2.1.8 dpkg工具集(deb 包本地安装)

# 安装软件
sudo dpkg -i xxx.deb   
# 卸载软件
sudo dpkg -P 软件名 
# 查看是否安装成功    
dpkg -l 软件名          

2.1.9 apt-get工具集(必须连接网络)

# 下载并安装软件
sudo apt-get install 软件名
# 卸载软件
sudo apt-get remove 软件名 --purge

2.2 shell编程

① 编译型语言和解释型语言特点

  • 编译型语言

    • 支持丰富的数据类型
    • 采用先编译后执行的运行机制
    • 执行效率高,运行速度快
    • 开发周期相对较长
    • 擅长数据运算和处理
  • 解释型语言

    • 所有数据均以字符串形式处理
    • 采用边解释边执行的方式运行
    • 执行效率较低,运行速度较慢
    • 开发效率较高
    • 适合系统开发和维护工作

② 编写shell脚本并执行的步骤

1.打开文件并编写代码
vim filename.sh
2.加上执行权限
chmod +x filename.sh
3.运行脚本
./filename.sh

③ shell脚本本质就是一系列shell命令的集合。

④ shell中的变量

  • 环境变量:系统预定义变量,例如 PWDPATH、HOME
  • 位置变量
    • $0:当前执行的脚本文件名
    • $1 $2 $3:依次表示传入脚本的第1、2、3个参数
    • $#:传入参数的总数量
    • $$:当前脚本运行的进程ID
    • $?:上一条命令的执行返回值
  • 自定义变量:变量名=值(注意等号两侧不能有空格)
#!/bin/bash 
echo ==================
echo $PWD
echo $HOME
echo $PATH
echo ==================
echo $0
echo $1
echo $2
echo $3
echo $#
echo $$
echo $?
echo ==================
a="hello world"
b=100
echo $a
echo $b

⑤ shell 引号区别

  • 双引号 " ":会解析其中的变量,将其替换为对应的值
  • 单引号 ' ':保持内容原样输出,不会解析变量
  • 反引号 ` `:将其中的内容作为命令执行(等同于 $() 语法)

⑥ expr - 计算表达式

        expr 是一个用于计算表达式的命令行工具,支持整数运算、字符串操作和逻辑比较(浮点数计算需借助其他工具(如 bc。它通常用于 Shell 脚本中处理数学或字符串运算。运算符与操作数之间需用空格分隔。

  • 算术运算+(加)、-(减)、*(乘)、/(除)、%(取模)
    • 乘法符号 * 需转义为 \*,避免被 Shell 解析为通配符
  • 比较运算=(等于)、!=(不等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)
    • 比较运算符需用反斜杠转义(如 \>
  • 字符串操作
    • : 匹配子字符串(返回匹配的字符数)
    • substr 提取子字符串(需结合 expr 语法)
    • expr "hello" : "h.*o"  # 输出 5(匹配整个字符串)  
      expr substr "abcdef" 2 3  # 输出 "bcd"(从第2字符开始取3个字符)  
#!/bin/bash 
num=100
echo num = $num
echo "num = $num"
echo 'num = $num'
read n
echo "n = $n"
sum=`expr $num + 1`
echo "sum = $sum"
  • 实现算术运算
#!/bin/bash 
read num1
read num2
add=`expr $num1 + $num2`
sub=`expr $num1 - $num2`
mul=`expr $num1 \* $num2`
div=`expr $num1 / $num2`
echo "add = $add"
echo "sub = $sub"
echo "mul = $mul"
echo "div = $div"

⑦ shell脚本中的输入和输出

  •  echo 输出
  •  read 输入

⑧ if分支语句

# 语法
if 判断条件
then
else
fi
#!/bin/bash 
read num1
read num2
if [ $num1 -gt $num2 ]
then
	echo "大于"
elif [ $num1 -lt $num2 ]
then
	echo "小于"
else
	echo "等于"
fi

test - 检查文件类型并比较值:

  • 使用方法:test 表达式、[ 表达式 ] (表达式两边必须有空格)
  • -b:检查是否为块设备
    -c:检查是否为字符设备
    -d:检查是否为目录
    -f:检查是否为普通文件
    -L:检查是否为符号链接
    -S:检查是否为套接字文件
    -p:检查是否为管道文件
    -e:检查文件是否存在
    -s:检查文件是否存在且不为空
    字符串比较:
        =, !=:字符串相等/不等
        -z:字符串为空
        -n:字符串非空
    数值比较:
        -eq, -ne:等于/不等于
        -gt, -lt:大于/小于
        -ge, -le:大于等于/小于等于
    可以通过逻辑运算符组合多个条件:
        -a:与(AND)
        -o:或(OR)
        !:非(NOT)
    if [ -f "$file" -a -r "$file" ]; then
        echo "文件存在且可读"
    fi

练习1:从终端接收文件名(文件路径),打印出该文件的类型

#!/bin/bash 
read filename 
if [ -L $filename ]
then
	echo "链接文件"
elif [ -b $filename ]
then
	echo "块设备文件"
elif [ -c $filename ]
then
	echo "字符设备文件"
elif [ -d $filename ]
then
	echo "目录文件"
elif [ -f $filename ]
then
	echo "普通文件"
elif [ -S $filename ]
then
	echo "套接字文件"
elif [ -p $filename ]
then
	echo "管道文件"
fi

练习2:从终端接收一个文件名, 如果该文件名为qianrushi则处理该文件, 如果文件名不为qianrushi则无需做任何处理, 处理方式为: 如果该文件已经存在, 则创建一个tmp文件夹, 并在文件夹下新建quanrushi.txt文件, 如果文件不存在则直接创建。

#!/bin/bash 
read filename 
if [ $filename = "qianrushi" ]
then
	if [ -e $filename ]
	then
		mkdir tmp
		cd tmp
		touch $filename.txt
	else 
		touch $filename.txt 
	fi 
fi

⑨ case分支语句

# 语法
case 变量名 in
值1)语句
;;
值2)语句
;;
值3)语句
;;
*)语句
;;
esac

练习:从终端输入一个成绩, 使用case打印出成绩的级别, 如果90 - 100 打印"优秀"、80 - 89 打印"良好"、70 - 79 打印"中等"、60 - 69 打印"及格"、60以下 打印"不及格"。

#!/bin/bash 
read score
shi=`expr $score / 10`
case $shi in 
	10)echo "优秀"
		;;
	9)echo "优秀"
		;;
	8)echo "良好"
		;;
	7)echo "中等"
		;;
	6)echo "及格"
		;;
	*)echo "不及格"
		;;
esac

⑩ while 循环

# 语法
while 条件
do
    语句
done
#!/bin/bash 
i=0
sum=0
while [ $i -lt 101 ]
do
	sum=`expr $sum + $i`
	i=`expr $i + 1`
done
echo "sum = $sum"

⑪ for 循环

# 语法
for i in 1 2 3 4 5
do
    语句
done

练习1:打印1-100数字

#!/bin/bash 
#for i in 1 2 3 4 5
#for i in `seq 100`
#for i in {1..100}
for ((i = 0; i < 101; i++))
do
	echo "i = $i"
done

练习2:求1-100的和

#!/bin/bash 
for ((i = 0; i < 101; i++))
do
	sum=`expr $sum + $i`
done
echo "sum = $sum"

⑫ 数组

#!/bin/bash 
array=("hello" "world" "how" "are" "you")
echo ${array[0]}
echo ${array[1]}
echo ${array[2]}
echo ${array[3]}
echo ${array[4]}
echo ${array[*]}

⑬ 函数

#!/bin/bash 
#函数return返回的是函数调用的结果,结果为0
#函数内部的打印会作为函数的返回值
add()
{
	ret=0
	ret=`expr $1 + $2`
	echo "$ret"
	return 3
}
read num1
read num2
sum=`add $num1 $num2`
echo "$?"
echo "sum = $sum"

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐