Linux基础
1.初识Linux
Linux是一套自由传播和免费使用的类UNIX系统,是一个基于POSIX和UNIX的多用户,多任务,支持多线程,和多CPU的操作系统。Linux系统与其他的操作系统相比,具有代码开源性,没有版权,技术社区用户多,开放源码使得用户可以自由裁剪,灵活度高,成本低。
Linux系统有:Redhat,CentOS,Ubuntu,deepin,kali Linux .....
在讨论Linux系统的时候:其实只有Linux内核是一样的。
类Unix系统目录:
- bin:存放二进制可执行文件
- boot:存放开机启动程序
- dev:存放设备文件
- home:存放用户
- etc:存放用户信息和系统配置文件
- lib:存放库文件
- root:管理员宿主目录
- usr:用户资源管理目录
2.Linux基本指令
Linux的图形界面不是强项,一般都是使用字符界面/终端
我们往终端输入相应的指令,就可以执行相应的程序,就可以实现相应的功能
2.1 apt
apt(Advanced Packing Tool):Ubuntu中功能最强大的命令行软件包管理工具,用于获取、安装、编译、卸载和查询软件包,以及检查软件依赖关系
工作原理:基于软件源服务器地址进行查找
/etc/apt/sources.list
用来指定Ubuntu的软件源服务地址
apt相关的常用命令
sudo apt update #下载更新软件列表信息 #通过这个指令可以将服务器的软件列表更新下载到本地 #如果下载一个软件,现在本地的软件列表查找,如果没有,会尝试更新一下软件包列表信息 sudo apt upgrade #将系统中的已安装的软件升级为最新版本 sudo apt install 软件包名 #下载安装软件包 sudo apt remove 软件包名 #卸载软件包 sudo apt search 软件包名 #搜索软件包 sudo#以管理员权限运行
2.2 vi/vim
vi/vim
是Linux中最基本、最常用、功能最强大的命令行编辑器 -- 可以不用,但不能不会用
vim是vi的一个升级版
vi有两种工作模式
-
命令模式(默认):所有输入数据都理解为命令
i/I:insert i:进入输入模式后,光标不动 I:进入输入模式后,光标移动到行首 a/A:append a:进入输入模式后,光标往后移动一个字符 A:进入输入模式后,光标移动到行末 o/O:open o:进入输入模式后,光标的上一行会新开一行 O:进入输入模式后,光标的下一行会新开一行 ESC:进入命令模式 -
输入模式(按
i
进入):所有输入的数据都理解为字符
vi的退出命令
在命令模式下,输入
:q
退出:q!
强制退出:w
保存:wq
保存并退出:w 文件名
另存为:x
等价于:wq
vi的删除命令
在命令模式下,输入
x
删除光标所在的字符dd
删除/剪切光标所在的行ndd
删除/剪切光标及一下的行r
替代光标所在的单个字符r+字符
vi的拷贝与粘贴命令
在命令模式下,输入
yy
将当前行的内容拷贝到粘贴板p
将剪切板的内容粘贴到当前行的后面P
将剪切板的内容粘贴到当前行的后面
vi的撤回命令
在命令模式下,输入
u
vi的搜索命令
在命令模式下,输入
/要搜索的内容
n
找下一个匹配的内容N
反向找下一个匹配的内容
vi显示行号
在命令模式下,输入
set nu
显示行号set nonu
不显示行号
vi的屏幕分割命令
sp filename
上下分割,并打开一个新文件vsp filename
左右分割,并打开一个新文件
光标移动命令
j
向下k
向上l
向右h
向左
光标跳转
:行号
光标跳转到对应行$
光标跳转到末尾
Ubuntu18.04 按下 Ctrl + S 会锁住屏幕,按 Ctrl + Q 退出锁定
Ctrl + Z 挂起vi,终端输入 fg
即可返回
2.3文件系统相关命令
文件系统:用来管理文件的一套组织方法
在Windows中,文件后缀决定了文件的类型(计算机解析它的方式)
在Linux中,文件后缀名只是表示这可能是什么类型的文件,具体的文件类型是由文件属性决定的
文件
- 文件属性:是一个结构体,有文件类型,文件大小,文件链接,最后修改时间....
- 文件内容
Linux中文件系统结构是一个树状结构,所有文件的最初位置都是从根目录 /
出发,根目录下可以有目录,也可以有文件,目录下可以有目录,也可以有文件
- 绝对路径:路径以根目录开始,就叫绝对路径
- 相对路径:相对于当前目录来说
/
根目录
.
当前目录
..
上一级目录
pwd
print work directory 打印工作目录
china@ubuntu:/mnt/hgfs/share$ pwd /mnt/hgfs/share
cd
change directory 改变目录
china@ubuntu:/$ pwd / china@ubuntu:/$ cd /mnt/hgfs/share china@ubuntu:/mnt/hgfs/share$ pwd /mnt/hgfs/share
ls
list 列举指定目录下的所有文件的文件名
china@ubuntu:/mnt/hgfs/share$ ls hello hello.c share.code-workspace test.c test.exe #ls -l 列举详细信息 china@ubuntu:/mnt/hgfs/share$ ls -l 总用量 63 -rwxrwxrwx 1 root root 8304 7月 13 14:40 hello -rwxrwxrwx 1 root root 338 7月 13 15:59 hello.c -rwxrwxrwx 1 root root 110 7月 11 16:11 share.code-workspace -rwxrwxrwx 1 root root 201 7月 12 10:00 test.c -rwxrwxrwx 1 root root 54024 7月 12 10:00 test.exe #第一个字符表示文件的类型 #- 表示普通文件 #d 表示这是一个目录 #b block 块设备 硬盘 #c char 字符设备 鼠标,触摸屏 #l link 符号链接 #p pipe 管道文件 #s socket 套接字文件 #Linux下一切皆文件 #------------- #rwxrwxrwx 权限 # 第一组rwx 属主用户的读写执行权限 # 第二组rwx 属主的组用户读写执行权限 # 第三组rwx 是其他用户读写执行权限 #------------- #1 硬链接数 #------------- #第一个root 属主用户名 #第二个root 属主用户所在的组名 #------------- #8304 文件大小 #ls -a 列举所有文件,包括隐藏文件 china@ubuntu:/mnt/hgfs/share$ ls -a . .. hello hello.c share.code-workspace test.c test.exe
-
对于/home/用户名 在此目录,当前用户拥有绝对权限
-
root 超级用户,拥有最高权限
mkdir
make directory 创建一个空目录
mkdir {-p} 带路径的目录名 -p parent 父亲 如果你要创建的目录的上面的某一级或多个目录不存在,则一并创建,前提是有权限 mkdir test #是目录但没有路径默认在当前目录下创建 mkdir test/test1/test2 #如果test或者test1不存在,就会创建失败 mkdir -p test/test1/test2 #不存在的目录一并创建
rmdir
remove directory 删除空目录
rmdir 带路径的空目录名
rm
remove 删除文件、目录
rm [option] 带路径的目录、文件名 -r #递归删除 -f #强制删除 -rf #强制递归删除 sudo rm /* -rf #删库跑路指令^.^
cp
copy
cp [option] [source] [dest] option #选项 source #源 dest #目的 #拷贝目录要加上一些选项 -r -f -rf
*
通配符
cp ./*.c ../ #将当前目录下所有.c结尾文件,全部拷贝到上一级
touch
新建一个普通文件
mv
move 移动
tar
文件的压缩和归档
归档:将所有文件打包
压缩:将一组文件压缩成一个文件
tar [option] tarfile filelist #将filelist中的文件压缩并将压缩包命名为tarfile [option] -x 释放一个归档文件 -c 创建一个归档文件 -v 显示归档/释放的过程信息 -f 指定归档文件的名称 -j bzip2压缩 -z gzip压缩
file
用来判断一个文件的类型
ln
链接
- 硬链接
- 软链接/符号链接:类似于快捷方式
ln -s target link_name #为target 这个文件创建一个软链接
2.4 manual手册
Linux为每个命令/系统函数/标准库函数,写了一个文档,文档集合成manual手册
man name
manual一共有九章
- 可执行程序或 shell 命令
- 系统调用(内核提供的函数)
- 库调用(程序库中的函数)
- 特殊文件(通常位于 /dev)
- 文件格式和规范,如 /etc/passwd
- 游戏
- 杂项(包括宏包和规范,如 man(7),groff(7))
- 系统管理命令(通常只针对 root 用户)
- 内核例程 [非标准]
sudo
以管理员(root)权限运行某些指令
sudo su #切换到管理员用户 su username #切换到对应的用户
clear
清屏 快捷键 Ctrl + L
Ctrl + Alt + T 弹出终端
2.5 用户管理
chmod
change mode 改变文件的权限
rwxrw-r-- r:read w:write x:excute -:表示没有相应的权限 rwx看作八进制 rwx rw- r-- 111 110 100 7 6 4 0764 == rwxrw-r-- chmod 0777 1.txt #将1.txt的权限设置为rwxrwxrwx chmod u+x 1.txt #为当前用户添加可执行权限 chmod u-x 1.txt #为当前用户减去可执行权限 chmod g+x 1.txt #为文件的组用户添加可执行权限 chmod g-x 1.txt #为文件的组用户减去可执行权限 chmod o+x 1.txt #为其他用户添加可执行权限 chmod o-x 1.txt #为其他用户减去可执行权限 chmod +x 1.txt #给所有用户添加可执行权限
chown
change file owner 改变文件属主
adduser
创建一个普通用户
userdel
删除一个用户
/etc/passwd #保存用户信息 /etc/group #保存用户组信息
gedit
打开/修改一个文件
history
显示历史指令
2.6 进程管理
ps
process status 列出系统中进程的信息
china@ubuntu:/$ ps PID TTY TIME CMD 2199 pts/0 00:00:00 bash 2338 pts/0 00:00:00 bash 2501 pts/0 00:00:00 ps
kill
发送一个信号给某个进程
kill -9 pid #杀死pid指定的进程
top
以CPU的实时占用率对每个进程进行排名
2.7 网络相关指令
ping
测试两台主机之间网络是否可达
ping www.baidu.com
ifconfig
网络设置指令、查看网络状态信息
2.8 find
从文件系统查找文件
find ./ -name stdio.h #在当前路径下查找stdio.h find / -size +100k #寻找100k以上的文件
2.9 grep
用于从文件中找字符串
grep 选项 匹配模式 文件名列表 -n 显示行号 -H 显示文件名 -E 使用扩展的正则表达式 grep -nH "main" ./test.c #在test.c中查找"main"的行
正则表达式:用来描述某种规则的字符串表达式
在正则表达式中,有两种字符
- 普通字符:只代表自己本身
- 特殊字符:有特点含义的字符(元字符)
常见的元字符
.
匹配任意单个字符
grep -nHE "m." ./test.c #m开头并且后面有任意一个字符
\
转义字符 表示移除元字符的特殊含义,代表\后面的字符本身
[]
字符合集,匹配该集合中任意一个字符 [0-9]
[a-z]
[^]
排除字符合集,不匹配该字符集合中的任意字符 [^0-9]
*
匹配前面的字符 0次和多次
+
匹配前面的字符 1次和多次
?
匹配前面的字符 0次和1次
0[xX][0-9a-fA-f]+
用正则表达式来描述一个十六进制字符串
3. shell脚本
3.1 shell是什么
shell是一种脚本语言,不需要编译,是一种解释型语言
C/C++是编译型语言,源文件需要经过编译,才能生成可执行文件
shell、python、php....是解释型语言,不需要编译,可以直接运行,需要解释器
shell的解释器是谁呢,命令解析器:/bin/bash /bin/dash ...
shell脚本文件的后缀为 .sh
3.2一个最简单的shell脚本
#!/bin/bash #指定shell脚本的命令解析器 echo "hello world"
3.3 shell变量
shell语言中也有变量,没有区分类型,也无需定义,直接使用
a=1 #a就是一个shell变量
- 注意:=两边不能又空格
变量的引用方式
echo $a
shell变量的分类
-
普通变量
a=10 a就是普通变量
-
自定义变量
变量名=`命令` 是`` 不是 '' 变量名就是该命令的输出结果 -
环境变量
系统中的一些重要变量
它们指定了:命令/程序的路径、头文件的路径、库文件的路径
china@ubuntu:/$ echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/arm/5.4.0/usr/bin 这里都保存了一些命令/程序,冒号是用来分割这些路径的,PATH指定了程序/命令的路径,那我们能不能把要执行的文件直接放到这些目录中,或者我们把需要执行的文件的路径也添加到PATH中,这样就可以直接运行要执行的文件了
export PATH=/mnt/hgfs/share #这种写法有问题,会把PATH中之前的内容覆盖掉 export PATH=$PATH:/mnt/hgfs/share #export 导入的内容在重启之后会丢失 #Ubuntu每次都能在开机之后找到ls等命令的原因在于,对于系统而言,是有启动过程的。启动过程中有一些文件会在开机的时候自动运行,在这些文件中就有对PATH环境变量的初始化 -
位置变量
指的是传递给shell程序或者传递给函数的参数
./1.sh 123 456 abcdefg #./1.sh 123 456 abcdefg 就是位置变量 $0 #./1.sh $1 #123 #最多可以有10个 $0 - $9 $# #表示命令行参数的个数 不包括$0 $@ #表示所有参数 不包括$0 $? #表示前一个命令或者程序的退出码 -
数组
不需要定义,直接使用
#读访问 a[0]="123" a[1]=10 #写访问 echo ${a[0]} #访问数组中所有的元素 ${a[*]} ${a[@]}
3.4 shell的功能语句
echo
输出后面变量的内容
echo "hello"
read
用于输入,以换行符结束
read a
输入输出重定向
shell的输出默认输出到终端,我们也可以不输出到终端,输出到别的地方,就是输出重定向
echo "hello world" > 1.txt #输出到文件中 echo "hello world" >> 1.txt #输出到文件末尾
shell的输入默认从标准输入设备(键盘)中输入,也可以不从键盘输入,从其他地方获取数据,就是输入重定向
read a < 1.txt #从文件中取得数据赋值给a
expr
用来进行算术运算 + - * / %
注意 \*
表示乘法, *
是有特殊含义的
read a b c=`expr $a + $b` #=两边不能有空格,+两边必须有空格
test
用来测试 字符串、整数、文件
#字符串测试 test "abc" = "aef" #相等返回0 不相等返回1 test -z test -n #整数测试 -eq #相等 -ne #不相等 -gt #大于 -lt #小于 -ge #大于等于 -le #小于等于 test $a -eq $b #测试a和b是否相等 #符合条件返回0 不符合返回1 #文件测试 -d #是否为目录 -f #是否为普通文件 -r #是否可读 -w #是否可写 -x #是否可执行 test -f filename #test也可以用[]代替 [ -f filename ]
main函数的返回值,可以通过 $?
来接收
3.5分支结构
if
if 命令 ; then 语句块1 else 语句块2 fi
示例:输入两个数,判断是否相等
#!/bin/bash read a b if [ $a -eq $b ] ; then echo "$a $b a==b" else echo "$a $b a!=b" fi
case
case 变量 in 模式1) 语句块1 ;; 模式2) 语句块2 ;; ... 模式n) 语句块n ;; esac
3.6循环结构
for
for 变量名 in 循环的值 do 循环体语句 done
while
while 命令 do 循环体语句 done
3.7函数
函数名() { 语句 } #不需要形参和返回值,参数通过$1 $2 ... 直接访问 #示例 sum() { echo $1 $2 s=`expr $1 + $2` return $s } #调用 a=`sum 10 20` echo $a
本文作者:乐情在水静气同山
本文链接:https://www.cnblogs.com/aalynsah/p/17551520.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步