linux and shell

1.1 课程目标

熟悉Linux操作系统

掌握Linux下的常用命令

掌握Linux下的Shell脚本编写

高级C内容(指针  结构体 共用体 枚举 函数 动态内存管理)

掌握工程目录搭建

掌握make(gnu-make工程管理工具的使用)

掌握makefile的编写

1.2课程特点

内容多

linux命令非常多

难度不大

注意:总结 梳理 回顾

1.3 Linux操作系统

   3.1什么是操作系统

   架设在软硬件之间的系统软件,实现计算机资源的管理,资源的分配和调度

   3.2 os的作用

     提供给用户便于操作的计算机软硬件资源的接口(工具)

   3.3 os的分类

   开源和闭源 os

   开源os: Linux Uc-os II

   闭源:window,Mac OS

嵌入式因为需要可裁剪的os,因此大多数使用的是开源的os

   批处理操作os

   分时os:按照时间片轮转的方式进行处理 千万分之一秒

   实时os :百万分之一秒

  常见的实时os:uC-OS II,实时版linux,RT-Thread

  非实时操作系统:window,linux

 多任务os:多个应用程序可以同时执行os,一般都是多任务的

   多用户os:支持多个用户同时使用os

   常用的嵌入式os(可裁剪):

   Linux ,μc-OS II, Android ,ios ,windows ,embedded(可嵌入的)

   3.4 Linux os

   Linux是一个开源,多任务,多用户,有实时版和非实时版的os

   3.5Linux操作系统的来源和发展

丹尼斯.里奇 肯.汤姆森 c的创始人

   3.6Linux os 的结构

kernel(核心) shell(壳)

  3.7 Linux OS 的内核结构

kernel:

   

内存管理模块:负责内存的管理(开辟,释放,读写)

进程管理模块:对任务的创建,管理,调度,销毁等操作和维护

文件系统:组织,管理文件的设备

网络管理模块:协议栈和网卡操作

  3.8 Linux OS 的特点

开源,支持多任务,支持多用户,

跨平台(支持多cpu) CPU架构:x86 x86_64 ARM MIPS

内核可裁剪:(有选择保留某些模块,而删除一些模块的功能,内核部分代码可以不用编译,可以修改内核部分的代码,添加驱动等) 有实时版和非实时版(及时响应)

GNU:搞个开源的os

GCC(GUN complication collection):c c++ object-c object-c++ fortran java

GPL:凡是使用GNU工具开源端的软件,必须开源

LGPL:阉割版的GPL,可以不开源,但是库和库的详细说明必须提供

林纳斯·本纳第克特·托瓦兹(Linus Benedict Torvalds, 1969年~ ),著名的电脑程序员(程式师)、黑客。Linux内核的发明人及该计划的合作者

Linux开源于MINIX,MINIIX来源于UNIX,Linux使用GNU的开发工具,于是开源了,UNIX os

类UNIXos:DSB UNIX , AT&T UNIX , Mac OS. GUN/Linux

类Linux的os:CentOS, RedHat, Debian,Unbuntu

      POSIX(protable operating  system Interface 可移植操作系统接口)这个类UNIX操作系统的接口

《微机原理》《计算机组成原理》

1.4常用的Linux命令

 Linux命令(shell命令)

 Linux提供了一个shell软件,shell是一个解释器

 shell是用来解释命令(对用户来说就是特殊字符串),解释成os能够理解的命令。

shell命令就是Linux命令

将一堆按照一定逻辑编写的shell命令,写入一个后缀名为.sh文件中,.sh后缀的文件称为shell脚本

shell解释器可以解释shell命令和shell脚本

shell解释器什么时候打开的?

打开一个终端,默认打开一个shell解释器(默认的shell解释器:

bash(猛击))

终端:

   最开始是一种设备,可以让用户更为方便的和计算机进行交互

   随着技术的发展。拜托了终端的额概念,已将将终端这个功能做进了os

Linux下的终端分类:

  终端:os默认提供的终端

       字符界面终端:只有字符串交互没有图形化

       图形界面终端:有图形化界面操作

  伪终端:应用程序开发者使用软件模拟的终端

  

pts开的是伪终端

1.5 常用的shell命令分类

    1. 文件管理命令

创建:

touch 

vi+文件名

gedit +文件名

