当前位置: 首页 > news >正文

【LinuxC高级】汇总

ls

ls -l:显示文件的详细信息

ls -a:显示隐藏文件

ls -lh:文件大小单位显示

ls -i:显示文件的inode号

 修改密码

passwd 用户名

su 用户名 -----> 用户名

su ----> 如果不加用户名,默认切换到超级用户

cd

cd 路径(可以是相对路径,也可以是绝对路径)

cd -----> 切换到当前用户的家目录

pwd 直接回显当前的绝对路径

新建文件/文件夹

touch 文件名 ----> 创建文件

touch 同名文件名 -----> 会更新时间戳

mkdir 目录名 ----> 创建目录名

mkdir 同名目录名 ----> 报错:文件已存在

cp/mv

cp 拷贝文件

cp 源文件的路径 目标文件的路径 (拷贝目录时需要再命令的后面加上 -r 选项)

mv 移动文件 (重命名)

mv 源文件的路径 目标文件的路径

rm

rm 文件名 ----> 删除文件

rmdir 目录名 -----> 删除空目录

rm -r 目录名 -----> 删除目录

 shell指令

1.用户、shell、内核、硬件之间的关系

用户在命令行提示符下键入命令文本,开始与Shell进行交互。

接着,Shell将用户的命令或按键转化成内核所能够理解的指令

控制操作系统做出响应,直到控制相关硬件设备。

然后,Shell将输出结果通过Shell提交给用户。

 文件相关的操作

head

head 文件名 -----> 回显文件的前十行内容到终端

head -n 文件名 -----> 回显文件的前n行内容

tail

tail 文件名 ------> 回显文件的后10行内容到终端

tail -n 文件名 ------> 回显文件的后n行内容

| 管道符

将前一个命令的输出结果作为后一个命令的输入

shell指令1 | shell指令2

wc(word count)

wc 文件名 ---> 回显文件行数、单词数、字符个数

wc -l 文件名 ---> 回显文件行数

wc -w 文件名 ---> 回显文件中单词的个数

wc -c 文件名 ---> 回显文件中字符的个数

通配符

通配符

含义

*

匹配一个或多个字符

?

匹配一个字符

[...]

匹配其中指定的一个字符

[-]

匹配指定一个字符范围

[^...]

除了其中指定的字符都可以

[[:lower:]]

匹配所有小写字母

[[:upper:]]

匹配所有大写字

 find

常用文件名来查找文件

find 指定路径 -name 文件名

用于模糊查找文件(当文件数量比较多时)

find 指定路径 -name *.c ---> 查找 指定路径下 所有的 .c 结尾文件

涉及*,存在转义问题,如果查找结果不对,就加上 \ -----> find 指定路径 -name \*.c

如果加上*导致报错,就直接使用

file *

file 文件名 ---> 显示文件的信息

file a.out

a.out: 文件名

ELF:类型

64-bit LSB shared object:小端存储

x86-64:64位操作系统

version 1 (SYSV):版本

dynamically linked, interpreter /lib64/l:动态链接的库

for GNU/Linux 3.2.0:gcc 编译器的版本 BuildID[sha1]=d0331b1eef2ecb7710b847e23849e40b98b323d9:动态ID

not stripped:文件没有被压缩,arm课程会讲到

grep

grep按照字符串查找内容

grep "要查找的字符串" 要查找的路径

-n:回显查找到字符串的行数

-R:查找的路径可以是目录,-R会进行递归查找

-i:不区分大小写的查找

-w:按单词查找关键字

查找以ubuntu开头的一行内容

grep "^ubuntu" /etc/passwd -n

查找hello.c中以;结尾的一行

grep ";$" hello.c

cut

cut -d "分隔符" -f "要截取的区域" 文件名

-d: 自定义分隔符,默认为制表符\t

-f: 与-d一起使用,指定截取哪个区域

grep root /etc/passwd -wn | cut -d ":" -f "1,8" ---> ("1,8" 截取第1个和第8个区域)

 压缩和解压缩

