Linux系统基础
一、软件包管理机制
Debian Linux首先提出“软件包”的管理机制——Deb软件包
Redhat Linux基于这个理念推出了自己的软件包管理机制——Rpm软件包
命令:
1.离线安装:
dpkg:不会检测软件的依赖
-i:安装
-r:移除
2.在线安装:
apt工具
镜像源网址:/etc/apt/source.list
获取软件流程:
1.apt-get update:更新软件索引表
2.apt-get install:下载并安装
3.apt-get remove:删除
安装包存放位置:/var/cache/apt/archives
二、用户管理
有关用户配置的文件的文件路径:
1.用户信息的文件路径:/etc/passwd
2.用户密码信息的文件路径:/etc/shadow
3. 用户组信息的文件路径:/etc/group
用户配置相关命令:
adduser:添加新用户
su:切换用户,默认切换到root,加用户名切换到指定用户
usermod :
-aG 追加用户组:
使用:usermod -aG 用户组名 用户名
作用:将某个用户追加到指定用户组中
deluser:删除用户
deluser --remove-home 用户名 :删除用户的同时删除用户主目录
delgroup:删除用户组
exit:
1. 退出用户
2. 结束终端
三、进程管理
ps:显示进程状态
-ef
-aux
进程状态:
R:运行态
S:等待态
T:暂停态
Z:僵尸态
<:高优先级的
N:低优先级
+:运行在前台的
小写s:拥有子进程的
小写的L:拥有子线程的
top:监控当前进程的状态
q:退出监控状态
kill:向指定进程发送信号
-9:结束进程
-19:暂停进程
四、文件管理
1.文件系统:
windows:NTFS
Linux:EXT4
Linux系统下磁盘文件的路径:/dev/sda
文件系统结构:
windows:磁盘分区
Linux:树状结构
bin:可执行的二进制文件
etc:配置文件
home:存放新建用户的用户主目录
dev:设备文件目录
boot:系统启动
root:超级用户目录
mnt:挂载
usr:用户目录
include:头文件存放目录
ib:库文件存放目录
文件系统导航命令:(有关详细内容,请查看上一篇文章,在此不多赘述)
cd,pwd,ls
文件资源管理命令:(有关详细内容,请查看上一篇文章,在此不多赘述)
cp,touch,mv,rm,mkdir,rmdir
mkfifo:创建管道文件
2、文件权限管理
1.chmod:改变文件的操作权限
u:文件所有者
g:同组用户
o:其他用户
a:所有用户
r:读权限
w:写权限
x:可执行权限
在使用chmod的时候也可以以三位八进制数的形式写明文件权限
sudo chmod 用户(可叠加)+-权限 要修改的文件
sudo chmod 0664 d.c sudo chmod ug+w d.c
2.chown:改变文件的所有者
chown + 用户名 + 文件路径 eg:sudo chown root d.c
3.chgrp:改变文件的所属用户组
chgrp + 用户组名 + 文件路径 eg:sudo chgrp root 230101
4.ls -li :查询inode号
五、链接文件
命令:ln
1.软链接:
创建软链接: ln -s 目标文件的路径 软链接文件名
eg: ln -s demo_2.c my_link.c
特点:类似于windows中的快捷方式
1.inode号与源文件不同,是一个独立的文件
2.在创建软链接时应该写明源文件的绝对路径,不然容易导致链接文件失效
3.源文件路径修改则链接文件失效
4.源文件删除则链接文件失效
5.文件类型是链接文件
2.硬链接
创建硬链接
ln 目标文件的路径 硬链接文件名
特点:类似与文件的备份
1.inode号和源文件使用同一个
2.文件类型普通文件
3.硬链接不会随路径修改而发生失效
4.源文件删除链接文件任然有效,相当于顶替了源文件
六、压缩归档
1.文件的压缩(目标对象为文件)
使用方法:压缩/解压缩指令 + 文件名
gzip:对应的解压指令gunzip
gzip + 目标文件
压缩好的文件后缀名为.gz
bzip2:对应的解压指令为bunzip2
压缩好的文件后缀名为.bz2
xz:对应的解压指令为unxz
压缩好的文件后缀名为.xz
zip:对应的解压指令为unzip
压缩好的文件后缀名为.zip
压缩效率:xz>bzip2>gzip
特点:
1.压缩之后一定可以减小文件大小
2.压缩之后源文件不存在
2.文件的归档/打包(目标对象为目录)
使用方法:tar + -参数选项 + 文件名
参数选项:
-c:创建归档文件
-x:释放归档文件
-v:关注创建或者释放归档文件的过程
-f:指定操作文件(必须添加)
-j:归档并压缩,压缩的文件后缀为.tar.bz2
-z:归档并压缩,压缩的文件后缀为.tar.gz
-J:归档并压缩,压缩的文件后缀为.tar.xz
创建出的归档文件,文件后缀为.tar
创建归档过程:
tar + -cvf + 归档文件名 + 需要归档的目录文件
释放过程:
万能公式:tar -xvf + 需要释放的归档文件名
特点:
1.打包之后并不会减小文件大小
2.归档文件不会删除源文件
六、磁盘管理
df,du
七、网络管理
ping:检测两主机间的网络是否能正常通信
ifconfig:查看网络配置
sudo service network-manager restart:重启网络管理工具
##shell:
本质:命令解释器
系统管理命令:
shutdown:关机
reboot:重启
shell命令格式:
命令 选项 参数
shell特殊字符:
1.通配符:
*:匹配任意长度字符串
?:匹配一个字符
[...]:匹配方括号内任意的一个字符
[1-9]:匹配方括号内范围的一个字符
[^..]:匹配除了方括号内的任意的一个字符
2.管道
管道:|
作用:将前一条指令的输出作为下一条指令的输入
3.输入输出重定向
>:改变输出方向(截断,原文件的内容将会被清空)
>>:改变输出方向(追加)
<:改变输入方向
2>或&>:重定向错误输出方向
4.命令置换符
符号:``(键盘上esc键下面那个,不是单引号) echo
功能:将一个命令作为调用命令的参数
常用指令:
grep:查询某个文件中的特定字符串 -n:查询行号
wc:统计指令
find:查询文件 find -name 文件名 查询路径
shell脚本
本质:shell命令的有序集合,shell脚本是一种解释型语言,每一行代码都相当于一条指令。
开始一个shell脚本的编程:
1.创建一个以.sh为文件后缀的文件
2.shell脚本文件内容编写
建议在shell脚本的第一行说明解释器路径
#!/bin/bash
3.修改文件的执行权限
4.执行shell脚本
第二种执行shell脚本的方式:不用修改权限利用解释器直接运行shell脚本,bash + shell脚本文件
一、shell中的变量
1. 用户自定义变量
由用户自己定义出的变量
1.变量的命名
由字母,数字,下划线组成,不能以数字开头
2.变量的数据类型:
在shell脚本中没有具体的数据类型,所有数据都被理解为字符串
3.变量的赋值:
变量名=数据
注意:1.等号两边不能空格
2.可以直接写数据也可也用单引号或者双引号包覆
赋值完成不用以分号作为结束
3.单引号和双引号使用的异同:
相同点:
在变量赋值时都可以在字符串中存在空格
不同点:
双引号内可以引用其他变量,而单引号不行
4.变量的引用
1.$变量名
2.${变量名}
5.变量的删除
unset 变量名
unset 取消变量的赋值
在shell脚本中变量定义出来都以全局变量理解
2. 位置变量
同命令行参数效果,即一开始给程序运行传递的参数
$0:脚本文件名,运行脚本的执行命令
$1:命令行参数的第一个参数
$2:命令行参数的第二个参数
$3.....$n:。。。
3. 预定义变量
$$:获取当前进程的pid号
$?:获取上一条命令退出的状态值(0为真,1为假)
$*:命令行参数所有内容,除了$0
$@:效果同$*
$#:命令行参数的个数,但是除去$0
4. 环境变量
env–查看所有的环境变量
HOME:用户主目录路径
TERM:终端类型
PATH:shell的搜索路径
二、shell脚本中的语句
1、说明性语句
在代码中起到解释的作用,同注释效果
1.#:注释#号后的一行内容
2.注释一块代码,即注释多行
1.
:<<EOF
EOF
2.
:<<?
?
2、功能性语句
(1). 输入功能语句:read
```
作用:从键盘获取数据
-p:在输入的时候可以存在提示样式
read -p “提示语句” 变量
-s:静默输入,即在输入的时候不显示输入的内容
read -s 变量
-n:在输入时限定输入位数,位数一旦达到则立即停止输入
read -n 限定位数值 变量
-t:在输入的时候限定输入的时间,超过时间则立即停止输入
read -t 限定的秒数 变量
```
read -p 举例:
```c
1 #!/bin/bash
2 read -p "please input a number:" arr
3 echo "arr=$arr"
4 echo $?
```
```c
1 #!/bin/bash
2 read -p "please input a number:" arr b c d
3 echo "arr=$arr"
4 echo $b
5 echo $c
6 echo $d
前面依次赋值,剩下的所有都赋值给最后一个变量
```
(2). 测试功能语句:test
测试对象:字符串、数值、文件
1.字符串:
=:判断俩个字符串是否相同
!=:判断不相同
\>:判定两个字符串谁大
\<:判断谁小
例如:
test $val1 = $val2
-z:判断一个字符串长度是否为0
-n:判断一个字符串长度是否不为0
例如:
test -z $val
2.数值:
-eq:判断两个数值是否相同
-ne:判断两个数值是否不同
-lt:判断小于
-gt:判断大于
-ge:判断大于等于
-le:判断小于等于
例如:
test $val1 -eq $val2
3.文件:
-e:判定文件是否存在
-r:判定文件是否拥有读权限
-w:判定文件是否拥有写权限
-x:判定文件是否拥有执行权限
-d:判定文件是否是目录文件
-p:判定文件是否是管道文件
-L:判定文件是否是链接文件
-f:判定文件是否是普通文件
例如:
test -e $file_path
以时间戳来判定文件的新旧
-nt:判定第一个文件是否比第二个文件更新
-ot:判定第一个文件是否比第二个文件更旧
例如:
test $file1 -nt $file2
(3). expr算数功能语句
运算符:
和C语言中运算符类似
1.((表达式)):算数运算,只能操作整数
注意:可以写较为复杂的运算表达式
在表达式中可以加$引用变量也可也不加
最终运算的结果可以通过$赋值给其他变量
2.$[表达式]:算数运算,只能操作整数
和(())类似,运算完的结果一定需要赋值给其他变量
3.expr:算数运算,字符串的运算
expr是一条指令,在使用expr的时候需要用到命令置换符来获取命令最终运算的数据
算数运算:+,-,\*,/,|,&
注意:由于*为通配符,所以需要加一个反斜杠转义成乘号
字符串运算:
length:计算字符串的长度
例如:
len=`expr length $string`
作用计算string的长度存储到len变量中
index:定位子字符在字符串中的位置
例如:
val=`expr index $string "e"`
作用匹配源字符串中e字符存在的位置
substr:裁剪源字符串中内容
例如:
val=`expr substr $string 2 3`
作用从源字符串的第二个字符开始裁剪,裁剪3个字符
expr使用时注意事项:
运算符间需要空格
使用脚本中的变量需要引用
练习:
1. 从命令行参数传递一个文件的路径,判定该文件的类型
2. 从命令行输入两个数字,完成对这个两个数字的运算
3. 从命令行输入一个字符串,裁剪其中的匹配到e字符开始后的5个字符
3、结构性语句
(1).选择语句
1.if语句
if 表达式(测试语句)
then
命令
fi
表达样式:
1.例如
if test -e $file
then
echo "file is exit"
fi
2.例如
if [ -d $file ]
then
echo "file is a dirctory"
fi
注意:方括号两端都必须存在一个空格
多路分支表达样式
1.两路分支
if 测试语句
then
命令
else
命令
fi
2.多路分支
if 测试语句
then
命令
elif 测试语句
then
命令
else
命令
fi
嵌套使用
嵌套使用的时候有几个if最后就会有几个fi
练习:
判定输入的文件是否存在,存在则判断文件的类型,不存在则说明不存在
练习:输入一个文件,判断这个文件是否存在,如果没有可写权限,增加可写权限,然后把“hello world”放到这个文件里面来,如果有直接放“hello world”
1 #!/bin/bash
2 read -p "please input a filename:" file
3 if test -e $file
4 then
5 if test -w $file
6 then
7 echo "hello world" >>$file
8 else
9 chmod +w $file
10 echo "hello world" >>$file
11 fi
12 else
13 echo "file is not exist"
14 touch $file
15 echo "hello world">>$file
16 fi
2.case语句
表达形式:
case 变量 in
模式1)
命令
;;
模式2)
命令
;;
*)#类似于C语言中default的用法
命令
;;
esac
使用注意:
模式实际上是一个字符串
匹配多个字符串实现同一个效果‘|’
例如:
模式1|模式2|模式3)
通配符在shell脚本中同样实用
选择语句例子:
1 #!/bin/bash
2 read a
3 case $a in
4 1)
5 echo "monday"
6 ;;
7 2)
8 echo "tuesday"
9 ;;
10 esac
(2). 循环语句
-
for循环
表达形式 for 变量名 in 单词表 do 命令 done 使用注意: 可以使用seq命令获取一串数字 seq 起始值 单次跳转值 终止值 如果单次跳转没有指定按照1来进行加法
#!/bin/bash
function sum()
{
# for i in {1..100} //单词表的方式
for((i=0;i<101;i++)) //条件在C的基础上加双括号
do
sum1=$(($sum1+$i))
done
echo $sum1
}
sum //函数的调用
for的c语言的用法
for((i=0;i<100;i++))
do
done
1 #!/bin/bash
2 for((i=1;i<=100;i++))
3 do
4 sum=$(($sum+$i))
5 done
6 echo $sum
for 变量 in 命令置换
do
shell语句
done
1 #!/bin/bash
2 for i in `ls`
3 do
4 echo $i
5 done
-
while循环
表达形式 while 表达式(测试语句) do 命令 done
while循环的死循环例子:
while true
do
shell语句
done
1 #!/bin/bash 2 while true 3 do 4 echo "hello world" 5 done
(3). 循环控制语句
```
1.break:退出一层循环
break + n:退出n层
2.continue:退出一次循环
continue + n:
```
三、shell脚本中的函数
因为shell脚本的本质是shell命令的有序集合,而shell函数相当于将多个shell命令组合到一起形成一个大的shell命令。
1. shell脚本中的函数定义方法
-
函数名()
{
函数体
} -
function 函数名()
{
函数体
}
注意:
1 .在shell脚本中函数定义的时候不用专门指定形式参数。
2.shell脚本中数据大部分都是全局变量,如果要在函数中定义局部变量请加local限定。
2. shell脚本中的函数的参数传递
由于函数在定义的时候不用写清楚形式参数的个数和数据类型,因此实际参数传递个数随意。
在函数中形式参数表达方式类似于位置变量:
$1指函数传递的实际参数的第一个数据
$2第二个参数
。。。
$*:所以的实际参数
3. shell脚本中的函数的调用
函数名
函数名 形参1 形参2 . …
只有当函数调用之后,里面的变量才会生效
4.shell脚本中的函数的返回值
-
在函数内用return进行数据的返回
在调用函数时可以利用$?来获取函数返回值
return在函数中只能返回0-255的数值func() { val=$(($1+$2)) return $val } func 10 20 $? #利用$?获取返回值
-
如果想在函数内放回字符串,只能利用echo来进行输出
函数调用需要用命令置换符调用,用于接收该函数输出的数据,输出的数据可以存储在一个变量中
func() { val=$(($1+$2)) echo $val } retval=`func 10 20` echo $retval
练习:
1.将统计文件数量的脚本封装成shell脚本的函数
2.完成一个脚本可以在任意路径下创建一个工程文件夹,判断该文件夹是否存在,如果存在并且是目录文件的情况下报错,否则创建该目录文件,并且在该目录文件下创建src,include,lib,obj目录文件和一个Makefile普通文件
四、shell数组
数组名=(12 34 “zbc”)
数组的调用:ARR[下标]
${ARR[*]}—打印数组的所有内容
${#ARR[*]}----打印数组的长度(字符串的个数)
练习:遍历这个数组
1 #!/bin/bash
2 ARR=(12 56 "hello" "world")//数组的初始化
3 echo ${ARR[2]}//数组的调用
4 echo "ARR=${ARR[*]}"//打印数组所有内容
5 echo "len=${#ARR[*]}"//求数组的长度
6 for((i=0;i<${#ARR[*]};i++))//遍历数组
7 do
8 echo ${ARR[$i]}
9 done
练习:交换第一个和第二个的内容
0 temp=${ARR[0]}
11 ARR[0]=${ARR[1]}
12 ARR[1]=$temp
13 echo ${ARR[*]}
makefile
makefile是一个文件,管理多个文件
make是一个工具,解析makefile这个文件
1.基础语法
体验版makefile:
all:标签
gcc *.c -I ./include -o add 编译的命令
真正的makefile:
目标文件:依赖文件
目标文件就是最终生成的文件,一般为执行文件,需要去找它所有的依赖文件,如果依赖文件也需要其他的依赖文件,继续啊去找该依赖文件需要的依赖文件,直到不需要或报错
1 app:add.o main.o
2 gcc main.o add.o -o app
3 add.o:add.c
4 gcc -c add.c -o add.o
5 main.o:main.c
6 gcc -c main.c -o main.o
7 clean:
8 rm *.o app
gcc和make的区别:
两者都可以生成执行文件,gcc是在编译时,不管编译几次会把所有文件从头开始编译,make是根据文件的时间戳来进行编译,如果时间戳没有发生改变,不会编译该文件,大量节约了编译的时间
makefile的变量
变量的调用:${变量名} $(变量名)
变量的赋值方式:
= ---------普遍赋值,赋值最新的变量值
var=123
var2=$(var)
var=456
all:
echo $(var2)---打印456
: = -----------立即赋值
var=123
var2:=$(var)
var=456
all:
echo $(var2)---打印123
?=------------询问赋值,如果该变量之前已经赋值,此次不能赋值,如果没有就赋值
var=123
var?=456
all:
echo $(var2)---打印123
+=---------追加赋值,连接起来
1 var=how
2 var+=are you
3 all:
4 @echo $(var)--打印how are you
make -f 指定的makefile文件名
在命令前面加@–隐藏,在终端上就不显示
make clean----删除生成的目标文件
2.特殊变量
$^---所有依赖文件
$@---目标文件
$< ---第一个依赖文件
%是表示所有的通配符
1 CC=gcc
2 choice=-o
3 TARGET=app
4 OBJS=main.o add.o
5
6 $(TARGET):$(OBJS)
7 $(CC) $^ -o $@
8 add.o:add.c
9 $(CC) -c $< -o $@
10 main.o:main.c
11 $(CC) -c $< -o $@
12 clean:
13 rm $(OBJS) $(TARGET)
1 CC=gcc
2 choice=-o
3 TARGET=app
4 OBJS=main.o add.o
5
6 $(TARGET):$(OBJS)
7 $(CC) $^ -o $@
8 %.o:%.c
9 $(CC) -c $^ -o $@
10 clean:
11 rm $(OBJS) $(TARGET)
要求:会写简单的makefile和看懂别人的makefile
练习:
封装一个删除一段英文空格的函数,用make去编译
how are you
howareyou
#include <stdio.h>
char *delate_space(char *s)
{
int i=0;
char *p=s;
char *q=NULL;
while(*p)
{
if(' ' == *p)//找空格的位置
{
q=p;
while(*q)
{
*q=*(q+1);//从空格开始依次往前赋值
q++;
}
}
p++;
}
return s;//此时p和q都指向‘\0'
}
int main(int argc, char *argv[])
{
char a[32]={0};
gets(a);
puts(delate_space(a));
return 0;
}
gdb调试
gcc -g 编译文件 -o 执行文件名
例如:gcc -g test.c -o test
l—查看调试的文件,默认十行
b(break)—设置断点
b +行号
r—运行程序,运行到断点
c—继续运行到下一个断点
p+变量----查看此时变量的值
q—退出调试