删除:

  rm 文件名

  rm -r//全部删除

  rmdir//下面没有文件才删除

复制

   cp -r srcfilename dstfilename//复制全部

重命名

  mv filename newfilename

移动

     mv srcfiename dstfilename

 查看文件信息:

ls

  ls -l

  ls -a

输出文件内容

文件编辑

    1. 文件操作命令
    2. 磁盘操作命令
    3. 进程管理命令
    4. 网络管理命令
    5. 用户管理命令
    6. 软件管理命令

1.6文件类型和文件权限

文件类型socket(plug插座,插口)

字符是 c ,这表示字符设备文件。比如猫等串口设备。

b,这表示块设备,比如硬盘,光驱等设备;

这个种类的文件,是用mknode来创建,用rm来删除。目前在最新的Linux发行版本中,我们一般不用自己来创建设备文件。因为这些文件是和内核相关联的。

套接口文件

当我们启动MySQL服务器时,会产生一个mysql.sock的文件。

1

2[root@localhost ~]# ls -lh /var/lib/mysql/mysql.sock

srwxrwxrwx 1 mysql mysql 0 04-19 11:12 /var/lib/mysql/mysql.sock

注意这个文件的属性的第一个字符是s,是socket的缩写。

符号链接文件

查看文件属性时,会看到有类似 lrwxrwxrwx,注意第一个字符是l,这类文件是链接文件。是通过ln -s 源文件名 新文件名。lrwxrwxrwx 1 root root 11 04-19 11:18 setup.log -> install.log,表示setup.log是install.log的软链接文件。

man gcc(命令)查看响应命令的功能

用户通过自己调用app shell命令来执行文件

系统调用:os提供访问软硬件资源的接口

sprintf: int sprintf(char *string, char *format [,argument,...]);

p1中的字符+string写入到p2

2.1shell命命令

1、用户切换命令(su)

gedit是一个Linux环境下的文本编辑器utf编程,类似windows下的写字板程序,在不需要特别复杂的编程环境下,作为基本的文本编辑器比较合适。

su – 用户命:su – linux <==>su - :改变路径

su root:只是改变用户身份,不改变路径

注意:一般不使用root用户命,要使用加一个sudo,给一个临时的管理员权限

2.2系统管理命令

top:动态显示系统中运行的程序

ps:显示当前系统由该程序用户运行进程的列表

ps -ef:查看所有进程机器PID(进程号)

ps -aux:除了显示-ef显示之外,还可以,cpu,显示内存占有率

sudo shutdown -h now:立刻关机

sudo reboot:重启

kill -l:列出说有可用的信号名称

2.3磁盘相关命令

free:查看当前系统内存使用情况

df: 查看文件系统的磁盘空间的占用情况。

du:统计目录(或文件)所占磁盘空间的大小

fdisk:用于查看硬盘的分区情况

sudo fdisk -l:使用的时候必须使用root权限

2.4chmod

作用:修改文件的访问权限

(1):

u 文件拥有者

g 所属的用户组

o 其他用户

+ 表示增加全选

  • 表示删除权限

= 设置权限

2.5chown

修改文件所有者和组别

修改用户:

sudo chown zhangsan hello.c

同时修改用户和组

sudo chown linux:zhangsna hello.c

2.6 chgrp

作用:修改文件组的所有权

注意:chown和chgrp必须使用root权限

alias :起别名

永久生效:添加到.bashrc

` `:反引号 当关键字使用

cat:查看文档,适合查看比较短的文档

more:适合查看比较长的文档 回车翻一行 空格翻一页

less: 加强版的more 支持上下箭头

wc -l:统计文件多少行(line)

wc -c:统计文件有多少字节(character)

2.7特殊字符

*:匹配任意长度的字符串(匹配任意个字符)

touch 1.c 2.c 3.c 4.c 1.txt 2.txt

mkdir test

mv *.c test//将所有.c移动到test里去

?:匹配一个长度的字符

mv ?.c test //1.c移动  mv ??.c test

[…]: 匹配指定的一个字符 //mv[1a].c test 一个带有1.c a.c移动

[-]:匹配指定的一个字符范围//mv[1-2].txt test

[^…]:除了指定的字符均可匹配 //mv[^31].c test

只针对于一个字符

2.8管道