三种压缩工具:gz、bz2、xz

压缩: gzip 要压缩的文件名 ---> 自动生成.gz后缀的压缩文件

bzip2 要压缩的文件名 ---> 自动生成.bz2后缀的压缩文件

xz 要压缩的文件名 ---> 自动生成.xz后缀的压缩文件

特点:

1. 只能对单个的普通文件进行压缩

2. 不能进行归档,压缩后或解压后源文件都不存在

解压: 指定后缀的文件,需要用相同的压缩工具进行解压

gunzip 要解压的文件名

bunzip2 要解压的文件名

unxz 要解压的文件名

三种压缩工具的对比

压缩效率:xz > bz2 > gz

压缩时间:xz > bz2 > gz

gz用于临时的传输,xz用于文件的长期存储

打包并压缩和拆包解压

zip

压缩:

zip 命令用于将一个文件或多个文件压缩成单一的压缩文件 .zip

zip 压缩文件名 要压缩的文件列表

注意:

        a. 具有归档动能,并进行压缩

        b. 可以压缩文件夹,后缀 .zip,压缩文件夹需要加 -r

        c. 压缩或解压后源文件依然存在

解压:

unzip 要解压的压缩文件

tar

打包并压缩

选项:

-x:释放归档文件

-c:创建一个新的归档文件

-v:显示归档和释放的过程信息

-f:用户指定归档文件的文件名,否则使用默认名称 后跟文件名

tar -cvf 打包后生成的文件名.tar 要打包的文件列表

tar 指令已然依赖,压缩工具完成压缩:

-j:由 tar 生成归档,然后由 bzip2 压缩 .bz2

-z:由 tar 生成归档,然后由 gzip 压缩 .gz

-J:由 tar 生成归档,然后由 xz 压缩 .xz

tar -cvjf xxx.tar.bz2 要压缩的文件列表

tar -cvzf xxx.tar.gz 要压缩的文件列表

tar -cvJf xxx.tar.xz 要压缩的文件列表

拆包解压

如何拆包

tar -xvf 要拆包的文件

如何拆包并解压

仍然可以使用压缩工具的参数进行解压缩

tar -xvjf xx.tar.bz2

tar -xvzf xx.tar.gz

tar -xvJf xx.tar.xz

文件权限相关的操作

chgrp ----> 修改文件的所属组

 sudo chgrp 新的组名 文件名

chown ---> 修改文件的所属用户

sudo chown root xxx ---> 将xxx文件的所属用户改为root用户

sudo chown root: xxx ---> 将xxx文件的所属用户和所属组改为root用户

sudo chown :ubuntu xxx ---> 将xxx文件的所属组改为ubuntu

sudo chown ubuntu:root xxx ---> 将xxx文件的所属用户改为ubuntu,将xxx所属组改为root

链接文件的创建

硬链接文件

ln 被链接的文件(源文件) 生成的链接文件名(新文件)

(可以使用绝对路径,也可以使用相对路径)

硬链接文件的注意事项:

1. 硬链接文件和源文件拥有相同的inode号

2. 一个文件修改,另一个文件也会跟着发生修改

3. 删除源文件/链接文件,链接文件/源文件不受影响仍然存在,文件硬链接个数为0时才会被删除

4. 删除掉源文件后,即使创建一个和源文件同名的文件,也和硬链接文件之间不存在链接关系

5. 硬链接文件的文件类型是-,就是一个普通文件

6. 目录不能创佳绩硬链接

7. 和源文件是同一文件

 软链接文件

ln -s 被链接的文件(源文件) 生成链接的文件名(新文件)

软链接文件的注意事项:

1. 和源文件是两个不同的文件

2. 文件类型是l

3. 创建时一般使用绝对路径

4. 一个文件修改,另一个文件也会跟着发生修改

5. 如果源文件被删除,软链接文件会失效,在之前的位置创建一个同名的源文件软链接文件会重新生效

