一、linux操作系统介绍① Linux内核5大功能内存管理负责系统内存的分配与回收进程调度实现 CPU 时间片分配和进程调度文件系统遵循一切皆文件的设计理念进程通信管理进程间的数据交互网络通信实现网络协议栈功能② Linux内核Linux内核是由系统调用组成的一些纯C代码不允许与用户直接交互内核功能复杂不容易被调用所以通过shell编写一系列命令来完成内核功能shell命令解释器③ shell作用保护内核命令解释器④ 库函数库函数是对系统调用的封装能够处理一些复杂的应用场景系统调用是Linux内核中的函数接口只有在Linux系统中才能使用功能强大但十分简练库函数可以移植所以具有通用性二、Shell2.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].txt2.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.bz22.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.txt2.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 软件名 --purge2.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 ahello world b100 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 num100 echo num $num echo num $num echo num $num read n echo n $n sumexpr $num 1 echo sum $sum实现算术运算#!/bin/bash read num1 read num2 addexpr $num1 $num2 subexpr $num1 - $num2 mulexpr $num1 \* $num2 divexpr $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 shiexpr $score / 10 case $shi in 10)echo 优秀 ;; 9)echo 优秀 ;; 8)echo 良好 ;; 7)echo 中等 ;; 6)echo 及格 ;; *)echo 不及格 ;; esac⑩ while 循环# 语法 while 条件 do 语句 done#!/bin/bash i0 sum0 while [ $i -lt 101 ] do sumexpr $sum $i iexpr $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 sumexpr $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() { ret0 retexpr $1 $2 echo $ret return 3 } read num1 read num2 sumadd $num1 $num2 echo $? echo sum $sum