l:将前一个命令的输出作为后一个命令的输入

ls test I grep(查找+一个字符串) hello.c

grep 字符串:查找字符串

>: 输出重定向,如果文件不存在,则新建,如果文件存在则覆盖源文件内容//

>>:追加重定向,如果文件不存在则新建,如果文件存在则追加在文件的末尾

硬链接和软连接

硬链接:利用Linux中为每个文件分配的物理编号建立链接

软链接:利用文件路径名建立链接

注意:

相同点:

(1)ln会保持每一处链接文件的同步性,也就是说,无论改变哪一处,其他文件都会发生改变。

区别:

硬链接:会在用户选定的位置上生成一个和源文件大小相同的文件

软链接:会在用户选定的位置生生成一个文件镜像,不会重复占用磁盘空间,平时使用最多的是软链接

2.9 打包压缩命令

压缩工作:gzip、bzip2

压缩:只能压缩文件

gzip文件名

bzip2 文件名

解压:

(1):

gzip -d 压缩包名

bzip2 -d 压缩包名

(2):

gunzip 压缩包名

bunzip2 压缩包名

注意:gzip和bzip2 只能压缩单个文件,不能压缩目录

tar:对文件目录进行打包或解包

-c:打包

-x:解包

-v:显示打包或解包的详细信息

-f:指定包名(该参数必须放在最后)

-z: 调用gzip来压缩打包文件,于-x连用完成一个解压缩

-j: 调用bzip2压缩打包文件,于-x连用完成一个解压缩

打包、压缩:

解压、解包

打包压缩一体化

解压解包一体化

2.10 环境变量

env:查看系统中所有的环境变量(在任何情况下都可以执行,如ls)

(1)临时添加

临时添加只对当前终端有效,如果当前终端关闭,添加的环境变量就不存在了

echo(回声、暗示) $PATH(必须大写)//查看环境变量

export PATH=$PATH:(从根路径下开始)/hom/linux a.out可执行文件

:冒号表示下一个

window;分号表示下一个

(2)永久添加

sudo vim /etc/profile(轮廓 形象 印象)

在文件的末尾添加 export PATH=$PATH:

添加完成之后重启sudo roboot或者source /etc/profile

2.11 用户管理命令

相关配置文件:

/etc/passwd 系统能够识别的用户清单

/etc/shadow 加密的用户清单,只有超级用户可用访问,用来保护加密口令的安全

/etc/group 组的名称和组的成员列表 每一行带表一个组

2.12添加用户

sudo adduser 用户名

删除用户:

sudo deluser 用户名 –remove-home(连同home目录下的用户名也删除)

添加组:

sudo groupadd 组名

修改用户所在的组:

sudo usermod -g 目标组 被修改的用户

修改密码:

sudo password zhangsan

删除组:

sudo groupdel 组名

2.13 linux共享文件

查看ip地址:ifconfig

虚拟机->设置->选项->共享文件夹->总是启用

/mnt/hgfs之下

2.14网络配置

测试虚拟机是否有网

ping www.baidu.com

有网

(1)虚拟机->设置->网络适配器

nat没有网设置成桥接模式

(2)编辑->虚拟网络编辑器->更改设置

配置静态ip

windows网络配置

ip地址

主机唯一标识:

ip地址组成:网络地址+主机地址

分类A B C D E

A类IP地址

1字节网络地址+3字节主机地址网络地址最高位必须是0

范围:1.0.0.0 ~126.255.255.255

B类IP地址

2个字节的网络地址+2个字节的主机地址,网络地址的最高位必须是10

3.1shell脚本

touch 

vi+文件名

gedit +文件名

c语言(强类型语言) gcc test.c ./a.out 先编译后运行

shell(弱类型语言)。不需要编译,直接运行

shell脚本:一堆命令的集合

1、创建shell脚本

#表示脚本

(1)新建文件vim 1.sh(后缀.sh)

 (2) 编辑文件

 (3)shell脚本在使用的时候没有权限在使用的时候需要认为添加权限

 (4)给.sh添加权限 chmod u=x 1.sh  chmod 777 1.sh

 (4)运行

  ./1.sh

date日期 cel

3.2shell变量

shell中允许用户建立 变量存储类 不支持数据类型

用户自定义变量:

