文章目录
-
- Shell
-
-
-
- echo
- 一般变量
- 特殊的Shell变量
- shell脚本
- for语句
- until语句
- if语句
- while语句
- 函数
- test命令
-
-
- GCC
-
-
- GCC编译流程
- 简单示例
- GDB
- Make和Makefile
-
- Vim
-
-
- 注意
- 基本命令
- 命令图
-
- 特殊字符
-
-
-
- 管道符 `|`
- 多命令执行符 `;`
-
-
- 命令
-
-
-
- apt
- useradd [参数] 用户名
- usermod [参数] 用户名
- who
- id
- umask [-S] (权限掩码)
- ls [参数] (正则表达式)
- chmod [选项] [文件或目录]
- which [命令]
- export [参数]
- fdisk [选项] [设备]
- mkfs
- mout [参数]
- df [参数] [指定文件]
- source [指定文件]
- pwd
- wc [选项] [文件]
- eval
- exec
- stat
- netstat
- fflush
- kill [参数]
-
-
- 文件
-
-
-
- /etc/passwd
- /etc/profile
- /etc/fstab
-
-
- 额外
-
-
- 禁止root用户
- 进程
- 环境变量
- 忘记密码
- 进程间通信
- 文件系统
-
在初学Linux推荐两种方法:
-
去相关社区,网上查询网站学习交流,我推荐两个:
Linux快速工具教程 — Linux Tools Quick Tutorial (linuxtools-rst.readthedocs.io)
Linux命令大全(手册) – 真正好用的Linux命令在线查询网站 (linuxcool.com)
-
使用
man 命令查看帮助文档
Shell
echo
输出字符串或提取Shell变量的值
$变量 :提取变量值
echo $PATH :提取PATH并输出环境变量

