linux学习笔记

linux命令及基础知识

linux五大支柱

unix,minix,gun计划,posix,互联网

Linux配置

  1. apt更新

    # 设置里面换源
    # 终端更新
    sudo apt update
    
  2. 安装samba服务

    sudo apt install samba -y
    
  3. 查看ip

    192.168.220.128
    

Linux文件系统

  • / 根, 类似于Window的盘符,如 D: 、 C: 、 E: ; 从/开始的文件路径都是绝对路径。
  • /boot 系统引导程序
  • /bin 存放常用的程序
  • /sbin 存放系统管理的程序
  • /home 普通用户的家目录,创建的新用户所在的位置,如disen用户的家目录是 /home/disen 。
  • liblib64 存放32位或64位的程序依赖库
  • /usr 存放用户安装的应用程序及头文件、库文件
  • /root root系统超级管理员的家目录
  • /opt 额外的资源存放的位置
  • /media 存放媒介的资源目录
  • /dev 存放外部设备的资源目录, 不能直接使用,需要将资源挂载到其它位置。
  • /mnt 将外部设备资源挂载的目录
  • /proc 存放操作系统与硬件、版权相关信息,如cpu、meminfo
  • /var 存放程序运行的可变资源。
  • /run 存放程序运行时的资源
  • /etc 存放程序的配置资源和服务, 如 /etc/samba/smb.conf
  • /tmp 存放临时文件的

Linux指令结构

命令 选项 参数
例如:
ls -l /usr