6. 在软链接文件失效的情况下,vim打开文件并保存退出,实际上是新创建了一份源文件保存并退出

7. 软链接文件可以链接目录

8. 拷贝目录的软链接可以拷贝,如果需要拷贝普通文件的软链接文件,需要加上 -d 选项保证链接属性依然存在

 用户相关的操作

 用户相关的配置文件

  1. /etc/passwd:存储用户的详细信息
  2. /etc/group:存储已有的用户组的信息
  3. /etc/shadow:存储用户密码

用户相关的指令

whoami ---> 查看当前用户

id -u ---> 查看当前用户的uid,选项后面不加用户名,默认查看当前登录用户的信息

id -u root ---> 查看指定的root用户的信息

id -g ---> 查看当前用户gid(组id)

id ---> 查看当前用户的信息

新建用户

sudo adduser 用户名 (新建用户必须使用sudo权限)

创建新用户时,会默认创建一个新用户同名的组并将新用户添加到该组中

sudo addgroup -g 组用户名 添加组用户(可以通过/etc/group查看组是否添加成功)

删除用户

sudo deluser 用户名 ---> 删除用户,但是不会删除用户的目录(残留目录可以直接使用rm -r 删除)

sudo userdel -r 用户名 ---> 删除用户的同时,删除用户的目录

sudo deluser --remove-home 用户名

开关机相关的操作

关机

sudo shutdown ---> 立即关机

sudo shutdown 时间 ---> 定时关机

sudo shutdown +10 ---> 在10分钟后关机

重启

sudo reboot ---> 立即重启

sudo shutdown -r ---> 立即重启

sudo shutdown -r 时间 ---> 定时重启

sudo shutdown -r +10 ---> 在10分钟后重启

磁盘相关的操作

查看U盘是否链接成功

ls /dev/sd*

如果终端回显包含除了ada外的其他内容,说明U盘链接并识别

所有sda开头的全部都是ubuntu镜像 自己的空间

对磁盘分区

查看磁盘使用率

df -h

如果U盘刚连入虚拟机,就可以使用df -h指令查找到,说明U盘被自动挂载

磁盘分区

需要使用到 fdisk 工具

sudo apt-get install fdisk (没有就下载软件)

sudo fdisk /dev/sdb ---> 要对整个磁盘进行分区

m:显示提示

p:打印已有的内存分区

n:新建分区

d:删除分区

q:不保存退出

w:写入磁盘并退出

格式化

格式化操作,一般是对具体分区的格式化

sudo mkfs.文件系统类型 分区名

sudo mkfs.ntfs /dev/sdb1

格式化错误:

说明分区已经被挂载(使用状态),需要取消挂载

sudo umount /dev/sdb1

挂载

sudo mount 要挂载的分区名 要挂载的目录

sudo umount 要取消挂载的分区

sudo umount 要取消的挂载点(挂载目录) ---->如果U盘是自动挂载到Linux中使用挂载点取消挂载有时会失效

sudo mount /dev/sdb1 /home/ubuntu/udisk

shell脚本

编程语言的分类

  1. 编译型语言:C、C++ 需要编译器
  2. 解释型语言:shell、python 需要解析器

操作系统架构

应用层:app、代码、shell命令

                    |                         |shell解析器

                C库                         |

                                 |

——————————————系统调用—————————————————————— 内核层:五大功能

        内存管理

        文件管理

        设备管理

        网络管理

        进程管理 ———————————————————————————————————————————— 硬件层:鼠标、键盘

shell ----> 贝壳

起到保护内核的作用,将内核和用户隔离开来

第一个shell脚本

#!/bin/bash ##说明使用的shell解析器

echo hello world #输出hello world

#在shell中表示注释

echo打印指令,将hello world输出

#! ------>用于指明该脚本默认使用的shell解析器

执行脚本的三种方式

bash 文件名

通过shell解析器,直接解析脚本,bash即是解析器

bash shell.sh

执行过程:

        在后台打开一个终端,在后台执行指令,将结果返回给当前终端