$?:最后一次提取Shell命令的返回值(退出状态)
0表示没有错误,其他表示没有错误
一般变量
Linux下变量不需要声明,一般做字符串处理,数值计算转换为数字
- 创建或修改变量:
变量名=变量值(中间不能有空间) - 只读属性变量:
readonly 变量名 - 显式变量值:
echo $变量名 - 删除变量:
unset 变量名 - 导出变量名:
export 变量名
特殊的Shell变量
$!:后台运行的最后一个过程ID号
$@:与$*同样,但在使用时添加引号,并将每个参数返回到引号中。所有参数分解为包含多个字符串的数组
$#:传递给脚本或函数的参数个数
$$:执行本脚本程序PID值
$*:所有参数组合成的字符串
$?:上一句话的返回值
$0:脚本程序本身的名称( 命令行名称 )
$1、$2、$3:第一、二、三个参数传递给脚本或函数
编写一个shell脚本:
#!/bin/bash if [ $# -gt 1 ]; then echo "\$0程序名称:$0,\$第一个参数是:$1" echo "\$第二个参数是:$2,\$*所有参数组合的字符串:$*" else echo "you need input beyond 2 pram" fi echo "\$$程序运行的PID值:$$" 分别用./specialshell.sh和source specialshell.sh执行脚本,结果:
shell脚本
创建一个当前目录test.sh, 加入:
#!/bin/bash for x in apple banna cake fruits
do
echo "I love eat $x"
sleep 1
done
执行 source test.sh
for语句
for var in list
do
statements
done
until语句
until [expression]
do
statements
done
if语句
if [expression];
then
statements
elif [expression];
then
statements
else
statements
fi
while语句
while expression
do
statements
done
函数
function 函数名()
{
statements
}
test命令
用来做字符串比较、数值比较、文件测试、逻辑操作符。
字符串比较
| 符号 | 含义 |
|---|---|
| = | 比较两个字符串是否相等。如:test “1” = “2” |
| != | 比较两个字符串是否不等 |
| -n | 检查字符串长度是否大于0。如:test -n “” |
| -z | 检查字符串长度是否等于0 |
数值比较
| 符号 | 含义 |
|---|---|
| -eq | 比较两个数值是否相等 |
| -ge | 比较前者是否大于等于后者 |
| -le | 比较后者是否大于等于前者 |
| -ne | 比较两个数值是否不等 |
| -gt | 比较前者是否大于后者 |
| -lt | 比较前者是否小于后者 |
文件测试
| 符号 | 含义 |
|---|---|
| -d | 检查是否是一个目录。如:test -d .inputrc |
| -f | 检查是否是一个文件 |
| -e | 检查文件名或者目录名是否存在 |
| -r | 检查对此文件是否有"读"权限 |
| -s | 检查文件长度是否大于0 |
| -w | 检查对此文件是否有"写"权限 |
| -x | 检查对此文件是否有"执行"权限 |
逻辑操作
| 符号 | 含义 |
|---|---|
| ! | 逻辑非(NOT)。如:test ! 1 -lt 2 |
| -a | 逻辑与(AND)。如:test 1 -lt 2 -a 2 -gt 3 |
| -o | 逻辑或(OR)。如:test 1 -lt 2 -o 2 -lt 3 |
GCC
GCC是流行的、多种语言的、自由的、跨平台的编译器
GCC编译流程
GCC将源代码便以为可执行程序的流程
- 预处理(Preproccessing)
- 编译(Compilation)
- 汇编(Assemble)
- 链接(Linking)
图片来源:GCC and Make - A Tutorial on how to compile, link and build C/C++ applications (ntu.edu.sg)
简单示例
gcc hello.c -o hello
这是一步到位的编译指令,过程经历 :
最后生成 hello 可执行文件
常用参数
-
缺省值:默认输出a.out可执行文件 -
-v:查看GCC编译的详细信息 -
-std:指定标准 -
-o:指定输出文件的名称,缺省时输出a.out文件 -
-Wall:输出所有警告信息 -
-c:直将源文件编译为object文件(.o),而不进行链接,之后可用gcc -o 可执行文件名称 out1.o out2.o out3.o链接为可执行文件。 -
-g:生成调试信息 -
-O0:不进行优化处理 -
-O或-O1:进行优化处理 -
-O2和-O3:-O2比O1更进一步优化,-O3比-O2更进一步优化 -
-static:禁止共享链接 -
-shared:编译为共享库(*.dll,.so)。 -
-fPIC:产生与位置无关代码(Position-Independent Code) -
-E:编译为预处理文件(后缀名为 .i 的文件) -
-S:编译为汇编代码(后缀名为 .s 的文件) -
更多查看官方:GCC online documentation - GNU Project
使用例子
# 静态链接
pi@raspberrypi:~ $ gcc -c mysum.c # 编译mysum.c生成 mysum.o文件
pi@raspberrypi:~ $ ar rcs libsum.a mysum.o # 为mysum.o创建静态链接库
# 从源文件生成动态链接库
pi@raspberrypi:~ $ gcc main.c libfunc.so -o a.out
# 动态链接
pi@raspberrypi:~ $ gcc -fPIC -shared func.c -o libfunc.so
# 从源文件生成动态链接库libfunc.so,-fPIC -c将.c源文件编译成.o文件,-shared将.o生成动态链接库.so文件
pi@raspberrypi:~ $ gcc main.c libfunc.so -o main
# 将 libfunc.so 链接到可执行文件。当 main 文件运行时,会动态地加载链接库 libfunc.so
参考:gcc 编译过程 - 超超酱 - 博客园 (cnblogs.com)
GDB
Make和Makefile
make 是一个程序,它按顺序读取 Makefile 和 makefile ,以自动选择执行编译链接。Makefile(makefile) 支持多线程并发操作make 命令只会编译我们修改过的文件,没有修改的文件不用重新编译。Makefile(makefile) 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令。
Makefile格式
| 目标项 | 依赖项列表 |
|---|---|
| target: | file1 file2 file3 … fileN |
| 规则 | |
| command1 | |
| command2 | |
| other command |
- 目标项:欲生成的目标文件
- 依赖项列表:生成目标项所需要的文件
- :判断目标项是否存在,如果不存在或者与依赖项有不同的地方,则执行命令
- 过程:如果没有在make命令中指定目标项,则从第一个目标项开始,递归地检查规则
一个简单的Makefile示例
# makefile
myt: type.h t.c mysum.c # target: 依赖项列表
gcc -o myt t.c mysum.c # 规则:以 <tab> 开头,后接要执行的命令
# Shell
pi@raspberrypi:~ $ make -f makefile # makefile与自命名的makefile对应,若当前目录只有一个makefile只需要make即可
复杂点的Makefile
# 宏定义
CC = GCC
CFLAGS = -Wall
OBJS = t.o mysum.o
INCLUDE = -Ipath
all: myt install
myt: t.o mysum.o
$(CC) $(CFLAGS) -o myt $(OBJS) $(INCLUDE)
t.o: t.c type.h
$(CC) -c t.c
mysum.o: mysum.c type.h
gcc -c mysum.c
install: myt
echo "install myt to /usr/local/bin"
sudo mv myt /usr/local/bin/
run: install
echo "run executable image myt"
myt || /bin/true
clean:
rm -f *.o 2> /dev/null
sudo rm-f /usr/local/bin/myt
Vim
vi/vim有三种状态,分别是命令模式(Command Mode)、插入模式(Insert Mode)和底行模式(Last Line Mode),功能如:
-
命令模式
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入插入模式下,或者进入底行模式
-
插入模式
文字输入文件,按「ESC」回到命令行模式
-
底行模式
将文件保存或退出vi,也可以设置编辑环境,如寻找字符串、列出行号…等
注意
- 当用vi/vim 打开文件时,首先处于 ,需要按 「i」进入 才能编辑文字。
基本命令
dd:删除光标所在行u:回滚操作ctrl+d:滚动当前页往下走ctrl+u:滚动当前页往上走nG:跳转到指定第n行,比如100G就是跳转到第100行0:移到当前行的开头G:移动到文章的最后fn+↑:滚动当前页往上走fn+↓:滚动当前页往下走fn+←:跑到当前行首fn+→:跑到当前行尾
:w:保存文件(加上 ! 为强制保存,:w!):q:退出文件(加上 ! 为强制退出,:q!):wq:强制保存退出文件:set nu:显示行号:set nonu:取消显示行号:n:跳转到第n行,比如:15跳转到底15行:/搜索内容:向前搜索内容,比如/hello,在当前文件里面搜索hello内容,默认跳转到第一个,按n键跳转到下一个:?搜索内容:向后搜索内容
命令图
特殊字符
管道符 |
管道的特点:
- 单向(前一个的输出是后一个的输入)
- 数据是FIFO的
- 大小限制为4K
管道分为 和 两种:
-
普通管道
供具有亲缘关系的进程间通信(没有名字,只有文件描述符)
-
命名管道
对应磁盘上的文件,进程只要知道文件名就可以使用此管道。
在Shell中创建 :
mknod 管道名 p
mkfifo -m 权限位 管道名
删除命名管道 :unlink
多命令执行符 ;
ls -la; echo "我是你爸"
set | wc -l; ls -la | grep bash
命令
apt
与apt相关的文件
| 文件位置 | 作用 |
|---|---|
| /etc/apt/sources.list | 设置软件包的获取来源 |
| /etc/apt/apt.conf.d/ | apt的各种配置文件 |
| /var/chache/apt/archives/ | 存放已经下载的软件包 |
| /var/chache/apt/archves/partial | 存放正在下载的软件包 |
| /var/lib/apt/lists/ | 存放已经下载的软件包的详细信息 |
| /var/lib/apt/lists/partial/ | 存放正在下载的软件包的详细信息 |
相关的子命令
| 子命令 | 作用 |
|---|---|
| update | 更新软件包列表 |
| upgrade | 更新系统中所有的软件包 |
| install | 安装软件包 |
| remove | 卸载软件包 |
| autoremove | 仅删除不需要再次下载的软件包 |
| purge | 彻底删除软件包(包括配置文件) |
| source | 下载源代码 |
| build-dep | 自动下载安装编译某个软件说需要的软件包 |
| dist-upgrade | 升级整个发行版 |
| clean | 删除本地缓存中所有的升级包 |
| autoclean | 删除本地缓存中无用的软件包 |
| check | 检查是否存在有问题的依赖 |
useradd [参数] 用户名
新建一个用户
| 参数 | 作用 |
|---|---|
| -D | 改变新建用户的预设值 |
| -c | 添加备注文字 |
| -d | 新用户每次登录时所使用的家目录 |
| -e | 用户终止日期,格式为YYYY-MM-DD |
| -f | 用户过期几日后永久停权。当值为0时用户立即被停权,而值为-1时则关闭此功能,预设值为-1 |
| -g | 指定用户对应的用户组 |
| -G | 定义此用户为多个不同组的成员 |
| -m | 用户目录不存在时自动创建 |
| -M | 不建立用户家目录,优先于/etc/login.defs文件设定 |
| -n | 取消建立以用户名称为名的群组 |
| -r | 建立系统账号 |
| -u | 指定用户id |
仅仅只是用useradd 用户名这个命令不能创建一个可以登录使用的用户,/home目录下没有对应的用户,也创建不了密码。
需要用useradd -m 用户名创建一个可登录的,可以创建密码的用户。创建后可以在etc目录下的passwd添加这个新用户的相关信息。
添加新用户www:
[root@www ~]# useradd www
不创建家目录,并且禁止登陆:
[root@www ~]# useradd -M -s /sbin/nologin www
添加新用户www,指定UID为666,指定shell类型为/bin/bash,指定归属用户组为root,cool成员:
[root@www ~]# useradd -u 666 -s /bin/bash -G root,cool www
添加新用户www,设置家目录为/tmp/www,用户过期时间为2030/01/01.过期后两天停权:
[root@www ~]# useradd -e "2030/01/01" -f 2 -d /tmp/www www
此外,新增的用户不具有sudo权限,需要手动在/etc/sudoer增加新用户权限
| 选项 | 说明 |
|---|---|
| user ALL=(ALL) ALL | 允许用户user执行sudo命令(需要输入密码). |
| %user ALL=(ALL) ALL | 允许用户组user里面的用户执行sudo命令(需要输入密码). |
| user ALL=(ALL) NOPASSWD: ALL | 允许用户user执行sudo命令,并且在执行的时候不输入密码. |
| %user ALL=(ALL) NOPASSWD: ALL | ALL=(ALL)允许用户组user里面的用户执行sudo命令,并且在执行的时候不输入密码. |
更多信息查看文档 man useradd
usermod [参数] 用户名
改变用户的信息。其中参数选项的作用与 useradd 类似。
who
产看当前shell用户
id
查看当前用户的身份以及权限
umask [-S] (权限掩码)
新建初始化文件的权限掩码
umask #获取当前权限掩码
umask -S #获取当前权限的可读权限信息
umask 0000 #修改新建初始化目录文件的权限
666& umask
新建初始化目录的权限
777& umask
ls [参数] (正则表达式)
文件的分类
普通文件 - , 目录文件 d , (软)链接文件 l , 字符设备文件 c , 块设备文件 b , 管道文件 p
目录不是目录,是一种目录文件
目录
- r: 可以ls目录中的内容
- w: 可以删除增加目录文件
- x: 可以cd进入这个目录
文件
- r:read 可读
- w:write 可写
- x:增删
- r:可运行
ls -ld /etc : 查看目录拥有权限
chmod [选项] [文件或目录]
赋予文件或目录权限
chmod u=wx etc :赋予etc目录 w:增删 和 x:进入 的权限
chmod u-r etc :删去etc目录 r:可ls 的权限
其中还可以用三位十进制数表示不同权限
r :含义为 “可读”,用数字 4 表示 w:含义为 “可写”用数字 2 表示 x:含义为“可执行”用数字 1 表示 -:含义为“无权限”用数字0 表示
| 所有者 | 群组 | 其他 | 三位代表权限的数字 |
|---|---|---|---|
| rwx | rwx | rwx | 实际结果 |
| 421 | 421 | 421 | 777 |
| 421 | 401 | 401 | 705 |
chmod 777 a.out
#777给auth.log文件赋予任何可读,可写,可执行权限
chmod 755 a.out
#755代表用户对该文件拥有读,写,执行的权限,同组和其它用户有读和执行权限,没有写权限
which [命令]
查看命令的安装路径
export [参数]
将shell变量/函数输出为环境变量
-p :列出所有shell赋予程序的环境变量
-n :删除指定变量
定义环境变量:# export MYENV
赋值:# export MYENV=1111
fdisk [选项] [设备]
操纵磁盘分区表
-l:列出所有分区表
mkfs
mkfs(make file system)用于在特定分区上建立文件系统(格式化)
-V:启用详细显示模式-t:设定文件系统类型,默认为ext2-c:检查分区时候有坏轨
在/dev/sda5 上建一个msdos的文件系统,同时检查是否有坏轨,并把详细过程列出
mkfs -t msdos -c -V /dev/sda5
mout [参数]
挂载文件系统
挂载:是指由操作系统使一个
存储设备(如硬盘、CD-ROM或共享资源)上的计算机文件或目录可供用户通过计算机的文件系统访问的一个过程。引自——挂载_百度百科 (baidu.com)
当访问挂载点的时候,系统就知道要用哪些数据组织形式访问哪些类型的文件系统(或者说是哪些物理设备)。
作用:将一个具体存储设备上的具体文件系统和操作系统中对应的文件系统驱动(模块)关联起来,并将这个具体文件系统中的文件和目录关系挂载到全局目录树上,形成一个“激活运行状态”的文件系统。
引自——https://www.zhihu.com/answer/2437952746
将/dev/sdb1分区挂载到/wg目录上的命令:mount /dev/sdb1 /wg
umount实现文件系统的卸载
卸载/wg上的文件系统的命令:umount /wg
df [参数] [指定文件]
显示磁盘空间使用情况
-a :显示所有系统文件
-h :以易于human的阅读方式显示
-l :只显示本地文件
source [指定文件]
source命令通常用于执行刚修改的 初始化 文件,使之立即生效,不用注销重新登陆?
pwd
打印当前工作目录(print working directory)
wc [选项] [文件]
计算字数命令
| 选项 | 功能 |
|---|---|
| -c或–bytes | 只显示字节数 |
| -l或–lines | 显示行数 |
| -w或–words | 只显示字数 |
查看系统环境变量的字数信息:
sudo set | wc
只显示行数:
sudo set | wc -l
eval
执行多个命令,和 特殊命令 ;类似
exec
不创建子进程并执行后续命令;执行完毕后自动exit
stat
netstat
netstat -ant| grep 3306
fflush
kill [参数]
文件
/etc/passwd
系统用户配置文件,存储了系统中所有用户的基本信息。
权限:所有用户可读
sudo vim /etc/passwd
| 名称 | 说明 |
|---|---|
| 用户名 | 已创建的用户名 |
| 加密口令 | x代表加密密码保存在/etc/shadow文件中 |
| 用户ID | 代表用户的ID号,每个用户都有一个唯一的ID |
| 组ID | 代表群组的ID好,每个群组都有一个唯一的ID |
| 账号说明 | 描述用户的信息 |
| 主目录 | 代表用户所在的家目录 |
| 登录Shell | 代表用户使用Shell的类型 |
/etc/profile
建立全系统通用的初始环境变量,每次用户登录时 第一个 被执行
/etc/fstab
系统启动时自动挂载。当系统启动时,系统会自动地从这个文件读取信息,并且会自动将此文件中指定的文件系统挂载到指定内目录。
额外
禁止root用户
禁止root用户登录,并新建一个自己的用户
-
新建wyz用户(具体查看useradd)
-
赋予wyz 用户 sudo权限
-
禁止root登录
$ sudo vim /etc/ssh/sshd_config将
PermitRootLogin yes更改为no
进程
可执行(二进制)程序被系统加载到内存空间运行时,就是 进程。
每个进程都有唯一的标识号—— PID,进程可以产生新的进程,构成父子关系并形成进程树(pstree)。
进程都有一个 用户标识——对应运行此程序的用户ID。如果可执行文件没有设置suid和sgid,则进程的 有效用户标识 为此用户,否则为文件的所有者。
每一个进程属于且仅属于一个 进程组,向进程组发送信号,则组内所有进程都能收到。
每个进程都属于一个唯一的 会话 。用户登录后产生一个会话,会话包含若干进程组。会话的id是首进程组的id。一个会话中只有一个进程组是前台进程组,和控制终端交互,获取输入,接收信号。
控制终端关闭时,进程会收到 SIGHUP 信号。
除了PID为 0 的进程外,所有进程都有父进程。
进程优先级 = 优先级别(PR) + 谦让值(NI)。优先级别从父进程继承而来,不可更改,可以用 nice 将进程默认的谦让值从 0 改大(或改小)。
环境变量
全局的环境变量:存放在 /etc/profile
特定用户的环境变量:存放在home目录的 .profile或 .bashrc中
临时的环境变量:export定义,特定于此会话
检查系统环境变量:
- set,输出所有的变量,包括全局变量和局部变量
- env,输出全局变量
- declare,输出所有的变量,和set一样功能
- export,显示和设置环境变量
忘记密码
进入单用户模式修改
进程间通信
六种方式:、、、、、
- 管道
- 信号
- 信号量
- 共享内存
- 消息队列
- Socket
文件系统
虚拟文件系统
EXT2文件系统:引导块、超级块、iNode块、目录块、数据块