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 选项保证链接属性依然存在
用户相关的操作
用户相关的配置文件
- /etc/passwd:存储用户的详细信息
- /etc/group:存储已有的用户组的信息
- /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脚本
编程语言的分类
- 编译型语言:C、C++ 需要编译器
- 解释型语言: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中的整数算术运算
使用方法:
- (())几乎支持所有的C语言语法,还支持shell中幂运算**
- ((表达式1, 表达式2, 表达式2, ...)) 每个表达式都会执行,获取最右侧一个表达式的结果
- 想要获取运算结果,需要使用 $(()),还可以((变量名=表达式))
- 在(())中,使用变量,可以加$,也可以不加
- 在(())中,运算符两侧可以有空格
$[]
使用方法:
- 变量名=$[表达式1,表达式2,表达式3,·······]只获取最右侧表达式的结果
- 使用变量时,可以加$也可以不加$
- 运算符两侧可以加空格,也可以不加空格
- 仍然支持幂运算
- $[]的结果,建议直接按照"变量名=$[]"格式接收,因为$[]本质上,会遗留一个运算结果在表达式的位置,如果不接受继续向后运行指令会报错
expr
expr是一个终端指令
使用方法:
- expr 中使用变量,必须加$
- 如果想要接收expr的结果,必须使用命令置换符
- expr中运算符两侧必须有空格,不支持自增、自减和shell中幂运算
- expr中使用某些运算符是,需要转义|、>、
- expr指令的结果,可以直接回显到终端上,可以使用命令置换符接收
- expr操作数值不能为空
let
使用方法:
- let运算时,运算符两侧一定不能有空格
- let 变量名=表达式 ---> let和变量名中一定要有空格
- let运算时,可以加$,也可以不加
- 如果直接写成 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)