Linux软件编程基础:操作系统、Shell与脚本编程
·
1. 操作系统概述
操作系统是一款软件,其核心作用是屏蔽底层不同的硬件平台,为上层应用提供统一的接口,从而实现通用的软件代码。
PC三大操作系统:
- Unix:世界上第一款操作系统
- Linux:GNU(GNU's Not Unix)项目的重要组成部分,使用C语言编写,广泛应用于服务器和嵌入式领域
- Windows:使用C/C++开发
2. Linux操作系统
2.1 Linux内核五大功能
- 内存管理
- 多任务调度
- 文件系统管理(Linux系统中一切皆是文件)
- 多任务间的通信
- 网络通信
2.2 Linux内核特点
- Linux内核是由系统调用组成的一些纯C代码
- 不允许与用户直接交互
- 内核功能复杂,不容易被调用,所以通过shell编写一系列命令来完成内核功能(命令解释器)
2.3 Shell作用
- 保护内核
- 命令解释器
2.4 库函数
- 库函数是对系统调用的封装,能够处理一些复杂的应用场景
- 系统调用是Linux内核中的函数接口,只有在Linux系统中才能使用,功能强大,但十分简练
- 库函数可以移植,所以具有通用性
3. Shell基础命令
3.1 基础命令
- ls - 列出目录内容
文件类型:
- b:block 块设备文件
- c:character 字符设备文件
- d:directory 目录文件
- -:普通文件
- l:link 链接文件
- s:socket 套接字文件
- p:pipe 管道文件
- touch - 创建文件
- rm - 删除文件
- mkdir - 创建文件夹
mkdir dirname ls -l ls -a - rmdir - 删除空文件夹
- rm -rf - 删除非空文件夹
- cp - 拷贝文件(如果拷贝目录文件需要加 -rf选项)
- mv - 移动文件
3.2 文件查看命令
- cat - 查看文件内容
- more/less - 分页查看文件
- head/tail - 查看文件开头/结尾
head/tail -n 行数 文件名
3.3 文件查找
- find - 在当前目录下找与文件名对应的文件路径
find . -name "文件名" - grep - 打印出文件名中所有与字符串匹配的行
grep "字符串" 文件名
3.4 通配符
- *:匹配任意长度,任意字符的文件名
- ?:匹配一位长度,任意字符的文件名
- []:匹配一位长度,指定字符的文件名
file_*.txt
file_??.txt
file_[1,3,5].txt
file_[1-5].txt
file_[^6].txt
3.5 组合命令
- 管道 - 将前面命令的输出作为后续命令的输入
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
3.6 其余常用命令
- echo - 将内容显示在终端
- history - 查看终端输入过的历史命令
- du - 查看文件大小
du -m 文件名/目录名 du -k 文件名/目录名 - od - 按照指定的方式查看文件中的内容
od -c file.txt - date - 查看时间和日期
- uname - 查看内核版本、平台架构
uname -a - ifconfig - 查看网卡信息
- ping - 测试主机与指定IP地址是否能够网络连通
3.7 软件包管理工具
dpkg工具集:
- 安装软件:
sudo dpkg -i 软件包名.deb - 卸载软件:
sudo dpkg -P 软件名 - 查看安装是否成功:
dpkg -l 软件名
apt-get工具集:
- 一定有网
- 设置apt-get工具集的源
- 下载并安装软件:
sudo apt-get install 软件名 - 卸载软件:
sudo apt-get remove 软件名 --purge
4. Shell编程
4.1 编程语言类型对比
| 特性 | 编译型语言 | 解释型语言 |
|---|---|---|
| 数据类型 | 有丰富的数据类型 | 所有内容都是字符串 |
| 执行方式 | 先编译再执行 | 边翻译边执行 |
| 执行速度 | 执行速度快 | 执行速度慢 |
| 开发效率 | 开发效率低 | 开发效率高 |
| 适用场景 | 数据的运算和处理 | 系统的开发和维护 |
4.2 Shell脚本编写步骤
- 打开文件并编写代码:
vim filename.sh - 加上执行权限:
chmod +x filename.sh - 运行脚本:
./filename.sh
Shell脚本本质就是一系列shell命令的集合
4.3 Shell中的变量
- 环境变量:PWD、HOME、PATH
- 位置变量:
$0:文件名$1:给脚本传参的第一个参数$2:第二个参数$3:第三个参数$4:第四个参数$#:传入参数个数$$:脚本运行时的进程ID号$?:上一条shell语句执行的结果
- 自定义变量:
变量名=值
4.4 Shell中的引号
- 双引号:打印时会替换成变量的值
- 单引号:打印单引号中的内容不变
- 倒引号:将引号内部的内容作为一个命令使用
4.5 Shell脚本中的输入和输出
- echo - 输出
- read - 输入
4.6 分支语句
if分支语句
if 判断条件
then
# 条件成立时执行的语句
else
# 条件不成立时执行的语句
fi
case分支语句
case 变量名 in
值1)
语句
;;
值2)
语句
;;
值3)
语句
;;
*)
语句
;;
esac
4.7 循环语句
while循环
while循环在条件为真时重复执行语句块:
while 条件
do
语句
done
示例:
#!/bin/bash
count=1
while [ $count -le 5 ]
do
echo "循环次数: $count"
count=$((count + 1))
done
for循环
for循环用于遍历列表中的每个元素:
for 变量 in 列表
do
语句
done
三种常见用法:
# 方式1:直接列出值
for i in 1 2 3 4 5
do
echo "数字: $i"
done
方式2:使用大括号扩展
for i in {1..100}
do
echo "数字: $i"
done
方式3:使用seq命令生成序列
for i in seq 100
do
echo "数字: $i"
done
4.8 数组
Shell支持一维数组,数组元素用空格分隔:
# 定义数组
array=(元素1 元素2 元素3)
访问数组元素
echo ${array[0]} # 输出第一个元素
echo ${array[1]} # 输出第二个元素
获取数组长度
echo ${#array[@]}
遍历数组
for item in ${array[@]}
do
echo $item
done
修改数组元素
array[0]="新元素"
添加数组元素
array[${#array[@]}]="新元素"
4.9 函数
Shell函数用于封装可重用的代码块:
# 函数定义
函数名() {
语句
[return 返回值]
}
或者
function 函数名 {
语句
[return 返回值]
}
函数调用
函数名 参数1 参数2 ...
获取函数返回值
函数名
echo $? # 获取函数返回值
示例:
#!/bin/bash
定义函数
say_hello() {
echo "Hello, $1!"
return 0
}
调用函数
say_hello "World"
带返回值的函数
add() {
local sum=$(( $1 + $2 ))
return $sum
}
add 10 20
echo "10 + 20 = $?"
函数参数说明:
$1:第一个参数$2:第二个参数$#:参数个数$@:所有参数列表$*:所有参数作为一个字符串
5. 作业练习
- 从终端接收一个文件名或路径,打印该文件的类型
- 从终端接收一个文件名,如果该文件名为qianrushi则处理该文件,如果文件名不为qianrushi则无需做任何处理,处理方式为:如果该文件已经存在,则创建一个tmp文件夹,并在文件夹下新建quanrushi.txt文件,如果文件不存在则直接创建
- 从终端输入一个成绩,使用case打印出成绩的级别:
- 90 - 100:打印"优秀"
- 80 - 89:打印"良好"
- 70 - 79:打印"中等"
- 60 - 69:打印"及格"
- 60以下:打印"不及格"
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)