直接运行脚本

需要给脚本文件添加可执行文件

chmod 777 shell.sh         执行:./shell.sh

 source 脚本名

 不需要给脚本添加可执行权限

source 脚本名

执行过程:

        执行脚本和返回结果都在当前终端

shell中的变量

shell中的格式

变量名=变量的值

变量名='变量的值' ---> 用于变量的值中间有空格

变量名="变量的值" ---> 用于使用已有变量的值和空格拼接给新变量赋值时(只要需要用已有变量的值都建议加"")

HELLO=hello

WORLD="$HELLO world"

=两侧不能有空格

' '内不能使用$展开变量的值

 如何访问变量

$变量名 ---> 获取变量的值

${变量名} ---> 获取变量的值,为了更好区分变量名的范围

修饰变量的关键字

readonly :只读变量,只不能更改

unset :清空变量的值,不能清空

readonly修饰变量的值 local :定义局部变量,只能在函数中使用

 外部传参/位置变量

$0 ---> 执行的脚本名

$1-$9

$n ---> n >= 10,必须加上{}

${10}-${n}

$# ---> 获取所有外部参数的个数(不包括脚本名)

$* 或者 $@ ---> 获取所有的外部参数(不包含脚本名)

输出

echo 输出内容(将内容回显到终端,并自动换行)

echo默认不解析转义字符

echo -n 输出内容 ------>取消echo输出时的换行

echo -e "hello\n" ------->解析转义字符

输入

read 变量名 ---> 直接加变量名即可

read -p "提示信息" 变量名 ---> 在终端给用户输入提示信息

read -s 变量名 ---> 输入的信息不回显

read -t 秒数 变量名 ---> 如果用户n秒不输入,就结束输入并向后执行语句

read -n 个数 变量名 ---> 如果输入n个字符,输入自动停止

命令置换符

1. `指令` (反引号)

2. $(指令)

shell中的运算

(())

常用于shell中的整数算术运算

使用方法:

  1. (())几乎支持所有的C语言语法,还支持shell中幂运算**
  2. ((表达式1, 表达式2, 表达式2, ...)) 每个表达式都会执行,获取最右侧一个表达式的结果
  3. 想要获取运算结果,需要使用 $(()),还可以((变量名=表达式))
  4. 在(())中,使用变量,可以加$,也可以不加
  5. 在(())中,运算符两侧可以有空格

$[]

使用方法:

  1. 变量名=$[表达式1,表达式2,表达式3,·······]只获取最右侧表达式的结果
  2. 使用变量时,可以加$也可以不加$
  3. 运算符两侧可以加空格,也可以不加空格
  4. 仍然支持幂运算
  5. $[]的结果,建议直接按照"变量名=$[]"格式接收,因为$[]本质上,会遗留一个运算结果在表达式的位置,如果不接受继续向后运行指令会报错

expr

expr是一个终端指令

使用方法:

  1. expr 中使用变量,必须加$
  2. 如果想要接收expr的结果,必须使用命令置换符
  3. expr中运算符两侧必须有空格,不支持自增、自减和shell中幂运算
  4. expr中使用某些运算符是,需要转义|、>、
  5. expr指令的结果,可以直接回显到终端上,可以使用命令置换符接收
  6. expr操作数值不能为空

 let

 

使用方法:

  1. let运算时,运算符两侧一定不能有空格
  2. let 变量名=表达式 ---> let和变量名中一定要有空格
  3. let运算时,可以加$,也可以不加
  4. 如果直接写成 let 表达式,表达式会运行,但是没有办法接收

 shell中的数组

定义

c语言中的数组

int arr[32];

int arr[] = {};

int arr[3] = {1, 2, 3};

shell中的数组

数组名=(val1 val2 val3 ...)

# shell中的数组,不需要写出数组长度

# shell中的数组初始化时,直接使用()

# shell中的数组每个元素之间是空格,不是逗号

# 访问仍然需要通过下标,下标从0开始

采用键值对的方式赋值

