Linux基础
嵌入式
以应用为中心,以专用计算机技术为基础,软硬件可裁剪(功能需求、成本(材料、人力、宣传、测
试)、维护、体积、代码量等)
linux系统的历史
unix
面向学校
1969年,AT&T公司的贝尔实验室与MIT合作开发的Unix,旨在于创建一个用于大型、并行、多用户的操作系统。
gun
面向人民
1991年,芬兰赫尔辛基大学的学生Linus Torvals为了能在家里的PC机上使用与学校一样的操作系统,开始编写了类UNIX。
ubuntu
直到至今
核心宗旨:人道待人
shell命令
一般形式
指令 选项 对象
选项和对象可以没有,指令和选项、对象之间都要空开
复习:
我是谁(查看当前用户)—woami
我在哪儿(查看当前用户所在路径)—pwd
我有什么(查看当前用户所在路径下的子文件)–ls
ls -l:显示文件属性查看
ls -a:显示文件,包括隐藏文件(以.开头的)
ls -R:递归形式查看文件目录的子文件
我要去哪儿(进入一个路径或文件目录)---cd
cd ..--返回上一级目录
cd -:返回上一次目录
cd:直接回到家目录
touch--创建普通文件
rm---删除普通文件
mkdir---创建目录文件
rmdir--删除目录文件,但是只能删除空目录
rm -r:删除目录文件
cp:文件的复制
cp 文件1 文件2---把文件1的内容复制到文件2,如果没有文件2,先创建,再复制
mv--文件的剪切(重命名)
mv 文件1 文件2---把文件1的内容移动到文件2,如果没有文件2,先创建,再移动
cat--查看普通文件的内容
man
快捷键
ctrl+c:终止进程回到终端
ctrl+l:清屏
ctrl+shift+n/t:新建一个终端
alt+tab:切换终端
tab:补全命令
ctrl+shift+‘+’:调大字体
ctrl+‘-’:缩小字体
上下键:翻找历史指令
vi编辑器
.vimrc--配置文件
source .vimrc:让配置文件生效打开一个文件,如果没有这个文件,才会新建文件再打开命令行模式
yy
nyy
p
dd
ndd
gg--回到代码开头
G--去到代码末尾
gg=G--自动缩进代码
插入模式
i(insert)---从光标前开始插入
a(append)--从光标后开始插入
o(other)--从光标下一行开始插入
底行模式
shift+:
w--保存
q--退出
q!--强制退出
x--保存并退出
vsp 文件名:打开另一个文件
ctrl+w w:切换光标所在的文件位置
set mouse=a:鼠标使能
set mouse-=a:鼠标失效
set number--显示代码行数
set nonumber--不显示代码行数
替换:
s/str1/str2:替换光标所在的一行的第一个str1
s/str1/str2/g:替换光标所在的一行的所有str1
%s/str1/str2/g:替换程序里面所有的str1
gedit编辑器
和word文档类似
操作简单,但是不会自动缩进,代码的可观性比较差
gcc编译器
编译成功自动生成一个a.out的执行文件,编译失败显示错误信息
gcc编译的四个步骤:
预处理
展开头文件gcc -E 1.c -o 1.i
编译:找出代码错误gcc -S 1.i -o 1.s
汇编将代码转成计算机能识别的二进制语言
gcc -c 1.s -o 1.o
链接:生成代码的可执行文件
gcc 1.o -o zc
文件管理
linux下一切皆文件
根目录:
bin:二进制文件或二进制可执行程序
etc:配置文件
mnt:挂在文件
lib:库文件
dev:设备文件
home:用户的家目录文件
root:权限文件
boot:启动文件
ls -l
-rw-rw-r-- 1 hqyj hqyj 387 4月 15 10:57 1.c
-rw-rw-r--
第一个字符:代表文件的类型
-:普通文件
d:目录文件
b:块设备文件
c:字符设备文件
l:链接文件
s:套接字文件
p:管道文件
九个字符:代表文件的权限
r:可读权限
w:可写权限
x:可执行权限
前三个是用户自己的权限,中间三个是用户组的权限,最后三个是其他用户的权限
文件的权限用八进制表示:
例如:rw-rw-r--
二进制表示为110110100转成八进制0664
文件权限的修改:chmod
1、通过进制修改文件权限例如:chmod 0777 1.c
2、通过算术符修改文件权限
u:用户自己
g:用户组
o:其他用户
例如:
chmod u+x 1.c:代表只给用户自己增加执行权限
链接文件–ln
ln 原文件 硬链接文件名
生成硬链接,硬链接文件类型和原文件一样都是普通文件,硬链接文件大小和原文件一样,修改其中的
一个文件,另一个文件也会跟着被修改,删除原文件,链接文件依旧可以使用
ln 原文件 -s 软链接文件名
生成软链接文件,软链接文件类型为链接文件,大小和源文件不同,一般会小很多,修改其中一个文件,另一个文件也跟着被修改,删除原文件,软链接文件失效
hqyj hqyj 387 4月 15 10:57 1.c
用户名 用户组名 文件大小 时间戳 文件名
进程管理
ps:查看前台进程,一般为(bash,ps)
ps -aux:查看所有进程
top:以cpu占比从高到低排序
kill -9:杀死一个进程
pstree:以树的形式查看进程
ps -ef:查看所有进程
用户管理
linux系统是一个多用户、多任务的操作系统
sudo:暂时赋予当前用户超级用户的权限
adduser:增加一个用户
sudo adduser 用户名
输入密码,一直按回车
su 用户名:切换用户,su不加用户名默认回到root用户,root用户可以访问其他用户的文件,不需要输入
密码
exit:退出当前用户
deluser:只能删除空用户,
--remove-home:删除用户下的文件或者备份文件
彻底删除:/etc/passwd--删除用户,/etc/group--删除用户组
passwd:修改用户密码
只有超级用户不需要输入以前的用户密码,其他用户在修改密码时都需要输入以前的密码
修改用户名:
sudo usermod -d /home/day1 -m -l day1 zcc
sudo usermod -d /home/[新用户名] -m -l 【新用户名】 【老用户名】
shell命令的特殊字符
通配符:
*
:通配所有字符
{m..n}:通配m到n之间的连续的字符
【】:只通配一个字符
【12345】:通配【】里面所有的字符
【1-5】:通配的是1-5之间连续的字符
【^7】:除了7.c的文件不删,其它都删
?:通配一个字符
例如:
rm ?.c:删除所有以一个字符命名的c语言文件
|:把前者的输出作为后者输入
例如:
ls | cat===把ls显示出来的文件名显示到终端
` `:命令置换符
把后者的输出作为前者的参数
例如:
cat `ls`===查看所有ls显示的文件的内容输入输出重定向
>:覆盖
>>:追加
例如:
cat >>1.c===把在终端上输入的内容重定向到1.c这个文件
shell的其它指令
echo:终端输出
1、echo hello world--会自动缩进空格保留一个
2、echo “hello world”---原样输出
grep:查找代码的字符串
一般形式:
grep “查询的字符串” 查询的文件1 查询的文件2.。。。
例如:grep “hello” 1.c 2.c
file:查询文件的类型
find:查找目录文件的子文件
重难点
shell脚本
本质:一系列shell命令的集合
怎么去写一个shell脚本
1、创建.sh的shell脚本文件
2、在脚本里面写shell命令
3、执行shell脚本
执行方式:
a、先给shell脚本文件添加执行权限
chmod 0777 shell脚本文件名
再执行:./文件名.sh
b、用bash解释器解释shell脚本文件
bash 1.sh
解释器和编译器的区别:
编译器:gcc c语言、c++语言
解释器:shll脚本、python
解释器会报错误地方但不会说明错误原因,并且出错也会继续执行shell脚本,直到结束
例如:
#!/bin/bash---解释器的路径,不加默认为/bin/bash,加了一定要加对,不然用修改权限的方法执行会报错
ls
cat 1.c
ajskdhakd
echo "hello world"
shell变量
自定义变量:
用户自己定义的变量
变量的定义:
变量名=值
没有数据类型,shell脚本里面所有变量默认为字符串类型
=两边不能留空
没有分号,一般以换行结束一条shell语句
变量的调用:
$变量名
一般在调用变量的时候用{}括起来,防止和其它变量后者字符串连在一起
变量的赋值:
不能直接变量=变量,右边一定是一个值
1 #!/bin/bash
2
3 val=12
4 echo "val=${val}asda"
练习:交换两个变量的值(shell脚本)
1 #!/bin/bash
2
3 val1=12
4 val2=34
5 temp=$val1
6 val1=$val2
7 val2=$temp
8 echo "val1=$val1 val2=$val2"
位置变量
把命令行参数的值通过终端传递给特定的变量,变量从0开始调用,超过9以上需要用{}
括起来
例如:
1 #!/bin/bash
2
3 echo $0 $1 $2 $3 $4 $5 $6 ${10}
结果:
hqyj@ubuntu:~/240201/day2$ bash 3.sh 12 34 hello world 56 78 90 100 200 300
3.sh 12 34 hello world 56 78 300
预定义变量
计算机自己定义好的一些特殊的变量名
$@:命令行参数的内容,不包括$0
$*:命令行参数的内容,不包括$0
$#:命令行参数的个数,不包括$0
$?:打印上一条shell语句的返回状态,0为真,其它为假(0~127)
环境变量
env
可以查看所有的环境变量
在调用的时候也需要加$
变量的四则运算
变量进行
+-*/%
用(())
能进行+-*/%
运算
能进行幂数运算
不能进行浮点型运算
在调用的时候需要也加$
例如:
1 #!/bin/bash
2 val1=2
3 val2=34
4 val3=$(($val1+$val))
5 echo $val3
用【】
能进行+-*/%
运算
能进行幂数运算
不能进行浮点型运算
在调用的时候需要也加$
例如:
1 #!/bin/bash
2 val1=2
3 val2=34
4 val3=$[$val1+$val2]
5 echo $val3
用expr
进行运算
需要使用命令置换符把结果置换出来
运算符两边需要空开
在进行乘法运算的时候需要给*加\转义
不能进行幂数运算
不能浮点型运算
例如:
1 #!/bin/bash
2 val1=2
3 val2=34
4 val3=`expr $val1 \* 2`
5 echo $val3
练习:提取一个四位数的千位百位十位个位出来(shell
脚本)
1 #!/bin/bash
2 val1=9645
3 th=$[$val1/1000]
4 hu=$[$val1/100%10]
5 ten=$[$val1/10%10]
6 num=$[$val1%10]
7 echo "千位=$th"
8 echo "百位=$hu"
9 echo "十位=$ten"
10 echo "个位=$num"
shell语句
解释型语句
注释一行
#
注释多行
:<<!
shell语句块
!
:<<EOF
shell语句块
EOF
功能型语句
read–变量的输入
可以有多个变量,前面依次赋值,最后一个变量会接受所有没有被赋值的值(字符串)
1 #!/bin/bash
2 read val1 val2 val3
3 th=$[$val1/1000]
4 hu=$[$val1/100%10]
5 ten=$[$val1/10%10]
6 num=$[$val1%10]
7 echo "千位=$th"
8 echo "百位=$hu"
9 echo "十位=$ten"
10 echo "个位=$num"
11 echo $val2
12 echo $val3
结果:
1234 5678 9010 8765
千位=1
百位=2
十位=3
个位=4
5678
9010 8765
-p:增加提示语
1 #!/bin/bash
2 read -p "请输入一个值" val1
3 th=$[$val1/1000]
4 hu=$[$val1/100%10]
5 ten=$[$val1/10%10]
6 num=$[$val1%10]
7 echo "千位=$th"
8 echo "百位=$hu"
9 echo "十位=$ten"
10 echo "个位=$num"
-t:限制时间输入
read -t 5 val1
-n:限制字符个数输入
-s:隐藏输入
test—测试语句
字符串
等号两边都需要空开,不然就是赋值
字符串相等
test 字符串1 = 字符串2
1 #!/bin/bash
2
3 str1="hello"
4 str2="hello"
5 test $str1 = $str2
6 echo $?
字符串不相等
test 字符串1 != 字符串2
-z:字符串是否为空
-n:字符串是否不为空
整型
-eq:相等
-ne:不相等
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
逻辑判断:
-a
-o
!
1 #!/bin/bash
2
3 str1=12
4 str2=34
5 test ! $str1 -gt $str2 -o 23 -gt 34
6 echo $?
文件
作业:
复习今天的指令
实现一个函数,十进制转二进制和十进制转十六进制
#include <stdio.h>
#include <string.h>
#define N 100
#define C 8
int func()
{
int a,b,d;
int Z[N];
int Y[N];
printf("请告诉我要转换的进制类型(2或16):\n");
scanf("%d",&a);
if(a==2)
{
printf("请输入一个数:\n");
scanf("%d",&b);
int e=b;
for(int i=0;i<C;i++)
{
d=e%2;
e=e/2;
Z[C-i-1]=d;
}
printf("十进制数字%d的二进制数为:",b);
for(int i=0;i<C;i++)
{
printf("%d", Z[i]);
}
}
else if(a==16)
{
printf("请输入一个数:\n");
scanf("%d",&b);
int e=b;
for (int i=0;i<C;i++)
{
d=e%16;
e=e/16;
Z[C-i-1]=d;
if(Z[i]>10)
{
Z[i]=Z[i]-10+'A';
}
}
printf("十进制数字%d的十六进制数为:",b);
for(int i=0;i<C;i++)
{
if (Z[i] >= 'A')
{
printf("%c", Z[i]);
}
else
{
printf("%d", Z[i]);
}
}
}
else
{
printf("输入有误,请重新输入");
}
puts(" ");
return 0;
}
int main(int argc, char *argv[])
{
while(1)
{
func();
}
return 0;
}