(1)由数字、字母、下划线组成,且首字母不能为数字

 (2)  shell变量一般用大写表示

注意:任何赋给变量的值都被shell解释为一串字符

注意:再给变量赋值的时候=两边没有空格

      取变量的值时,在变量前加$

夹括号${}变量中有多个字符用花括号括起来,多个字符

预定义变量

$#:包含命令行参数的个数

$@:包含所有命令行参数

$*:包含所用命令行参数

$?:包含前一个命令的退出状态(在shell中0为真,1为假)//可于判断前一个文件是否创建完成

$$:包含正在执行的进行的ID号

不包含可执行文件(命令传参)

3.3环境变量

env查看所有环境变量

1、在主目录下创建一个文件夹(shell),在该文件夹中新建一个脚本文件叫做1.txt,然后向该文件中写入”hello shell”//写一个脚本文件将命令全部放入里面.

3.4shell程序和语句

说明性语句

#:注释

功能性语句

输出:echo ““ 自带换行 //echo ”hello shell”自动换行

     echo -n “”//不换行

输入:

read $NUM1 $NUM1

read -p “请输入两个字符:” NUM1 NUM2 //一定要加空格

read -p “请输入两个字符:

” NUM1 NUM2 //下一行输入

当输入的过程中有空格时,分多次进行输入

echo “NUM1 = ${NUM1},NUM2 = ${NUM2}

3.5 算术运算

算数运算命令expr主要进行简单的整数运算 + ,-, \*(*相当于通配符), / %  赋值不能有空格 赋值必须+’’当作一个整体赋值

注意:(1)想要将结果赋值给一个变量必须使用反引号

     (2)expr与变量以及变量与运算符直间必须加空格

3.6  test命令

测试:字符串、整数、文件属性(主要用于测试文件属性)

测试字符串:

s1=s2测试两个字符串是否相等

s1!=s2测试两个字符串是否有差异

-z s1 测试s1字符串的长度是否为0

-n s1 测试s1字符串的长度是否不为0

$?:包含前一个命令的退出状态(在shell中0为真,非0为假)

test可用用[] 代替

注意:”[”的右边和”]”的左边以及运算符的左右两边必须有空格

测试整数:

a -eq b 测试a于b是否相等

a -ne b 测试a于b是否不相等

a -gt b 测试a是否大于b

a -ge b 测试a是否大于等于b

a -lt  b 测试a是否小于b

a -le b 测试a是否小于等于b

测试文件属性:

-d name 测试是否为一个目录

-f name  测试是否为普通文件

-L name  符号链接

-r name  测试name是否存在且可读

-w name 是否存在且可写

-x name 是否存在且可执行

-s name 是否存在且长度不为0

f1 -nt f2 测试f1是否比f2更新

f1 -ot f2 测试f1是否比文件f2更旧

3.7 结构性语句

单分支选择

if[表达式]

then

   语句

fi //和{}作用一样

双分支选择:

if[表达式]

then

     语句1

else

语句2

fi

空格都不能差

多分支选择

if [表达式1]

then

语句1

elif[表达式2]

then

语句2

.......

elif[表达式n]

then

语句n

else

语句n+1

fi

多了分支选择语句

case 字符串 in

模式1)

命令表1

;;

模式2)

命令表2

;;

   .....

模式n)

命令表n

;;

       *)

        ;;

esac

for语句

for 变量名 in 单词表

do

语句

done

方式1:

变量一次取单词表中的各个单词,每取一次单词,就执行一次循环体

4.1 while 语句

while [表达式]

do

   语句

done

break

作用:跳出循环

break 2 //后面根数字跳出基层循环

4.2 函数

函数名()

{

}

function 函数名()

{
}

注意:一般使用方式二

调用

变量=`函数名(实际参数)`

函数名(实际参数)//一般使用这个

注意:(1)子函数中的$n并非shell中的$n

(2)子函数中的所有输出都传递给了主程序中的变量

4.3结构体

描述一类事物相关属性的集合,是一个中自定义数据类型

定义:

struct 结构体名

{

属性1;

属性2;

};

struct student

{

 char name[20];//姓名

 int age;//年龄

};//定义了一个结构体结构体的数据类型:struct student

初始化:

int a=0;

struct student stu={“zhangsan”,12};

访问:

(1)变量名.成员

