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=10a就是普通变量 
- 
自定义变量 变量名=`命令` 是`` 不是 '' 变量名就是该命令的输出结果
- 
环境变量 系统中的一些重要变量 它们指定了:命令/程序的路径、头文件的路径、库文件的路径 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
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号