常用技巧

  • man——查看帮助信息

    man 命令
    man ls
    whatis 命令 ——简短的帮助命令
    man [1/2/3] -f 命令 ——1:系统命令,2:系统调用函数(open...),3:c库函数(printf...)
    
    进入后 b上一页 空格下一页 上下键光标位置
    
  • 自动补全+历史命令——Tab+双Tab+上下键

  • 重定向

    命令结果保存到目的文件中
    重写模式:命令 > 目的文件
    追加模式:命令 >> 目的文件
    ls -a > b.txt
    ls /usr/include/linux/*.h >> b.txt
    
  • 管道

    一个程序的输出 作为另外一个程序的输入
    ls | head -n 1 # 输出第一个文件名
    ls /usr/include/n*.h | xargs head -n 1 #xargs将上一个结果作为遍历参数
    

文件权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wMYnIh3e-1691403061327)(D:\IOT-QF\文档\学习记录\img\image-20230704174140848.png)]

ls -l
-rw-rw-r-- 1 lb lb    14844 7月   4 16:28 b.txt

常用命令

ls
查看文件及子目录
ls
ls -al
ls -a /home

计算机处理最小参数是一个字节
1Byte(字节) = 8bit

选项
-a:所有文件
-A:除取.与..所有文件
-l:标准化输出
-h:人性化(加单位KMG),这个选项必须和-l一起使用
-t:按照时间排序,最新修改第一位
-S:按照文件大小排序
-r:反向排序

常用组合
ls -lh
ls -lt
ls -lhs
ls -lhsr
ls -ltr
ls -lAhSr #按照容量从小到大以列表化+人性化(容量加单位)+不包含.与..的输出
tree
以树状结构显示目录信息
安装:sudo apt install tree -y
使用:tree -L 层数

tree -L 3
clear
清屏
awk和管道
awk和管道(|)可以结合使用以实现更复杂的数据处理和分析
管道将前一个命令的输出传递给后一个命令作为输入,
awk是一种强大的文本处理工具,可以对文本进行分割、筛选、转换和计算等操作

# 自定义打印字段 $0表示整行(所有字段),$i表示各个字段
ls -l | hand -n 1 | awk '{print $1,$2,$3,$4,$5,$6,$7,$8,$9}'
#结果
-rw-rw-r-- 1 lb lb 14844 7月 4 16:28 b.txt

# 结合正则表达式
command | awk '/pattern/ {print $0}'
# 只打印包含V的串
ls -l | awk '/V/ {print $0}' 
#结果
drwxr-xr-x 2 lb lb     4096 7月   3 17:00 Videos
-rw------- 1 lb lb 53834249 10月 14  2020 VMwareTools-10.3.23-17030940.tar.gz
cd
切换工作目录
cd 新工作目录位置

示例
cd #回到家目录,等于 ~
cd ./子目录 #./可以省略
cd 绝对目录 #绝对目录以/开头
cd - #回到上一次的工作目录

文件分隔符
Linux的文件路径分割符:/
windows的文件路径分割符:\
pwd
显示当前工作目录的绝对路径
cat
查看文件内容的命令
cat [-n -b] 文件

选项
-n:输出加行号
-b:输出加行号且不输出空行

cat -n b.txt
cat -b b.txt
rm
删除文件或者是目录
rm [-r -f] 文件...

选项
-r:递归删除子目录及子文件
-f:强制删除,不提示错误信息


rmdir #删除空目录
mkdir #创建空目录

删除文件夹下所有文件
rm -rf abc/* #*为通配符,匹配所有文件
cp
复制文件到目标文件
cp [-f -u -v] 文件 目标文件
复制文件到目标目录
cp [-r -f -v] 文件/目录... 目标目录
cp [-r -f -v] -t 目标目录 文件/目录...

选项
-r:复制目录
-f:强制替换-默认有
-u:更新文件或目录
-v:显示复制的过程信息

备份-复制a.txt到b.txt
cp a.txt b.txt
更新
cp -u a.txt b.txt
复制目录到目录
mkdir a
mkdir abc
cp -r a abc
复制多个文件或目录到指定目录
cp -r a a.txt b.txt abc
mv
移动文件到目标文件
mv [-f -u -v] 文件 目标文件
移动文件到目标目录
mv [-f -v] 文件/目录... 目标目录
mv [-f -v] -t 目标目录 文件/目录...

选项
-f:强制-默认有
-u:更新文件或目录
-v:显示过程信息

文件重命名
mv a.txt c.txt
目录重命名
mv abc aaa
移动文件到指定目录
mv a.txt aaa
移动目录到指定目录
mv aaa abc
移动多个目录与文件到指定目录
mv ddd b.txt abc
mv ddd b.txt abc
移动目录中所有文件及子目录到新目录
mv abc/* aaa
移动目录中所有.h文件及子目录到新目录
mv abc/*.h aaa
mkdir
创建空目录
mkdir 目录
创建多级目录
mkdir -p 目录/目录

mkdir -p a/b/c/d
touch
创建空文件,或者更新文件,不改变文件内容
torch aa.txt

相似操作-echo重定向
echo "" > aa.txt #echo用于在终端打印信息,写入#用单引号
find
在指定路径下查找指定文件
find 查找目录 [-maxdepth n] -name [文件名|'*.txt']
根据文件创建修改时间查找文件
find 查找目录 [-mmin n | -cmin n | -atime n | -mtime n |...]

选项
-cmin n 查找最近一次修改在[n-1分钟,n分钟]内的所有文件
-atime n 查找

查找目标目录下所有txt文件
find abc -name '*.txt'
指定递归2层,查找目标目录下所有txt文件
find abc -maxdepth 2 -name '*.txt'
从当前目录中查找,最近0-1分钟修改的文件
find ./ -cmin 1
从当前目录中,查看20分钟修改内容的所有文件
find ./ -mmin -20

# 查找20分钟内修改的文件并统计所有字符
find ./ -mmin -20 | xargs wc -m
wc
统计文件字符数
wc -m 文件
grep
在指定文件中查找指定内容,并输出指定行
grep [指定内容] [file...] [选项]

选项: 
-v:反向匹配
-l:输出匹配的文件位置
-L:输出不匹配的文件位置,
-i:不区分大小写
-n:输出带行号

从a.txt中查找与i有关的行
grep i a.txt -n
查找/usr/include目录下有关io的所有头文件
find /usr/include -name '*.h' | grep io
ln
硬链接:指向目标文件的底层内存,和原来文件同一个内存空间
软链接:一个快捷方式,内容是目标文件,和原来文件不同空间

硬链接和拷贝区别
   硬链接并不是文件的拷贝,它只是对同一份文件的多个文件名引用。修改其中一个硬链接将影响其他硬链接,因为它们共享相同的文件数据和属性。而软链接是一个独立的文件,它包含对目标文件或目录的路径引用

应用场景
软连接:创建一个访问快捷方式,放在环境变量中,即可在不同工作目录使用
硬链接:重要文件,防止误删,不是备份!!拷贝才是备份

创建硬链接
ln <目标文件或目录的路径> <创建的软链接的名称>
创建软链接
ln -s <目标文件或目录的路径> <创建的软链接的名称>
tar
压缩或解压缩
tar [选项] [压缩包名称] [压缩文件名称...] #压缩
tar [选项] [压缩包名称] #解压缩
注意:压缩包名称要和压缩格式对应,-z:文件后缀.tar.gz,-j:.tar.bz

选项
-c:创建新的归档文件。
-x:提取归档文件中的内容。
-f <file>:指定归档文件的名称。
-v:显示详细的操作信息。
-z:通过 gzip 压缩/解压缩归档文件(使用 gzip 压缩)。
-j:通过 bzip2 压缩/解压缩归档文件(使用 bzip2 压缩)。
-t:显示归档文件中包含的文件列表。
-r:向归档文件中追加文件。
-u:仅将更新的文件添加到归档文件中。
-d:比较归档文件与磁盘上的文件,检查差异。
-A:从其他归档文件中添加文件。
-C <directory>:在指定目录中执行操作,而不是在当前目录中。

压缩
将~目录下所有的.txt文件压缩给txts.tar.gz文件中
tar -cvzf txts.tar.gz ~/*.txt

解压缩到当前目录
tar -zxvf txts.tar.gz
date
打印当前日期时间
date 
df
查看磁盘空间的使用情况

显示所有物理文件系统的使用情况,包括虚拟文件系统,如/proc、/sys
df -a

显示物理文件系统的文件格式类型
df -T

物理文件系统大小按兆字节为单位显示
df -h

物理文件系统大小按千字节为单位显示
df -k

vim编辑器

命令格式
vi  文件位置
vim 文件位置
vim的三种模式
  • 编辑模式

    打开文件之后的默认模式,可以执行特定的指令,如i, o, a,O等,如果按i表示,进入插入模式。在编辑模式下,按shift :进入命令行模式

  • 插入模式

    输入文件内容,按ESC退出插入模式,进入编辑模式

  • 命令行模式

    可以输入指令,回车执行,如x指令是保存并退出文件

编辑模式的指令
i  当前光标位置上开始插入内容
a  当前光标位置之后开始插入内容
o  在当前光标所在行的下方插入新的一行
O(shift+o) 在当前光标所在行的上方插入新的一行(空行)

dd 删除当前行。
yy 复制当前行。
p  粘贴剪贴板中的内容。
u  撤销上一次操作。
Ctrl+r  重做上一次撤销的操作

x  删除光标所在位置的内容
shift+^ 或 0  快速移动光标到行首
shift+$  快速移动光标到行尾
gg 快速移动光标到文档的开始位置
G  快速移动光标到文档的最后一行的首字符位置

shift+[  快速移动光标到段前
shift+]  快速移动光标到段尾

组合指令:
ggdG--清空文本
命令行的指令
:w  保存文件。
:q  退出 Vim 编辑器。
:q! 强制退出 Vim 编辑器,丢弃所有修改。
:wq 保存文件并退出 Vim 编辑器
:x  保存文件并退出 Vim 编辑器

:set number   显示行号
:set nonumber 取消显示行号
:set ff  查看文件的系统格式,dos,unix,mac
:set ff=unix
:set fileencoding 显示文件的内容编码格式,utf-8,unicode,gbk,gb2312
:set fileencoding=utf-8
:n  跳转到n行,如1,同nG,如编辑模式 7G == :7
:/  内容―从当前光标位置开始向下查找内容,会自动向上查找,按n向下查找下一个,按N向上查找上一个。

:%s/原内容/新内容/ig 全文档查找原内容,如果找到了则替换为新内容 , i表示不区分大小写(字
母), g 表示全文档(全局), 如果没有g表示,只替换每行的第一个匹配的内容

Makefile文件模板

用来编译项目的脚本文件

# 注意一定要在书写命令时,必须在命令开头敲一个Tab键,而不能说用8个空格(space)来代替Tab
# 这个模板,以后只需要更改文件名和链接文件夹即可!!!

# 根路径
ROOT := $(shell pwd)

# =================可修改==========================
# 添加链接编译文件的文件夹,有.c文件
SUBDIR := $(ROOT)
SUBDIR += $(ROOT)/func

# =================可修改==========================
# 生成可执行文件的文件名
TARGET := main
# TARGET := test1
# 保存过程编译文件的文件夹
OUTPUT := ./output


INCS := $(foreach dir,$(SUBDIR),-I$(dir))
SRCS := $(foreach dir,$(SUBDIR),$(wildcard $(dir)/*.c))
OBJS := $(patsubst $(ROOT)/%.c,$(OUTPUT)/%.o,$(SRCS))
# gcc 提供了强大的自动生成依赖,记录有依赖关系的 *.d 文件————不用手动为每个源文件添加头文件依赖,=======第一次不用更改,可以直接生成,后续要更改时需要自己改d即可减少编译
DEPS := $(patsubst %.o,%.d,$(OBJS))

# 开始编译
main : $(OBJS)
	@echo linking...
	@gcc $(OBJS) -o $(TARGET)
	@echo complete!

# 将过程文件都存放到output文件夹下
$(OUTPUT)/%.o : %.c
	@echo compile $<...
	@mkdir -p $(dir $@)
	@gcc -MMD -MP -c $(INCS) $< -o $@

# 删除过程文件
.PHONY : clean

clean:
	@echo try to clean...
	@rm -r $(OUTPUT)
	@echo complete!

-include $(DEPS)

c++

# 注意一定要在书写命令时,必须在命令开头敲一个Tab键,而不能使用4个空格(space)来代替Tab
# 这个模板,以后只需要更改文件名和链接文件夹即可!!!

# 根路径
ROOT := $(shell pwd)

# 添加链接编译文件的文件夹,有.cpp文件
SUBDIR := $(ROOT)
SUBDIR += $(ROOT)/func

# 生成文件名
TARGET := main
# TARGET := test1
# 保存生成文件的文件夹
OUTPUT := ./output

INCS := $(foreach dir,$(SUBDIR),-I$(dir))
SRCS := $(foreach dir,$(SUBDIR),$(wildcard $(dir)/*.cpp))
OBJS := $(patsubst $(ROOT)/%.cpp,$(OUTPUT)/%.o,$(SRCS))
# g++ 提供了强大的自动生成依赖,记录有依赖关系的 *.d 文件————不用手动为每个源文件添加头文件依赖
DEPS := $(patsubst %.o,%.d,$(OBJS))

# 开始编译
main : $(OBJS)
	@echo linking...
	@g++ $(OBJS) -o $(TARGET)
	@echo complete!

# 将过程文件都存放到output文件夹下
$(OUTPUT)/%.o : %.cpp
	@echo compile $<...
	@mkdir -p $(dir $@)
	@g++ -MMD -MP -c $(INCS) $< -o $@

# 删除过程文件
.PHONY : clean

clean:
	@echo try to clean...
	@rm -r $(OUTPUT)
	@echo complete!

-include $(DEPS)

gdb调试

  1. 编译时必须添加 -g 参数

    linux@ubuntu:~/23072/day9$ gcc -g scores.c -o scores1
    
  2. 打开调试工具

    指令

    gdb scores1
    

    结果

    linux@ubuntu:~/23072/day9$ gdb scores1
    GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
    Copyright (C) 2018 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law. Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-linux-gnu".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>.
    Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from scores1...done.
    (gdb)
    
  3. 调试命令

    b main //设置在main函数处 (breakpoint)
    b 20 //设置到20行
    r //(run)
    n //next 下一步 不进子函数
    s //step 什么函数都进(库函数也进) 想进子函数,看见子函数按s
    q //quit
    

main函数的参数

概念
int main(int argc, char *argv[])
  • argc(argument count):表示命令行参数的个数(包括程序名称本身)。
  • argv(argument vector):是一个指向字符指针数组的指针,每个指针指向一个表示命令行参数的字符串。
./my_program arg1 arg2 arg3
示例
  • 程序

    #include<stdio.h>
    
    /*
    main函数的参数说明
    */
    
    int main(int argc, char *argv[]){
        for (int i = 0; i < argc; i++)
        {
            printf("%s\n",argv[i]);
        }
        
        
        return 0;
    }
    
  • 结果

    执行命令

    ./a.out hh hello world
    

    生成结果

    ./a.out
    hh
    hello
    world
    