stu.name

(2)指针访问

struct student *p=NULL;

p = &stu;

(*p).name p->name

(*p).age p->age

字节对齐

一次性分配多少个字节

自然对齐方式(32os)

char: 1 字节对齐

short: 2 字节对齐

int : 4 字节对齐

float : 4字节对齐,分配的时候分配两次

int: 4 double : 8  float :4  short: 2

字节对齐:选成员中最大的对齐

(os)字节对齐一次性分配8个字节

5.1 节省空间的方法

1、最大的放在最前面

2、位域/位段

未优化之前:

优化之后:

注意:位域不能使用标准输入进行输入找不到地址,标准输入一次是一个字节,而位域是bit类型型的 month 31  11111二进制占5个比特位。

stduent中引用date,date结构体必须在student前面声明

用直接初始化的方法解决:

struct student stu = {“zhangsan”,18,2001,11,11};

5.2给结构体取别名

(1)typedef int date_type;

typedef struct student

{

   char name[N];

   data_type age;

}stu;

stu s={}

(2)

main()

{

typedef struct student stu;

Stu stu;
}

方式1:

方式2:

结构体之间相互赋值:

5.3 malloc函数

头文件:

#include <stdlib.h>

void *malloc(size_t size)

功能开辟空间的大小

返回值:成功返回申请到的空间的首地址,失败返回NULL

注意:(1)malloc 申请到的空间没有名字,返回的只是首地址

(2) malloc 申请到的空间是连续的

prror=printf(打印一个错误信息)

free(ps)释放ps指向的地址空间,释放完后ps的地址仍然存在变成野指针了,所有的NULL一下编程空指针

5.3自定义文件

头文件

宏定义

结构体类型的定义

枚举的定义

函数声明

vi -p 1.c 2.c同时打开2个文件

头文件:“”和<>的区别:

“”:用户的工作路径下搜素头文件“stu.h”

<>:从标准库路径下搜素头文件

查看标准库路径;locate stdio.h

/usr/include/

多文件编译:

#ifndef 文件名 (一般用大写表示,所有的.换成_)

// #ifndef _STU_H

#define 文件名

//#define _STU_H

#endif

//#endif

作用:防止头文件重复定义

直接可交换值:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以当查询手册使用,因为是自己一点一点积累的,所以多要些资源分 一、各种循环命令 3 1. #WHILE循环用法 3 2. #UNTIL循环用法 3 3. #FOR循环用法: 3 二、各种条件语句 4 1. #IF语句用法 4 2. #CASE语句用法 4 语法结构 4 加select 用法 4 #select范围用法 5 3. #GOTO语句 5 4. #UNTIL循环语句 5 5. 循环控制语句 5 1.break命令 5 2.continue命令 5 三、替换命令用法 6 1. #TR 替换命令 6 2. #SED替换字符串代码 6 四、多行文件写入或注释 7 1. 多行文件写入 7 2. 多行注释方法 7 五、SHELL其它命令总结 7 1. #AWK命令用法 7 2. 搜索文件夹或文件命令 7 3. RPM解包和TAR解包 7 #rpm 强制安装 7 4. 统计某字符串数量 7 5. #DD命令使用总结 8 6. #REV 字符串反向命令 8 7. 变量截取 8 8. #UNIQ 去掉重复 8 9. #SORT 排序 8 10. 杀掉某进程 8 11. #SHELL输出TAB和空格 8 12. #PS用法 8 13. #TAIL用法 9 14. #ECHO选项 9 15. #GREP和EGREP过滤组 9 16. LS的特殊用法 9 六、LINUX SHELL其它 9 1. VI使用 9 2. 算术运算符 9 3. 字符串比较 10 4 字符串表达式(判断条件命令IF) 10 5. #SLEEP等待 10 6. #TEE执行结果复制保存 10 七、数组生成方法 10 1. #SEQ方法生成 10 2. 通过内部{BEGIN..END}生成 11 3. 以性能比较 11 4. 数组 11 八、LINUX系统常用配置方法及命令 11 1. 网卡相关的TCP/IP网络配置文件地址 11 2. #NETCONFIG命令可以永久保存设置 11 3. #NEAT或REDHAT-CONFIG-NETCONFIG可永久保存设置。 12 4. #DATE命令的使用 12

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值