数组名=([下标值]=val1 [下标值]=val2 ...)

arr=([9]=1 [0]=4 ...) 下标可以不连续

采用列表名的方式赋值

列表名="val1 val2 val3 ..."

数组名=($列表名)

通过分别定义数组变量的方式赋值

数组名[0]="val1"

数组名[1]="val2"

访问数组中的元素

只要在shell中需要使用变量的值,都需要用 $ 进行访问

${数组名[下标]} ---> 获取数组中指定下标的元素值

获取数组中所有元素

${数组名[*]} ---> 获取数组中的所有元素

${数组名[@]} ---> 获取数组中的所有元素

获取数组中元素的个数

${#数组名[*]} ---> 获取数组中元素的个数

${#数组名[下标]} ---> 获取数组中指定下标元素的长度(字符个数)

对数组元素重新赋值

数组名[下标]=新值

稀疏数组

使用已有的数组给新的数组赋值

arr=(1 2 3 4 5)

arr1=(a b c d)

arr2=(${arr[*]} ${arr1[*]}) # 拼接加空格

echo ${arr2[*]}

echo ${#arr2[*]} # 9

if分支结构

if对整数进行判断

if对字符串进行判断

if对文件的判断

case...in分支结构

while循环结构

for循环结构

select..in语句

辅助控制关键字

 shell中的函数

 

Makefile

Makefile文件由:规则、变量、条件编译、函数构成

规则的构成

 Makefile中的变量

预定义变量

 引入自动变量和通配符

伪目标

在Makefile中,有些目标并不需要生成文件,也没有文件依赖,往往把这样的目标定义为伪目标,为了防止,因为存在和目标同名的文件而不能执行目标的情况发生。

直接将目标定义为伪目标.PHONY

.PHONY:目标

引入函数

 wildcard

功能:根据给定的条件,获取指定的文件名(找文件名的功能)

$(wildcard 指定字符串的格式)

$(wildcard *.c) ---> 找到当前路径下,所有.c文件的文件名

patsubst

功能:模式匹配替换字符串

$(patsubst 源格式,目标格式,要替换的字符串)······

$(patsubst %.c,%.o,main.c add.c) ---> 获取到 main.c add.c字符串,根据模式匹配,得到 main.o add.o 字符串

每一个参数之间以逗号作为分隔,要替换的字符串之间以空格作为分隔

 Makefile文件

EXE=main

FILES=$(wildcard *.c)

OBJS=$(patsubst %.c,%.o, $(FILES))

CC=gcc

CFLAGS=-c -g -Wall -o

all:$(EXE)

$(EXE):$(OBJS)

        $(CC) $^ -o $(EXE)

%.o:%.c

        $(CC) $(CFLAGS) $@ $<

.PHONY:clean

clean:

        $(RM) $(OBJS) $(EXE)


http://www.mrgr.cn/news/35435.html

相关文章:

  • 【Linux】多线程:线程池的创建、日志类、RAII互斥锁、单例模式:饿汉方式与懒汉方式
  • 【Java】内部类【主线学习笔记】
  • 【微服务即时通讯系统】——etcd一致性键值存储系统,etcd的介绍,etcd的安装,etcd使用和功能测试
  • 【爬虫】PlayWright使用说明
  • 38.重复的子字符串
  • AI大模型行业应用:企业如何走出一条智能化蜕变之路?
  • 【字符串】介绍
  • 关于YOLOX的一些优势
  • java是干什么的
  • keepalived+lvs集群
  • 屏幕演示工具 | 水豚鼠标助手 v1.0.7
  • 828华为云征文|华为云Flexus X实例:极速搭建个人代码仓库GitLab平台
  • 6种常见位运算符+异或运算符的使用(加密、解密)
  • Liblib:简化开发的强大工具
  • LED驱动电路
  • 编译和链接
  • linux网络编程7
  • 进度条QProgressBar
  • 数电学习基础(逻辑门电路+)
  • 失踪人口回归(明天开始继续更新学习内容)