shell编程

快速入手

创建.sh文件

touch 1.sh

编写.sh文件

#!/bin/bash   
# 首行,告诉计算机使用指定的shell版本
echo "hello world"

修改文件的权限

chmod +x 1.sh

执行

./1.sh

基础知识

变量

用户自定义变量
# =两边不能有空格
NUM=12
FL=12.4
STR1="hello"

# 输出
echo "$NUM"
echo "$FL"
echo "$STR1"
位置参数

接受通过命令行传参

  • 2.sh文件

    #!/bin/bash
    echo "--$0"
    echo "--$1"
    echo "--$2"
    echo "--$3"
    
  • 命令行

    ./2.sh 1 2 3
    
  • 结果

    --./2.sh
    --1
    --2
    --3
    
预定义变量

$# 包含命令行参数的个数
$@ 包含所有命令行参数:“$1 $2 …$9
$* 包含所有命令行参数:”$1,$2…$9"
$$:包含正在执行进程的ID号
$? 包含前一个命令退出的状态

  • 3.sh

    #!/bin/bash
    #预定义变量
    echo ”参数个数--$#“
    echo ”所有命令行参数--$@“
    echo ”所有命令行参数--$*“
    echo ”正在执行进程的ID号--$$“
    
  • 命令行

    ./3.sh 1 2 3
    
  • 结果

    参数个数----------------3
    所有命令行参数------1 2 3
    所有命令行参数------1 2 3
    正在执行进程的ID号--6890
    
