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一共有九章

  1. 可执行程序或 shell 命令
  2. 系统调用(内核提供的函数)
  3. 库调用(程序库中的函数)
  4. 特殊文件(通常位于 /dev)
  5. 文件格式和规范,如 /etc/passwd
  6. 游戏
  7. 杂项(包括宏包和规范,如 man(7),groff(7))
  8. 系统管理命令(通常只针对 root 用户)
  9. 内核例程 [非标准]

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
posted @ 2023-07-13 17:07  乐情在水静气同山  阅读(23)  评论(0编辑  收藏  举报