目录
8.grep: 在指定文件中搜索特定的内容,并将含有这些内容的行标准输出
1.重定向符号 > 文件不存在,则新建,文件存在,覆盖原文件中的内容
2.追加重定向符号 >> 文件不存在则新建,文件存在,则追加在文件的末尾
10.ln (创建链接文件)---->类似于windows快捷方式
11.find 在指定目录下搜索文件,它的使用权限是所有用户
2.定义一个长度为4的数组,该数组中的每个元素是个函数的指针
1.shell编程
1.shell命令的格式
shell命令的三要素
命令名称 [选项] [参数]
注意:
1.一条命令三要素之间必须要有空格隔开
2.若多个命令在一行书写,用分号(;)将各命令隔开
linux@ubuntu:~$ date;cal
3.如果一条命令不能在一行写完,在行尾使用反斜杠()标明该条命令未结束
linux@ubuntu:~$ ls -l \
> /home/linux/Desktop/
2.创建shell编程文件需要加权
linux@ubuntu:~/23072/LinuxC/day3$ chmod +x 1.sh #2.修改文件的权限
3.注释
#
4.变量
1.命名规范:
由数字,字母,下划线组成,首字母不能为数字 .不能为关键字和保留字 .尽量见名知意,尽量大写
2.访问shell变量
$+变量名访问
3.位置参数即命令行参数
由系统提供的参数为位置参数
4.预定义变量
$# 包含命令行参数的个数
$@ 包含所有命令行参数:"$1 $2 ...$9"
$* 包含所有命令行参数:"$1,$2.....$9"
linux@ubuntu:~/23072/LinuxC/day3$ ./1.sh
$$: 包含正在执行进程的ID号
$? 包含前一个命令退出的状态
5.环境变量
$HOME
$PATH
5.shell程序和语句
1.说明性语句
#!/bin/bash
2.功能性语句
1.键盘读入变量值
2.算术运算命令 expr
3.test命令
1.测试字符串
s1 = s2 测试两个字符串的内容是否完全一样
s1!= s2 测试两个字符串的内容是否有差异
-z s1 测试s1字符串的长度是否为0
-n s1 测试s1字符串的长度是否不为0
2.测试整数
a -eq b 测试a与b相等 (equal)
a -ne b 测试a与b不相等
a -gt b 测试a是否大于b (great)
a -ge b 测试a是否大于等于b
a -lt b 测试a是否小于b a -le b 测试a是否小于等于b
3.文件属性
-d name 测试name是否为一个目录
-f name 测试name是否为普通文件
-L name 测试name是否为符号链接
-r name 测试name是否存在且可读
-w name 测试name是否存在且可写
-x name 测试name是否存在且为可执行
-s name 测试name是否存在,且长度不为0
f1 -nt f2 测试文件f1是否比文件f2更新
f1 -ot f2 测试文件f1是否比文件f2更旧
3.结构性语句
1.顺序
1.read 输入
read -p "请输入一个整数
" NUM1
2.echo 输出
echo "NUM1=$NUM" #默认换行
echo -n "NUM1=$NUM" #表示不换行
2.选择
1.单分支
if [条件为真]
then
语句
fi
2.双分支
if [条件为真]
then
语句1
else
语句2
fi
3.多分支
if [条件1为真]
then
语句1
elif [条件2为真]
then
语句2
elif [条件3为真]
then
语句3
.....
else
语句n+1
fi
case 字符串变量 in
# 1|3|5|7
模式1|模式11|模式12)
语句1
;; #---->break
模式2)
语句2
;;
模式3)
语句3
;;
....
3.循环
1.for
<1>.带列表的for
模式n)
语句n
;;
*)
语句n+1
;;
esac
3.循环
1.for
1.1带列表的for
1.2不带列表的for
1.3类似于C的for
2.while
while [条件为真]
do
语句
done
3.break :跳出循环
4.continue: 结束本次循环,继续下一次循环
6.函数
1.函数的定义
1.方式一
函数名()
{
函数体
}
2.方式二
function 函数名()
{
函数体
}
2.函数的调用
方式一
value_name=`function_name arg1 arg2`
变量名=`函数名 参数1 参数2`
函数的所有标准输出都传递给了主程序的变量
方式二
function_name arg1 arg2
函数名 参数1 参数2
echo $? #$?上一个命令退出的状态
2.嵌入式Linux操作系统
1.什么是操作系统
操作系统是管理和控制计算机硬件与软件资源的计算机程序,它是直接运行在“裸机”上的最基本的系 统软件,任何其他软件都必须在操作系统的支持下才能运行
2.操作系统的分类
1.批处理操作系统
2.分时操作系统
3.实时操作系统
4.嵌入式操作系统
5.个人计算机操作系统
6.网络操作系统
7.分布式操作系统
3.Linux操作系统的使用
1.Linux命令
1.用户切换命令(su)
linux@ubuntu:~$ sudo -i #普通用户切换root用户
[sudo] password for linux:
root@ubuntu:~# su - linux
linux@ubuntu:~$
2.系统管理命令
ps: 显示当前系统中由该用户运行的进程列表
ps -ef :查看所有进程及其PID(进程号),系统时间,命令详细目录,执行者者
ps aux:除可显示-ef所有内容之外,还可显示CPU及内存占用率,进程状态
ps -w 加宽以显示较多的信息
top:动态显示系统中运行的程序 (一般为每隔几秒刷新一次)
pstree 以树形格式显示进程
kill 输出特定的信号给指定PID(进程号)的进程
kill -l 列出所有可用的信号名称
linux@ubuntu:~$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
clear:清除屏幕上的信息
uptime:显示系统已经运行了多长时间
linux@ubuntu:~$ uptime
01:57:26 up 1:28, 1 user, load average: 0.02, 0.05, 0.01
关机
shutdown -h now 现在立刻关机
shutdown -h +30 30分钟之后关机
linux@ubuntu:~$ shutdown -h +30
Shutdown scheduled for Fri 2023-07-28 02:28:41 PDT, use 'shutdown -c' to cancel.
重启
reboot 重启
shutdown -r now 重启
linux@ubuntu:shutdown -r now 重启
3.磁盘相关命令
free: 查看当前系统内存的使用情况
linux@ubuntu:~$ free
total used free shared buff/cache available
Mem: 1999388 1369732 82144 16660 547512 455616
Swap: 2097148 9228 2087920
df:查看文件系统的磁盘空间占用情况
linux@ubuntu:~$ df
Filesystem 1K-blocks Used Available Use% Mounted on
udev 973652 0 973652 0% /dev
tmpfs 199940 1896 198044 1% /run
/dev/sda1 81985944 22316576 55458784 29% /
tmpfs 999692 0 999692 0% /dev/shm
tmpfs 5120 4 5116 1% /run/lock
tmpfs 999692 0 999692 0% /sys/fs/cgroup
du: 统计目录(或文件)所占磁盘空间的大小
du -sh
linux@ubuntu:~$ du -sh 23072 #显示该文件夹所占的大小
1.3M 23072
linux@ubuntu:~$ du -sh ./ #显示当前目录下所占磁盘空间的大小
du: cannot read directory './.dbus': Permission denied
4.6G ./
fdisk 查看磁盘分区情况及对磁盘进行分区管理
fdisk -l 显示文件系统的分区情况
使用fdisk必须拥有root权限 .
IDE磁盘hda,hdb......,SCSI硬盘是对应sda,sdb......hda1,第一个硬盘分区
linux@ubuntu:~$ sudo fdisk -l | grep sd
Disk /dev/sda: 80 GiB, 85899345920 bytes, 167772160 sectors
/dev/sda1 * 2048 167770111 167768064 80G 83 Linux
Disk /dev/sdb: 117.2 GiB, 125829120000 bytes, 245760000 sectors
/dev/sdb1 93056 245759998 245666943 117.1G 7 HPFS/NTFS/exFAT
4.文件,目录相关命令
cd,ls,mkdir,cat,cp,mv,rm,vim
1.vim 编辑器
1.vi的查找和替换
1. 查找(命令模式下)
/ 向下查找要查找的字符
? 向上查找要查找的字符
2. 替换 (底行模式下)
:%s/str1/str2/g #字符串str2替换正文中所有出现的str1
2.chmod:改变文件的访问权限
方法一:
zhangsan@ubuntu:~$ chmod g+w 1.c #给同组用户添加写的权限
方法二:
zhangsan@ubuntu:~$ chmod 664 1.c
3.chown:修改文件的所有者和组别
linux@ubuntu:/home/zhangsan$ sudo chown linux 1.c #必须使用root权限 修改文件所有者
4.chgrp:改变文件的组所有权
5.cat 查看比较短的文档
linux@ubuntu:~/23072/C补习/day8$ cat 1.c
6.more适合查看比较长的文档
按空格(space)向下走一页
按回车(Enter)向下走一行
按B向上走一页
按q退出
7.less是more的增强版
按空格(space)向下走一页
按回车(Enter)向下走一行
按B向上走一页
按q退出 支持上下箭头
8.grep: 在指定文件中搜索特定的内容,并将含有这些内容的行标准输出
linux@ubuntu:~/23072/C补习/day8$ grep -n scores arr.c #在arr.c这个文件中查找scores这
个字符串
一般会和(|)管道配合起来使用
(|) 关联两个命令 将前一个命令的输出作为后一个命令输入
linux@ubuntu:~$ ls --help | more
9.常用的特殊符号
1.重定向符号 > 文件不存在,则新建,文件存在,覆盖原文件中的内容
linux@ubuntu:~$ cal > 1.txt
linux@ubuntu:~$ cat 1.txt
七月 2023
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
2.追加重定向符号 >> 文件不存在则新建,文件存在,则追加在文件的末尾
linux@ubuntu:~$ date >> 1.txt
linux@ubuntu:~$ cat 1.txt
七月 2023
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
2023年 07月 30日 星期日 20:09:28 PDT
3.反引号 ``
linux@ubuntu:~$ echo today is date
today is date
linux@ubuntu:~$ echo today is `date` #将date当成命令来执行
today is 2023年 07月 30日 星期日 20:11:52 PDT
4.通配符
10.ln (创建链接文件)---->类似于windows快捷方式
硬链接
ln 源文件路径 硬链接文件
linux@ubuntu:~$ ln /home/linux/23072/LinuxC/day2/1.txt ying1.txt
软链接
ln -s 源文件路径 软链接文件
linux@ubuntu:~$ ln -s /home/linux/23072/LinuxC/day2/1.txt ruan1.txt
11.find 在指定目录下搜索文件,它的使用权限是所有用户
find [路径] [选项] [描述]
当前路径 -name
#想在当前路径下查找所有的.c
linux@ubuntu:~$ find ./ -name "*.c"
linux@ubuntu:~$ find ./ -name 2*.c
5.压缩打包命令
1.压缩
1.gzip
linux@ubuntu:~/23072/LinuxC/day2$ gzip arr.c #压缩arr.c文件之后生成arr.c.gz
2.bzip2
linux@ubuntu:~/23072/LinuxC/day2$ bzip2 scores.c
2.tar: 对文件目录进行打包和解包
Examples:
tar -cf archive.tar foo bar # Create archive.tar from files foo and bar.
tar -tvf archive.tar # List all files in archive.tar verbosely.
tar -xf archive.tar # Extract all files from archive.tar.
-c, --create # create a new archive (创建包文件)
-f #指名包文件名
-x #解包
-v #显示打包的过程
-z #自动调用gzip,gunzip
-j #自动调用bzip2
1.先打包生成mynew.tar
linux@ubuntu:~$ tar -cvf mynew.tar 23031 23072 1.c 1.txt #打包生成mynew.tar
2.再进行压缩 gzip
linux@ubuntu:~$ gzip mynew.tar
3.先解压
linux@ubuntu:~$ gzip -d mynew.tar.gz
4.解包
linux@ubuntu:~$ tar -xvf mynew.tar
3.打包+压缩
linux@ubuntu:~/23072/LinuxC$ tar -cvzf mynew.tar.gz day1 day3 1.txt
4.解压+解包
linux@ubuntu:~/23072/LinuxC$ tar -xvzf mynew.tar.gz
6.文件比较命令diff
linux@ubuntu:~/23072/LinuxC/day3$ diff a.c c.c #两个文件第5行不一样
5c5
< printf("helloworld\n");
---
> printf("helloxian\n");
2.Linux环境变量
linux@ubuntu:~$ env # 显示所有环境变量的值
linux@ubuntu:~$ echo $HOME #显示环境变量HOME的值
/home/linux
linux@ubuntu:~$ echo $PATH #显示环境变量PATH的值
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/loc
al/games:/snap/bin
1.临时修改变量的值 PATH
linux@ubuntu:~/23072/LinuxC/day3$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/loc
al/games:/snap/bin
linux@ubuntu:~/23072/LinuxC/day3$ export
PATH=$PATH:/home/linux/23072/LinuxC/day3
linux@ubuntu:~/23072/LinuxC/day3$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/loc
al/games:/snap/bin:/home/linux/23072/LinuxC/day3
linux@ubuntu:~/23072/LinuxC/day3$ cd
linux@ubuntu:~$ hello
hello
linux@ubuntu:~$ cd 23072
linux@ubuntu:~/23072$ hello
hello
2.永久修改变量的值 PATH
linux@ubuntu:~$ sudo vim /etc/profile
3.C#高级
1.结构体
1.如何创建结构体数据类型
struct 结构体名字
{
属性1;
属性2;
属性3;
.......
};
2.如何创建结构体变量
3.如何访问变量的值
scanf("%s%d",s1.name,&s1.height);
for(i=0;i<M;i++)
{
printf("%5.0f",s1.scores[i]);
}
printf("%s %d ",s1.name,s1.height);
4.如何操作结构体的指针
//定义一个指向int的指针
int * pi=NULL; //sizeof(pi)=8 pi+1 sizeof(int)
//定义一个指向结构体(struct student)的指针
struct student * ps=NULL; //sizeof(ps)=8 ps+1 (struct student)
2.内存管理
3.在堆区分配空间和释放空间
1.分配空间
#include <stdlib.h>
//参数:你要分配空间的大小
//返回值:void * void (表示空) void * (任何数据类型的地址)
//分配成功返回空间的首地址,失败则返回NULL
//malloc分配的空间未进行清空
void *malloc(size_t size);
2.释放空间
#include <stdlib.h>
//参数1:释放空间的首地址
void free(void *ptr);
4.结构体和堆区空间关联起来
1.在堆区创建5个存结构体的空间
Stu * ps=NULL;
//1.分配空间
//再堆区创建5个存结构体的空间
ps=(Stu *)malloc(sizeof(Stu)*5);
2.编写一子函数,对ps指向的空间进行输入和输出
void input(Stu * ps,int n);
void input(Stu * ps,int n)
{
//输入
int i=0,j=0;
for(j=0;j<n;j++)
{
printf("请输入姓名,身高,三门成绩\n");
scanf("%s",ps->name);
scanf("%d",&ps->height);
for(i=0;i<M;i++)
{
scanf("%f",&ps->scores[i]);
}
ps++; //自增到下一个学生的首地址
}
}
//编写一子函数,对ps指向的空间进行输出
//参数1:该空间的首地址 Stu * ps
// 参数2:元素的个数 int n
// 返回值:void
void output(Stu * ps,int n);
void output(Stu * ps,int n)
{
int i=0,j=0;
for(j=0;j<n;j++)
{
//输出
printf("%10s",ps->name);
Day5
1.讲解作业
printf("%5d",ps->height);
for(i=0;i<M;i++)
{
printf("%5.0f",ps->scores[i]);
}
printf("\n");
ps++;
}
}
5.自定义头文件
1.自定义头文件的要求.h
2.如何引入自定义头文件
#include "stu.h"
3.“” 和<>的区别
“”和<>的区别
“”: 编译器从用户的工作路径开始搜索头文件
<>: 编译器从标准库路径开始搜索头文件
4.条件编译
1.作用:避免头文件被重复引入
2.语法
//stu.c
#ifndef _STU_H
#define _STU_H
6.gcc工作原理
1.分阶段执行
1.预处理
gcc -E main.c -o main.i
2.编译
gcc -S main.i -o main.s
3.汇编
gcc -c main.s -o main.o
4.链接
在连接阶段将输入的机器代码文件*.o(与其它的机器代码文件和库文件)汇集成一个可执行的二进制代 码文件
linux@ubuntu:~/23072/LinuxC/day5/pro$ gcc main.o -o main #没有其他的机器代码文件
2.将四阶段合为一步
linux@ubuntu:~/23072/LinuxC/day5$ gcc stu.c -o stu
7.Make工程管理器 (多文件编译)
1.make工作原理
2.Makefile
CC:=gcc
CFLAGS:=-c -g
OBJS:=main.o calp.o swap.o menu.o sort.o stuio.o
stu:$(OBJS)
$(CC) $(OBJS) -o $@
main.o:main.c
$(CC) $(CFLAGS) $^ -o $@
calp.o:calp.c
$(CC) $(CFLAGS) $^ -o $@
swap.o:swap.c
$(CC) $(CFLAGS) $^ -o $@
menu.o:menu.c
$(CC) $(CFLAGS) $^ -o $@
sort.o:sort.c
$(CC) $(CFLAGS) $^ -o $@
stuio.o:stuio.c
$(CC) $(CFLAGS) $^ -o $@
.PHONY:clean
clean:
$(RM) *.o stu
3.Makefile中假目标
.PHONY:clean
clean:
$(RM) *.o stu
4.Makefile变量
1.自动变量
$@ 目标文件
$^ 所有的依赖文件
$< 第一个依赖文件
2.预定义变量
Makefile预定义变量包含了常见编译器,汇编器的名称及其编译选项
CC C编译器的名称,默认为cc
CFLAGS C编译的选项,无默认值
RM 文件删除程序的名称,默认值为rm -f
8.函数指针
1.如何定义函数指针
//定义一个指向int的指针
int * pi; (int)
//定义一个指向int的指針的指針
int ** ppi; (int *)
//定义一个指向char的指针
char * pc; (char)
//定义一个指向数组的指针,该数组是一个长度为5的int的数组
int (*parr) [5]; (int [5]) int arr[5]
int (*parr) [5]
//定义一个指向结构体的指针,该结构体的类型(Stu)
Stu * ps; (Stu)
//定义一个指向函数的指针,该函数参数为两个int,返回值為一个int的函数
函数的类型: 返回值类型 (参数列表)
int (int,int) int add(int,int)
int (*pfun) (int,int)
2.定义一个长度为4的数组,该数组中的每个元素是个函数的指针
int ( *pfunArr[4] ) (int,int )={add,sub,mul,div};
3.函数参数可以是函数指针
int pfunaction(int (*pfun)(int,int),int num1,int num2);
int pfunaction(int (*pfun)(int,int),int num1,int num2)
4.函数指针也可以取别名 (typedef )
typedef int (*PFUN) (int,int ); //给函数指针取了别名 int (*) (int,int) ---->PFUN
类型名
2.存储类型
1.register 寄存
2.auto (默认)
存储类型 类型名 变量名
3.extern 外部的
1.变量
局部变量 :定义在函数体内部的变量,称为叫局部变量 作用域:自定义开始到最近}结束,函数作用域 ,块作用域 生命周期:函数调用分配,函数结束释放
全局变量:定义在函数体外部的变量,称为叫全局变量 作用域:自定义开始到文件 文件作用域
2.extern修饰全局变量
extern int a; //使用外部变量a
3.extern修饰函数
extern void show1(void);
extern void show2(void);
4.static 静态的
1.static修饰全局变量 (隐藏)
2.static修饰函数 (隐藏)
3.static局部变量:延长变量的生命周期
9.共用体
10.大小端
union un
{
int a;
char c;
};
int main(void)
{
union un u1;
u1.a=0x12345678;
if(u1.c==0x78)
{
printf("小端序\n");
}else
{
printf("大端序\n");
}
return 0;
}
11.枚举:(语义化)定义常量的一种方式
enum timeDate
{
MONDAY=1,TUESDAY,WEDSDAY,THURSDAY,FRIDAY //默认是从开始的整数
};
//定义一个枚举数据类型,该数据类型的名字叫enum timeDate
//2.定义枚举的变量
enum timeDate d1;
12.位域(位段)
#include <stdio.h>
#define N 20
typedef struct mydate
{
unsigned int year:11; //int的11位:
unsigned int month:4;
unsigned int day:5;
}Date; //缺点:不能通过scanf()输入
typedef struct student
{
char name[N];
int height;
Date birday;
}Stu;
int main(void)
{
Stu s1={"zhangsan",183,{2000,9,9}};
printf("%10s %5d ",s1.name,s1.height);
printf("%04d/%02d/%02d\n",s1.birday.year,s1.birday.month,s1.birday.day);
printf("sizeof(Date)===%ld\n",sizeof(Date));
return 0;
}
13.递归
1.一个数的阶乘
#include <stdio.h>
int jiecheng(int n)
{
if(n==1)
return 1;
else
return n*jiecheng(n-1);
}
int main(void)
{
int n=0;
printf("请计算某个数的阶乘\n");
scanf("%d",&n);
printf("%d\n",jiecheng(n));
}
2.斐波那契数列