环境变量

当前工作环境

echo "$HOME"
echo "$PATH"

输入输出

# 输入
read -p "请输入2个整数: " NUM1 NUM2
# 输出
echo "NUM1=$NUM1 NUM2=NUM2"

运算符

算术运算命令 expr
  1. expr和变量之间,以及变量和符号之间必须加空格

  2. 将expr的结果给ADD必须使用

  3. *表示通配符 \*表示*本身

#!bin/bash
read -p "请输入两个整数
" NUM1 NUM2
# 反引号`命令`
ADD=`expr SNUM1 + SNUM2` 
MUL=`expr SUM1 \* $NUM2` # *表示通配符 \*表示*本身

echo "SNUM1 + SNUM2 = SADD"

test命令

测试是否相等命令

#!/bin/bash   

read -p "请输入一个字符串:" STR

# test STR = "h"
[ $STR = "h" ] #[]代替test,[后,]前,变量和符号之间必须加空格
echo $? # $?上一个命令退出的状态 0-真 1-假

# 执行结果:0
  1. 测试字符串

    s1 = s2 测试两个字符串的内容是否完全一样
    s1!= s2 测试两个字符串的内容是否有差异
    -z s1 测试s1字符串的长度是否为0
    -n s1 测试s1字符串的长度是否不为0
    
  2. 测试整数

    a -eq b 测试a与b相等 (equal)
    a -ne b 测试a与b不相等
    a -gt b 测试a是否大于b (great)
    a -ge b 测试a是否大于等于b
    a -lt b 测试a是否小于b
    a -le b 测试a是否小于等于b
    
  3. 测试文件

    -d name 测试name是否为一个目录
    -f name 测试name是否为普通文件
    -L name 测试name是否为符号链接
    -r name 测试name是否存在且可读
    -w name 测试name是否存在且可写
    -x name 测试name是否存在且为可执行
    -s name 测试name是否存在,且长度不为0
    f1 -nt f2 测试文件f1是否比文件f2更新
    f1 -ot f2 测试文件f1是否比文件f2更旧
    

