Linux应用软件编程00-Shell脚本
一、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复制,复制目录需要加 -rfmv移动 / 重命名 文件类型:
- 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 -mod -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中的变量
- 环境变量:系统预定义变量,例如
PWD、PATH、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 "等于" fitest - 检查文件类型并比较值:
- 使用方法: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"
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)