结构化语句

选择

if

if [条件1为真]
# 或者 if ((条件1为真))
then
语句1
elif [条件2为真]
then
语句2
elif [条件3为真]
then
语句3
.....
else
语句n+1
fi
if (( year % 400 == 0 || (year % 4 == 0 && year % 100 != 0) ))

case

case 字符串变量 in
# 1|3|5|7
模式1|模式11|模式12)
语句1
;; #---->break
模式2)
语句2
;;
模式3)
语句3
;;
....
模式n)
语句n
;;
*)
语句n+1
;;
esac
循环

for

while

while [条件为真]
do
	语句
done

函数

定义
function 函数名()
{
函数体
}
调用
  • value_name=`function_name arg1 arg2`
    变量名=`函数名 参数1 参数2`
    #函数的所有标准输出都传递给了主程序的变量
    
  • function_name arg1 arg2
    函数名 参数1 参数2
    
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0eoJ3ZEg-1691403176330)(img/image-20230802092054763.png)]

综合项目

复制文件及文件夹

程序

#判断用户主目录下是否有file-dir或dir-dir目录
#遍历$HOME下file-dir dir-dir
for dir in $HOME/file-dir $HOME/dir-dir
do
	if [ -d $dir ] #判断该文件夹是否存在
	then #文件夹存在
		read -p "是否删除该目录" op
		case $op in
			Y|y|yes|Yes)
			rm -r $dir
			mkdir $dir
			;;
		N|n|NO|no|No)
			exit
			;;
		esac
	else #文件不存在
		mkdir $dir
	fi
done

fileCount=0
dirCount=0

read -p "请输入路径名:" dirname

flist=`ls $dirname` #显示文件夹中的文件和目录
#遍历该文件夹中的内容
for file in $flist
do
	if [ -d $dirname/$file ] #路径尽量绝对路径
	then
		cp -r $dirname$file $HOME/dir-dir #复制文件夹
		dirCount=`expr $dirCount + 1`

	elif [ -f $dirname/$file ]
	then
		#复制文件
		cp $dirname/$file $HOME/file-dir
		fileCount='expr $fileCount + 1
	fi


done

echo "文件的个数为$fileCount"
echo "目录的个数为$dirCount"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值