Linux 基础

说明:这里记录了一些Linux的命令,是学习linux的基础,便于以后快速查询对应指令的用法和作用。

ls [-a -l -h] [linux路径] 显示文件

-a选项,表示:all的意思,即列出全部文件(包含隐藏的文件/文件夹)

-l选项,表示:以列表(竖向排列)的形式展示内容,并展示更多信息

-h表示以易于阅读的形式,列出文件大小,如K、M、G

-h必须搭配-l 一起使用

语法中的选项是可以组合使用的, ls -l -a ls -la /

cd [Linux路径] 转到工作路径

pwd 显示当前工作目录

特殊路径符

. 表示当前目录

.. 表示上一级目录

~ 表示HOME目录

mkdir [-p] Linux路径 创建目录

参数必填,表示Linux路径,即要创建的文件夹的路径

-p选项可选,表示自动创建不存在的父目录,适用于创建连续多层级的目录

文件操作命令

touch Linux路径 创建文件

touch命令无选项,参数必填,表示要创建的文件路径

cat Linux路径 查看文件内容

more linux路径 查看文件内容

在查看的过程中,通过空格翻页,通过q退出查看

cp [-r] 参数1 参数2 复制文件、文件夹

-r选项,可选,用于复制文件夹使用,表示递归

参数1,linux路径,表示被复制的文件或文件夹

参数2,linux路径,表示要复制去的地方

mv 参数1 参数2 移动文件或文件夹

参数1,linux路径,表示被移动的文件或文件夹

参数2,linux路径,表示要移动去的地方,如果目标不存在,则进行改名,确保目标存在

rm [-r -f] 参数1 参数2 参数3 …….参数N 删除文件、文件夹

同cp命令一样,-r选项用于删除文件夹

-f表示force,强制删除(不会弹出提示确认信息)

普通用户删除内容不会弹出提示,只有root管理员用户删除内容会有提示

所以一般普通用户用不到-f选项

参数1…. 表示要删除的文件、文件夹路径,按照空格隔开

which 要查找的内容 查找命令

可以通过which命令,查看所使用的一系列的程序文件存放在哪里

find [-H] [-L] [-P] [-Olevel] [-D debugopts] [path…] [expression]

选项说明

path 是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如果未指定路径,则默认为当前目录。

expression 是可选参数,用于指定查找的条件,可以是文件名、文件类型、文件大小等等。

expression 中可使用的选项有二三十个之多,以下列出最常用的部份:

  • -name pattern:按文件名查找,支持使用通配符 *?
  • -iname pattern:此参数的效果和指定-name参数类似,但忽略字符大小写的差别;
  • -type type:按文件类型查找,可以是 f(普通文件)、d(目录)、l(符号链接)等。
  • -size [+-]size[cwbkMG]:按文件大小查找,支持使用 +- 表示大于或小于指定大小,单位可以是 c(字节)、w(字数)、b(块数)、k(KB)、M(MB)或 G(GB)。
  • -mtime days:按修改时间查找,支持使用 +- 表示在指定天数前或后,days 是一个整数表示天数。
  • -user username:按文件所有者查找。
  • -group groupname:按文件所属组查找。

find 命令中用于时间的参数如下:

  • -amin n:查找在 n 分钟内被访问过的文件。
  • -atime n:查找在 n*24 小时内被访问过的文件。
  • -cmin n:查找在 n 分钟内状态发生变化的文件(例如权限)。
  • -ctime n:查找在 n*24 小时内状态发生变化的文件(例如权限)。
  • -mmin n:查找在 n 分钟内被修改过的文件。
  • -mtime n:查找在 n*24 小时内被修改过的文件。

在这些参数中,n 可以是一个正数、负数或零。正数表示在指定的时间内修改或访问过的文件,负数表示在指定的时间之前修改或访问过的文件,零表示在当前时间点上修改或访问过的文件。

例如:-mtime 0 表示查找今天修改过的文件,-mtime -7 表示查找一周以前修改过的文件。

关于时间 n 参数的说明:

  • +n:查找比 n 天前更早的文件或目录。
  • -n:查找在 n 天内更改过属性的文件或目录。
  • n:查找在 n 天前(指定那一天)更改过属性的文件或目录。

find 起始路径 -name “被查找文件名” 按文件名查找文件

find 通配符

符号*表示通配符,即匹配任意内容

test*,表示匹配任何以test开头的内容

*test,表示匹配任何以test结尾的内容

*test * ,表示匹配任何包含test的内容

find 起始路径 -size + | -n[kMG] 按文件大小查找文件

+、- 表示大于和小于

n表示大小数字

kMG表示大小单位,k(小写字母)kb,M表示MB,G表示GB

grep [-n] 关键字 文件路径 从文件中通过关键字过滤文件行

选项-n,可选,表示在结果中显示匹配的行的行号

参数,关键字,必填,表示过滤的关键字,带有空格或其他特殊符号,建议使用” “,将关键字包围起来

参数,文件路径,必填,表示要过滤内容的文件路径,可作为内容输入端口

wc [-c -m -l -w] 文件路径

选项,-c,统计bytes数量

选项,-m,统计字符数量

选项,-l,统计行数

选项,-w,统计单词数量

参数,文件路径,被统计的文件,可作为内容输入端口

管道符 |

含义:将管道符左边命令的结果,作为右边命令的输入

echo 输出的内容 在命令行内输出指定内容

无需选项,只有一个参数,表示要输出的内容,复杂内容可以用” “包围

反引号 `

被`包围的内容,会被作为命令执行,而非普通字符

重定向符:> 和 >>

一 、>,将左侧命令的结果,覆盖写入到符号右侧指定的文件中

二、>>,将左侧命令的结果,追加写入到符号右侧指定的文件中

常见操作:echo “Hello Linux” > test.txt

tail [-f -num] Linux路径 查看文件尾部内容,跟踪文件的最新更改

参数,linux路径,表示被跟踪的文件路径

选项,-f,表示持续跟踪

选项,-num,表示查看尾部多少行,不填默认10行

vi/vim 编辑器

命令模式 —– 按键 i ——–> 输入模式 ——–ESC———->命令模式———– : ———->底线命令模式 ————-输入wq————->保存并退出

/ 搜索模式,n向下继续搜索,N向上继续搜索

dd :删除光标所在行的内容

ndd :n是数字,表示删除当前光标向下n行

yy:复制当前行

nyy:n是数字,复制当前行和下面的n行

p:粘贴复制的内容

u:撤销修改

ctrl + r :反向撤销修改

gg:跳到首行

G:跳到尾行

dG:从当前行开始,向下全部删除

dgg:从当前行开始,向上全部删除

d$:从当前光标开始,删除到本行的结尾

d0:从当前光标开始,删除到本行的开头

底线命令模式下:

:wq:保存并退出

q:仅退出

q!:强制退出

w:仅保存

set nu:显示行号

set paste :设置粘贴

用户

root用户(管理员账号)和普通用户

普通用户在出了home路径后权限会受到约束

su [-] [用户名] 切换用户

-符号是可选的,表示是否在切换用户后加载环境变量,建议带上

参数:用户名,表示要切换的用户,用户名也可以省略,省略表示切换到root

切换用户后,可以通过exit命令返回上一个用户,也可以使用快捷键:ctrl + d

sudo 其他命令

为普通的命令授权,临时以root身份执行

在其他命令之前,带上sudo,即为这一条命令临时赋予root授权

但不是所有的用户,都有权力使用sudo,需要为普通用户配置sudo认证

为普通用户配置sudo认证

切换到root用户,执行visudo命令,会自动通过vi编辑器打开:/etc/sudoers,在文件的最后添加 用户名 ALL=(ALL) NOPASSWD: ALL

其中NOPASSWD: ALL 表示使用sudo命令,无需输入密码,最后通过wq保存

用户、用户组

Linux中关于权限的管控级别有2个级别,分别是:

  • 针对用户的权限控制
  • 针对用户组的权限控制

用户组管理

  • 创建用户组 groupadd 用户组名
  • 删除用户组 groupdel 用户组名

用户管理

  • 创建用户 useradd [-g -d] 用户名-g 指定用户的组,不指定-g,会创建同名组并自动加入,指定-g需要组已经存在,如已存在同名组,必须使用-g-d 指定用户HOME路径,不指定,HOME目录默认在:/home/用户名
  • 删除用户 userdel [-r] 用户名 -r 删除用户的HOME目录,不使用-r,删除用户时,HOME目录保存
  • 查看用户所属组 id [用户名]参数:用户名,被查看的用户,如果不提供则查看自身
  • 修改用户所属组 usermod -aG 用户组 用户名,将指定用户加入指定用户组

查看权限控制信息

通过ls -l 可以以列表形式查看内容,并显示权限细节

rwx 权限

  • r 表示读权限
  • w 表示写权限
  • x 表示执行权限

chmod [-R] 权限 文件或文件夹 修改权限命令

只有文件、文件夹的所属用户或root用户可以修改

选项 -R,对文件夹内的所有内容应用相同的操作

示例:

chmod u=rwx,g=rx,o=x hello.txt, 将文件权限修改为:rwxr-x–x

其中:u表示user所属用户权限,g表示group组权限,o表示other其他用户权限

权限的数组序号

权限可以用3位数字来代表,第一位数字表示用户权限,第二位表示用户组权限,第三位表示其他用户权限

数字的细节如下:r记为4,w记为2,x记为1

  • 0:无任何权限,即–
  • 1:仅有x权限,即–x
  • 2:仅有w权限,即-w-
  • 3:有w和x权限,即-wx
  • 4:仅有r权限,即r–
  • 5:有r和x权限,即r-x
  • 6:有r和w权限,即rw-
  • 7:有全部权限,即rwx

chown [-R] [用户] [:] [用户组] 文件或文件夹 修改文件、文件夹的所属用户和用户组

选项,-R,同chmod,对文件夹内部全部内容应用相同规则

选项,用户,修改所属用户

选项,用户组,修改所属用户组

:用于分隔用户和用户组

linux各类快捷键

  • ctrl + c 强制停止
  • ctrl + d 退出或登出
  • history 查看历史输入过的命令
  • !命令前缀,自动执行上一次匹配前缀的命令
  • ctrl + r 输入内容去匹配历史命令
  • ctrl + a 光标跳到命令开头
  • ctrl + e 光标跳到命令结尾
  • ctrl + 键盘左键,向左跳一个单词
  • ctrl + 键盘右键,向右跳一个单词
  • ctrl + l 可以清空终端内容,或者通过命令clear得到同样效果

apt

apt(Advanced Pakcaging Tool)是一个在Debian和Ubuntu中的shell前端软件包管理器

apt 命令 提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令

apt 命令执行需要超级管理员权限(root)

apt [options] [command] [package …]

  • options:可选,选项包括-h(帮助),-y(当安装过程提示选择全部为“yes”),-q(不显示安装的过程)等等
  • command:要进行的操作
  • package:安装的包名

常用命令

  • 更新apt软件源数据库:sudo apt update
  • 更新已安装的软件包:sudo apt upgrade列出可更新的软件包及版本信息:apt list –upgradeable升级软件包,升级前先删除需要更新软件包:sudo apt full-upgrade
  • 安装指定的软件命令:sudo apt install package_name安装多个软件包:sudo apt install package_1 package_2 package_3
  • 显示软件包具体信息,例如:版本号,安装大小,依赖关系等等:sudo apt show package_name
  • 删除软件包命令:sudo apt remove package_name
  • 清理不再使用的依赖和库文件: sudo apt autoremove
  • 移除软件包及配置文件: sudo apt purge package_name
  • 查找软件包命令: sudo apt search package_name
  • 列出所有已安装的包:apt list –installed
  • 列出所有已安装的包的版本信息:apt list –all-versions

systemctl start | stop | status | enable | disable 服务名

linux系统很多软件均支持使用systemctl命令控制:启动、停止、开机自启

  • start 启动
  • stop 关闭
  • status 查看状态
  • enable 开启开机自启
  • disable 关闭开机自启

ln -s 参数1 参数2 创建软链接

在系统中创建软连接,可以将文件、文件夹链接到其他位置,类似于windows系统中的 快捷方式

-s 选项,创建软链接

参数1:被链接的文件或文件夹

参数2:要链接去的目的地

date [-d] [+格式化字符串]

-d 按照给定的字符串显示日期,一般用于日期计算

格式化字符串:通过特定的字符串标记,来控制显示的日期格式

  • %Y 年
  • %y 年份后两位数字
  • %m 月份
  • %d 日
  • %H 小时
  • %M 分钟
  • %S 秒
  • %s 自1970-01-01 00:00:00 到现在的秒数

修改linux时区

使用root权限,执行如下命令,修改时区为东八区时区

rm -f /etc/localtime

sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

将系统自带的localtime文件删除,并将/usr/share/zoneinfo/Asia/Shanghai文件链接为localtime文件即可

ntp程序

通过ntp程序自动校准系统实践

安装 sudo apt install ntp

启动并设置开机自启:

  • systemctl start ntpd
  • systemctl enable ntpd

IP地址 ipv4

ifconfig 查看本机ip地址

ip [ OPTIONS ] OBJECT { COMMAND | help}

ip [ -force ] -batch filename

  • OBJECT:OBJECT := { link | address | addrlabel | route | rule | neigh | ntable |
          tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |
          netns | l2tp | macsec | tcp_metrics | token }

    -V:显示指令版本信息;
    -s:输出更详细的信息;
    -f:强制使用指定的协议族;
    -4:指定使用的网络层协议是IPv4协议;
    -6:指定使用的网络层协议是IPv6协议;
    -0:输出信息每条记录输出一行,即使内容较多也不换行显示;
    -r:显示主机时,不使用IP地址,而使用主机的域名。
  • OPTIONS:OPTIONS := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |
           -h[uman-readable] | -iec |
           -f[amily] { inet | inet6 | ipx | dnet | bridge | link } |
           -4 | -6 | -I | -D | -B | -0 |
           -l[oops] { maximum-addr-flush-attempts } |
           -o[neline] | -t[imestamp] | -ts[hort] | -b[atch] [filename] |
           -rc[vbuf] [size] | -n[etns] name | -a[ll] }

    网络对象:指定要管理的网络对象;
    具体操作:对指定的网络对象完成具体操作;
    help:显示网络对象支持的操作命令的帮助信息。

常用命令

ip link show                     # 显示网络接口信息
ip link set eth0 up             # 开启网卡
ip link set eth0 down           # 关闭网卡
ip link set eth0 promisc on     # 开启网卡的混合模式
ip link set eth0 promisc off     # 关闭网卡的混个模式
ip link set eth0 txqueuelen 1200 # 设置网卡队列长度
ip link set eth0 mtu 1400       # 设置网卡最大传输单元

ip addr show     # 显示网卡IP信息
ip addr add 192.168.0.1/24 dev eth0 # 设置eth0网卡IP地址192.168.0.1
ip addr del 192.168.0.1/24 dev eth0 # 删除eth0网卡IP地址

ip route show # 显示系统路由
ip route add default via 192.168.1.254   # 设置系统默认路由
ip route list                 # 查看路由信息
ip route add 192.168.1.0/24 via 192.168.0.254 dev eth0 # 设置192.168.4.0网段的网关为192.168.0.254,数据走eth0接口
ip route add default via 192.168.0.254 dev eth0       # 设置默认网关为192.168.0.254
ip route del 192.168.1.0/24   # 删除192.168.4.0网段的网关
ip route del default         # 删除默认路由
ip route delete 192.168.1.0/24 dev eth0 # 删除路由

hostname 查看主机名

hostnamectl set-hostname 主机名,修改主机名,需要root

配置固定IP地址

IP地址是通过DHCP服务获取

DHCP:动态获取IP地址,即每次重启设备后都会获取一次,可能导致IP地址频繁变更

ping [-c num] ip或主机名

通过ping命令,检查指定的网络服务器是否是可联通状态

选项:-c,检查的次数,不使用-c选项,将无限次数持续检查

参数:ip或主机名,被检查的服务器的ip地址或主机名地址

wget [-b] url

wget是非交互式的文件下载器,可以在命令行内下载网络文件

选项:-b,可选,后台下载,会将日志写入到当前工作目录的wget-log文件

参数:url,下载链接

curl [-O] url

curl可以发送http网络请求,可用于:下载文件、获取信息等

选项:-O,用于下载文件,当url是下载链接时,可以使用此选项保存文件

参数:url,要发起请求的网络地址

端口

端口,是设备与外界通讯交流的出入口,端口可以分为:物理端口和虚拟端口两类

  • 物理端口:又可称之为接口,是可见的端口,如USB接口,RJ45网口,HDMI端口等
  • 虚拟端口:是指计算机内部的端口,是不可见的,是用来操作系统和外部进行交互使用的

nump 被查看的IP地址

可以查看端口的占用情况

进程

程序运行在操作系统中,是被操作系统所管理的

为管理运行的程序,每一个程序在运行的时候,便被操作系统注册为一个系统中的一个:进程

并会为每一个进程都分配一个独有的:进程ID(进程号)

ps [-e -f] 查看进程

可以通过ps命令查看Linux系统中的进程信息

选项:-e,显示出全部的进程

选项:-f,以完全格式化的形式展示信息

ps -ef | grep 关键词 过滤指定关键字进程信息

kill [-9] 进程ID 关闭进程

选项:-9,表示强制关闭进程,不使用此选项会向进程发送信号要求其关闭,但是是否关闭看进程自身的处理机制。

top 查看系统资源占用

通过top命令查看CPU、内存使用情况,类似Windows的任务管理器

默认每5s刷新一次,语法:直接输入top即可,按q或ctrl + c退出

top命令也支持选项

  • -p:只显示某个进程的信息
  • -d:设置刷新时间,默认是5s
  • -c:显示产生进程的完整命令,默认是进程名
  • -n:指定刷新次数,比如top -n 3,刷新输出3次后退出
  • -b:以非交互非全屏模式运行,以批次的方式执行top,一般配合-n指定输出几次统计信息,将输出重定向到指定文件,比如 top -b -n 3 > /tmp/tmp.tmp
  • -i:不显示任何闲置(idle)或无用(zombie)的进程
  • -u:查找特定用户启动的进程

df [-h] 磁盘信息监控

选项:-h,以更加人性化的单位显示

iostat [-x] [num1] [num2] 查看CPU、磁盘的相关信息

选项:-x,显示更多信息

num1:数字,刷新间隔

num2:数字,刷新几次

sar -n DEV num1 num2 查看网络的相关统计

选项:-n,查看网络,DEV表示查看网络接口

num1:刷新间隔(不填就查看一次结束),num2:查看次数(不填无限次数)

env 查看当前系统中记录的环境变量

$符号被用于取”变量“的值

echo $PATH -> 输出PATH的值

echo ${PATH}ABC

自行设置环境变量

export 变量名=变量值 临时设置

永久生效

  • 针对当前用户生效,配置在当前用户的:~/.bashrc文件中
  • 针对所有用户生效,配置在系统的:/etc/profile文件中
  • 并通过语法:source 配置文件,进行立即生效,或重新登陆FinalShell生效

环境变量PATH这个项目里面记录了系统执行命令的搜索路径

这些搜索路径我们也可以自行添加到PATH中去

压缩、解压缩

.tar,称之为tarball,归档文件,即简单的将文件组装到一个.tar的文件内,并没有太多的文件体积的减少,仅仅是简单的封装

.gz,也常见为.tar.gz,.gzip格式压缩文件,即使用gzip压缩算法将文件压缩到一个文件内,可以极大的减少压缩后的体积

tar [-c -v -x -f -z -C] 参数1 参数2 … 参数N

  • -c,创建压缩文件,用于压缩模式
  • -v,显示压缩、解压过程,用于查看进度
  • -x,解压模式
  • -f,要创建的文件,或要解压的文件,-f选项必须在所有选项中位置处于最后一个
  • -z,gzip模式,不使用-z就是普通的tarball格式
  • -C,选择解压的目的地,用于解压模式

注意:

  • -z选项如果使用的话,一般处于选项位第一个
  • -f选项,必须在选项位最后一个

tar 解压

参数同tar压缩一致

注意:

  • -f选项,必须在选择组合体的最后一位
  • -z选项,建议在开头位置
  • -C选项单独使用,和解压所需的其他参数分开

zip [-r] 参数1 参数2 … 参数N

-r ,被压缩的包含文件夹的时候,需要使用-r选项,和rm、cp等命令的-r效果一致

unzip [-d] 参数

-d,指定要解压去的位置,同tar的-C选项

参数,被解压的zip压缩包文件

dmesg [options]

用于查看或控制内核环形缓冲区

Kernel会将内核启动日志存储在ring buffer中。若是开机时来不及查看信息,可利用dmesg来查看

dmesg -C / dmesg –clear

dmesg -c / dmesg –read-clear [options]

  • -c,–read-clear 显示信息后,清楚ring buffer 中的内容
  • -C,–clear 清楚ring buffer中的内容

常用命令:

  • dmesg:显示所有ring buffer 中的内核日志内容
  • dmesg > kernel.log:把内核日志保存到文件中
  • dmesg -C:清空缓存日志,在调试驱动时,可以减少日志内容

dpkg-deb [< option > …] << command >>

command 说明

dpkg-deb 命令不仅有选项可以设置,还需要设置命令来执行不同的功能

  • -b:创建debian软件包。
  • -c:显示软件包中的文件列表;
  • -e:将主控信息解压;
  • -f:把字段内容打印到标准输出;
  • -x:将软件包中的文件释放到指定目录下;
  • -X:将软件包中的文件释放到指定目录下,并显示释放文件的详细过程;
  • -w:显示软件包的信息;
  • -l:显示软件包的详细信息;
  • -R:提取控制信息和存档的清单文件;

选项说明

  • -v, --verbose:启用详细输出。
  • -D, --debug:启用调试输出。
    • --showformat=<format>:使用替代格式来进行 --show
    • --deb-format=<format>:选择归档格式。允许的取值为 0.939000、2.0(默认值)。
    • --nocheck:禁止控制文件检查(构建不良软件包)。
    • --root-owner-group:强制文件的所有者和组为 root。
    • --[no-]uniform-compression:在所有成员上使用压缩参数。如果指定,将使用统一的压缩参数。
  • -z#:设置构建时的压缩级别。
  • -Z<type>:设置构建时使用的压缩类型。允许的类型有 gzip、xz、zstd、none。
  • -S<strategy>:设置构建时的压缩策略。允许的值有 none、extreme(xz)、filtered、huffman、rle、fixed(gzip)。

常用命令

  • 解压程序文件 dpkg-deb -x hobot-configs_2.2.0-20231030133209_arm64.deb
  • 解压控制文件 dpkg-deb -e hobot-configs_2.2.0-20231030133209_arm64.deb hobot-configs/DEBIAN
  • 查询deb包中文件内容 dpkg-deb -c hobot-configs_2.2.0-20231030133209_arm64.deb

dpkg [‘option’ …] ‘command’

dpkg命令是Debian Linux系统用来安装、创建和管理软件包的实时工具

command说明

dpkg 命令不仅有选项可以设置,还需要设置命令来执行不同的功能。

  • -i:安装软件包;
  • -r:删除软件包;
  • -P:删除软件包的同时删除其配置文件;
  • -L:列出属于指定软件包的文件;
  • -l:简明地列出软件包的状态。
  • -S:搜索含有指定文件的软件包。
  • –unpack:解开软件包;
  • -c:显示软件包内文件列表;
  • –confiugre:配置软件包。

选项说明

  • –admindir=目录 使用 目录 而非 /var/lib/dpkg。
  • –root=目录 安装到另一个根目录下。
  • –instdir=目录 改变安装目录的同时保持管理目录不变。
  • –path-exclude=表达式 不要安装符合Shell表达式的路径。
  • –path-include=表达式 在排除模式后再包含一个模式。
  • -O|–selected-only 忽略没有被选中安装或升级的软件包。
  • -E|–skip-same-version 忽略版本与已安装软件版本相同的软件包。
  • -G|–refuse-downgrade 忽略版本早于已安装软件版本的的软件包。
  • -B|–auto-deconfigure 就算会影响其他软件包,也要安装。
  • –[no-]triggers 跳过或强制随之发生的触发器处理。
  • –verify-format=格式 检查输出格式(‘rpm’被支持)。
  • –no-debsig 不去尝试验证软件包的签名。
  • -D|–debug=八进制数 开启调试(参见 -Dhelp 或者 –debug=help)。
  • –status-logger=命令 发送状态更新到 命令 的标准输入。
  • –log=文件名 将状态更新和操作信息到 文件名
  • –ignore-depends=软件包,… 忽略关于 软件包 的所有依赖关系。
  • –force-… 忽视遇到的问题(参见 –force-help)。
  • –no-force-…|–refuse-… 当遇到问题时中止运行。
  • –abort-after n 累计遇到 n 个错误后中止。

常用命令

  • 安装包 dpkg -i package.deb
  • 删除包 dpkg -r package
  • 删除包 dpkg -P package
  • 列出与该包关联的文件 dpkg -L package
  • 显示该包的版本 dpkg -l package
  • 解开deb包的内容 dpkg –unpack package.deb
  • 搜索所属的包内容 dpkg -S keyword
  • 列出当前已安装的包 dpkg -l
  • 列出deb包的内容 dpkg -c package.deb
  • 配置包 dpkg –configure package

mout

用于挂载文件系统的命令

语法

mount [-l|-h|-V] mount -a [-fFnrsvw] [-t fstype] [-O optlist] mount [-fnrsvw] [-o options] device|dir mount [-fnrsvw] [-t fstype] [-o options] device dir

选项说明

-V:显示程序版本
-h:显示辅助讯息
-v:显示较讯息,通常和 -f 用来除错。
-a:将 /etc/fstab 中定义的所有档案系统挂上。
-F:这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
-f:通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
-n:一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
-s-r:等于 -o ro
-w:等于 -o rw
-L:将含有特定标签的硬盘分割挂上。
-U:将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
-t:指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。
-o async:打开非同步模式,所有的档案读写动作都会用非同步模式执行。
-o sync:在同步模式下执行。
-o atime、-o noatime:当 atime 打开时,系统会在每次读取档案时更新档案的『上一次调用时间』。当我们使用 flash 档案系统时可能会选项把这个选项关闭以减少写入的次数。
-o auto、-o noauto:打开/关闭自动挂上模式。
-o defaults:使用预设的选项 rw, suid, dev, exec, auto, nouser, and async.
-o dev、-o nodev-o exec、-o noexec允许执行档被执行。
-o suid、-o nosuid:允许执行档在 root 权限下执行。
-o user、-o nouser:使用者可以执行 mount/umount 的动作。
-o remount:将一个已经挂下的档案系统重新用不同的方式挂上。例如原先是唯读的系统,现在用可读写的模式重新挂上。
-o ro:用唯读模式挂上。
-o rw:用可读写模式挂上。
-o loop=:使用 loop 模式用来将一个档案当成硬盘分割挂上系统。

常用命令

  • mount /dev/hda1 /mnt:将 /dev/hda1 挂在 /mnt 之下
  • mount -o ro /dev/hda1 /mnt:将 /dev/hda1 用只读模式挂在 /mnt 之下
  • mount -o remount,rw /:将 / 根目录重新挂载为读写模式
  • mount -t nfs -o nolock 192.168.1.20:/home/ /tmp/nfs:挂载nfs网络文件系统

netstat

用来打印Linux中网络系统的状态信息,可让你得知整个系统的网络情况

语法

netstat [-vWeenNcCF] [<Af>] -r         
netstat {-V|--version|-h|--help}
netstat [-vWnNcaeol] [<Socket> ...]
netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }

选项说明

  • -A: 列出该网络类型连线中的相关地址。
  • -r, --route:显示路由表,列出系统的路由信息。
  • -i, --interfaces:显示网络接口信息,包括接口名称、IP 地址和其他相关信息。
  • -g, --groups:显示组播组成员信息,包括哪些网络组成员在组播组中。
  • -s, --statistics:显示网络统计信息,类似于 SNMP(Simple Network Management Protocol),提供有关网络活动的详细统计。
  • -M, --masquerade:显示伪装(masquerade)连接信息,通常用于 Network Address Translation (NAT) 网络。
  • -v, --verbose:显示详细信息,提供更多的信息以帮助诊断网络问题。
  • -W, --wide:不截断 IP 地址,以显示完整的 IP 地址信息。
  • -n, --numeric:不解析主机名或端口名,以显示数字格式的 IP 地址、端口号和用户信息。
  • --numeric-hosts:不解析主机名。
  • --numeric-ports:不解析端口名。
  • --numeric-users:不解析用户名称。
  • -N, --symbolic:解析硬件名,显示硬件设备的符号名称。
  • -e, --extend:显示附加信息。使用此选项两次以获取最大的详细信息。
  • -p, --programs:显示 PID(进程标识符)和程序名称,以显示与套接字相关的进程信息。
  • -o, --timers:显示计时器信息,包括套接字的计时器状态。
  • -c, --continuous:使 netstat 持续打印所选信息,每秒一次,以进行连续监控。
  • -l, --listening:只显示正在监听的服务器套接字。
  • -a, --all:显示所有套接字,包括已连接和未连接的。
  • -F, --fib:显示转发信息表(FIB)。
  • -C, --cache:显示路由缓存,而不是转发信息表。
  • -Z, --context:显示 SELinux 安全上下文,用于显示套接字的 SELinux 安全信息。
  • -v, --verbose:启用详细输出,向用户提供有关正在进行的操作的更多信息。特别是在处理未配置的地址族时,提供一些有用的信息。
  • -o, --timers:包括与网络计时器相关的信息。
  • -p, --program:显示每个套接字所属的程序的 PID 和名称。
  • -l, --listening:仅显示正在监听的套接字。默认情况下,这些被省略。
  • -a, --all:显示监听和非监听的套接字。在使用 --interfaces 选项时,显示未启用的接口。
  • -F:从 FIB 打印路由信息(默认)。
  • -C:从路由缓存中打印路由信息。

常用命令

  • 显示详细的网络状况
netstat -a     #列出所有端口
netstat -at   #列出所有tcp端口
netstat -au   #列出所有udp端口  
  • 显示当前户籍UDP连接状况
netstat -nu
  • 显示UDP端口号的使用情况
netstat -apu
  • 显示网卡列表
netstat -i
  • 显示组播组的关系
netstat -g
  • 显示网络统计信息
netstat -s   显示所有端口的统计信息
netstat -st   显示TCP端口的统计信息
netstat -su   显示UDP端口的统计信息
  • 显示监听的套接口
netstat -l        #只显示监听端口
netstat -lt       #只列出所有监听 tcp 端口
netstat -lu       #只列出所有监听 udp 端口
netstat -lx       #只列出所有监听 UNIX 端口
  • 在netstat输出中显示 PID 和进程名称
netstat -pt

netstat -p可以与其它开关一起使用,就可以添加“PID/进程名称”到netstat输出中。

  • 持续输出netstat信息
netstat -c   #每隔一秒输出网络信息
  • 显示核心路由信息
netstat -r

使用netstat -rn显示数字格式,不查询主机名称。

  • 找出程序运行的端口

并不是所有的进程都能找到,没有权限的会不显示,使用 root 权限查看所有的信息。

netstat -ap | grep ssh
  • 找出运行在指定端口的进程
netstat -an | grep ':80'
  • 通过端口找进程ID
netstat -anp|grep 8081 | grep LISTEN|awk '{printf $7}'|cut -d/ -f1

nohup

nohup 英文全称no hang up(不挂起),用于在系统后台不挂断的运行命令,退出终端不会影像系统的运行

在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下。如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out文件中。如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

语法

nohup COMMAND [ARG]… [ & ]

nohup OPTION

COMMAND:要执行的命令

ARG:一些参数,可以指定输出文件

&:让命令在后台执行,终端退出后命令仍旧执行

选项说明

  • –help:显示帮助信息
  • –version:显示版本信息

route

route命令用来显示并设置Linux内核中的网络路由器,route命令设置的路由主要是静态路由,要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现

在linux系统中设置路由通常是为了解决以下问题:

该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的ip地址设置为Linux机器的默认路由。要注意的是,直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了;可以在/etc/rc.local中添加route命令来保证该路由设置永久有效。

语法说明

route [-nNvee] [-FC] [< AF >]

route [-v] [-FC] {add|del|flush} …

  • -A:设置地址类型。
  • -v, --verbose:显示详细信息。
  • -n, --numeric:不执行DNS反向查找,直接显示数字形式的IP地址。
  • -e, --extend:netstat格式显示路由表。
  • -F, --fib:显示转发信息库(默认)。
  • -C, --cache:显示路由缓存,而不是转发信息库。
  • -net:到一个网络的路由表。
  • -host:到一个主机的路由表。

选项说明

  • add:用于添加指定的路由记录,将指定的目的网络或目的主机路由到指定的网络接口。
  • del:用于删除指定的路由记录。
  • target:指定目的网络或目的主机。
  • gw:用于设置默认网关。
  • mss:设置TCP的最大区块长度(MSS)。
  • window:指定通过路由表的TCP连接的TCP窗口大小。
  • dev:指定路由记录所表示的网络接口。

常用命令

显示当前路由 route / route -n

设置/添加网关 route add -net 192.168.2.0 netmask 255.255.255.0 dev eth0

屏蔽一条路由 route add -net 192.168.2.0 netmask 255.255.255.0 reject

删除路由记录 route del -net 192.168.2.0 netmask 255.255.255.0 route del -net 192.168.2.0 netmask 255.255.255.0 reject

删除和添加设置默认网关route del default gw 192.168.137.1

route add default gw 192.168.137.1

man

使用 man 命令来查询某个函数的使用手册

语法

man [2] 函数名

有时候不用加2,有时候要加2

Linux手册是分章节的

  • 第一节:普通用户命令(如ls,cd)
  • 第二节:系统调用(如socket,read,write)
  • 第三节:库函数(如printf,malloc)

如果一个名字既是命令有时函数,默认man会显示第一节,如果想看编程用的函数定义,就需要加上2

示例

man socket,会显示一下内容

  • NAME:函数的名称和简要描述
  • SYNOPSIS(总览):里面可以找到#include那些头文件(这里可以用 “/” 来查找指定的数据,例如查找include就可以输入 /include),还可以找到函数的参数类型和返回值类型
  • DESCRIPTION:详细解释每个参数的具体含义。
  • RETURN VALUE:告诉你在成功时返回什么,失败时返回什么(通常是 -1)。

gcc 编译

gcc main.c —> main.o

-o,指定输出的名称,gcc main.c -o main

链接方式

  1. 静态链接 gcc -static main.o -o main
  2. 动态链接,默认的方式,gcc main.o -o main

编译动态库

示例:将hello.o编译为动态链接库libhello.so

gcc -fPIC -shared -o libhello.so hello.o

-fPIC:这个选项告诉编译器为”位置无关代码“生成输出。在创建共享库时使用这个选项是非常重要的,因为它允许共享库被加载到内存中的任何位置,而不影像其执行。这是因为位置无关代码使用相对地址而非绝对地址进行数据访问和函数调用,使得库在被不同程序加载时能够灵活地映射到不同地地址空间。

-shared:这个选项知识GCC生成一个共享库而不是一个可执行文件。共享库可以被多个程序同时使用,节省了内存和磁盘空间。

链接动态库

gcc main.o -L ./ -lhello -o main

./:库的路径

-l:后面接库的名称

注意:Linux的默认动态链接库文件夹时/lib和/usr/lib,而我们的libhello.so不在其中,所以需要在执行的时候指明额外的动态链接库文件夹。

LD_LIBRARY_PATH=”动态库所在目录”

混合链接

自己写的库打包为静态库,系统的库通过动态库链接

设置开机自启动

在 Linux 系统中,开机自启动的实现方式非常多样,主要可以分为系统初始化阶段用户登录阶段以及定时任务阶段


1. 系统级服务管理(Systemd)

这是目前主流 Linux 发行版(如 Ubuntu, CentOS, Debian)的标准方式。它在系统通电、内核加载后不久就开始运行,不需要用户登录。

  • 工作原理: 通过编写 .service 配置文件,由 systemd 进程统一调度。
  • 配置文件位置: /etc/systemd/system//lib/systemd/system/
  • 管理命令: systemctl enable [服务名]
  • 优点: 支持并行启动(速度快)、支持失败自动重启、可以设置依赖关系(如:必须在网络通了之后再启动)。

2. 传统脚本方式(rc.local)

这是很多老用户最喜欢的“简单粗暴”法,适合放一两行简单的 shell 指令。

  • 工作原理: 系统在完成所有基本服务启动后,最后执行这个脚本里的内容。
  • 配置文件位置: /etc/rc.local
  • 注意: 脚本末尾必须有 exit 0,且文件必须具备可执行权限(chmod +x)。

3. 定时任务方式(Crontab @reboot)

cron 通常用于定时任务,但它有一个特殊的参数可以直接实现开机启动。

  • 工作原理: 利用 cron 守护进程在检测到系统重启(reboot)时触发指令。
  • 设置方法: 执行 crontab -e,添加一行 @reboot /path/to/command
  • 优点: 设置极其简单,不需要 root 权限也可以为普通用户设置。

4. 用户登录环境配置(Profile/Bashrc)

这类方式严格来说不是“系统开机”启动,而是“用户登录 SSH 或打开终端”时启动。你之前遇到的权限报错,很多就是因为指令写在了这里。

  • 全局配置(对所有用户生效):
    • /etc/profile
    • /etc/profile.d/*.sh
  • 个人配置(仅对当前用户生效):
    • ~/.bash_profile
    • ~/.bashrc(每次打开新的终端窗口都会运行一次)。

5. 桌面环境自启动(XDG Autostart)

如果你使用的是带界面的系统(如树莓派桌面版、Ubuntu 桌面版),当你进入图形界面时会触发。

  • 工作原理: 遵循 FreeDesktop 标准,在桌面加载时运行。
  • 位置:
    • 个人:~/.config/autostart/
    • 系统:/etc/xdg/autostart/
  • 文件格式: .desktop 后缀的文本文件。

6. 旧版系统初始化(Init.d)

在 Systemd 普及之前(CentOS 6 以前),使用的是 SysVinit。

  • 位置: /etc/init.d/
  • 特点: 全是复杂的 Shell 脚本,现在基本只为了兼容旧软件而存在。

实例:systemd

  1. 创建服务配置文件,Systemd 的配置文件通常以 .service 结尾,存放在 /etc/systemd/system/ 目录下。使用root权限新建文件:sudo nano /etc/systemd/system/my_startup.service
  2. 编写配置内容,模板:
  3. [Unit]
    # 服务的简单描述
    Description=My Custom Startup Script
    # 关键:设置在哪些服务启动后再执行(通常设为网络就绪后)
    After=network-online.target tailscaled.service
    Wants=network-online.target

    [Service]
    # 执行类型,simple 表示直接运行 ExecStart 指定的命令
    Type=simple
    # 以哪个用户身份运行(设置为 root 可以避免你之前遇到的权限问题)
    User=root
    # 你的指令:务必使用绝对路径(如 /usr/bin/python3 而不是 python3)
    # 如果有多条指令,可以用 /bin/bash -c “cmd1 && cmd2” 的形式
    ExecStart=/usr/bin/python3 /home/user/myscript.py
    # 自动重启设置:如果程序崩溃,5秒后自动重启
    Restart=on-failure
    RestartSec=5
    # 设置工作目录
    WorkingDirectory=/home/user/
    [Install]
    # 定义服务在哪个阶段启动,multi-user.target 表示系统多用户状态(正常开机)
    WantedBy=multi-user.target
  4. 加载并启动服务
    • 重新加载配置:让系统扫描到你新创建的.service文件:sudo systemctl daemon-reload
    • 设置开机自启:这会在系统的启动链中创建一个软连接sudo systemctl enable my_startup.service
    • 立即启动测试:无需重启,直接手动触发看是否报错sudo systemctl start my_startup.service
  5. 管理与监控,Systemd强大的地方在于你可以随时”监控“自启动项的状态
    • 查看运行状态:如果你的指令报错了,这里会显示红色的错误信息。sudo systemctl status my_startup.service
    • 停止子启动:sudo systemctl stop my_startup.service
    • 查看实时日志:如果你的脚本有print输出,可以用这个命令查看journalctl -u my_startup.service -f

shell

shell是Linux操作系统的一种命令行解释器,它提供了用户与操作系统内核进行交互的接口。

shell两种常见的工作模式:交互式模式和批处理模式。

交互式模式:用户可以逐行输入命令,并立即查看和处理命令的输出结果。shell在接收到用户输入后会立即解释和执行相应的命令,并将结果输出到中断。

批处理模式:shell从一个脚本文件中逐行读取并执行命令,而不需要用户的实时输入和交互。用户事先编写好一系列的命令,并将它们保存在一个脚本文件中。然后,用户可以通过执行脚本文件来自动运行其中的命令。批处理模式适用于用户需要自动化执行一些列命令、进行批量处理或重复性或逻辑判断任务的情况。

可以通过以下命令打印当前系统所使用的shell解析器:

echo $SHELL

查看系统中全部的shell解析器

cat /etc/shells

shell内置命令

在shell中,存在两种类型的命令:内置命令和外部命令。

内置命令:直接嵌在shell解释器中的命令。这意味着shell解释器本身提供了这些命令的实现,无需调用外部程序。

外部命令:由独立的可执行程序提供的命令。外部命令可以是系统自带的工具,也可以是用户自己安装的软件。在执行外部命令时,shell会搜索系统的可执行文件路径,以找到并执行相应的命令。用户可以通过指定命令的完整路径或将可执行文件所在的目录添加到PATH环境变量中来执行外部命令。

区分内置命令和外部命令的一个简单方法是使用type命令。例如,type cd 将显示”cd is a shell builtin”,而 type ls 将显示”ls is /bin/ls“,表明cd是一个内置命令,而ls是一个外部命令。

shell脚本文件编写规范

  1. 脚本文件命名规范shell脚本文件就是一个文本文件,后缀名建议使用.sh结尾。
  2. 首行格式归规范在脚本文件的第一行通常需要添加脚本文件的声明,指定使用那种shell解释器执行该脚本。例如,使用Bash解释器的声明为:#!/bin/bash。这个声明称为shebang,用于告诉系统应该指定的解释器来执行脚本。
  3. 注释格式注释用于提供对脚本的说明和解释,不会被解释器执行。在shell脚本中,注释可以以 # 开头。

运行脚本的四种方式

  1. 添加可执行权限后,通过绝对路径或者相对路径执行脚本
  2. 使用解释器执行脚本
  3. 使用source命令执行脚本
  4. 使用.命令执行脚本

shell变量

变量:用于存储和表示数据的一种命名实体,包含各种类型的数据,如字符串、数字、命令输出等。

命名规范:

  • 变量必须以字母或下划线开头,并由字母、数字和下划线组成
  • 变量名对大小写敏感
  • 建议使用大写字母来表示常量或全局变量,使用小写字母来表示局部变量

变量的赋值:使用等号(=)将值赋给变量。需要注意的是,等号两边不能由空格,否则空格会被解释成命令和参数的一部分。

变量的使用:在shell脚本中,可以通过在变量名前加$符号来引用变量的值。

示例:

界定符

  1. 单引号:单引号用于创建保持字符串的字面值的字符串。在单引号字符串中,所有字符都被视为普通字符,不进行变量扩展、命令替换或特殊字符转义。
  2. 双引号:双引号用于创建字符串,并支持变量扩展和特殊字符转义。

变量的分类

  1. 本地变量:在shell脚本中定义和使用的变量全局变量:在shell的解析环境中存在的变量,不需要任何修饰符进行声明。无论是在函数内部还是函数外部,全局变量的作用范围都是整个shell进程。全局变量的声明周期从声明语句开始,一直持续到bash进程结束。局部变量:使用local关键字进行修饰,只能在函数内部声明。局部变量的作用范围仅限于声明它的函数内部,在函数结束后,局部变量将不再可用。局部变量的声明周期从声明语句开始,一直持续到函数执行结束。
  2. 环境变量:是操作系统自带的变量,每个bash进程都有自己的环境变量集合。当启动一个bash子进程时,子进程会从父进程集成一份相同的环境变量副本。这意味着子进程拥有与父进程相同的初始环境变量。使用env打印当前bash进程的环境变量。使用export命令将一个本地变量导出为环境变量。
  3. 特殊变量:是环境变量中的一组预定义的特殊变量。特殊变量提供了对脚本执行环境、命令行参数、退出状态等信息的访问。$0 : 表示当前脚本的名称。在脚本中使用$0可以获取脚本的名称,包括路径。$1$2$3… : 表示脚本的位置参数或命令行参数。当脚本被调用时,可以通过$1$2等来获取传递给脚本的参数值。$1表示第一个参数,$2表示第二个参数,以此类推。$# : 表示命令行参数的个数。$#用于获取传递给脚本的参数的总数。$* : 表示所有命令行参数的列表。$*将所有命令行参数作为单个字符串返回。$@ : 表示所有命令行参数的列表。与$*不同,$@将命令行参数作为多个独立的字符串返回。$? : 表示上一个命令的退出状态。当命令执行完毕后,可以使用$?来获取其退出状态。通常,如果命令成功执行,则$?的值为0,否则为非零值。

命令代换

将命令的输出作为字符串嵌入到变量中,可以用反引号 ‘ 或美元符号加圆括号 $() 来表示命令代换。

条件判断

条件测试

方括号[是shell中用于进行条件测试的内建命令,也被称为test命令的等效形式。他常用于if语句、while循环和其他需要进行条件判断的地方。

方括号的基本语法为:

[ 条件表达式 ]

test的基本语法为:

test 条件表达式

条件表达式可以包含各种比较运算符、逻辑运算符和文件测试符,用于比较数值、字符串或检查文件属性。

字符串比较:

方括号和test命令支持用于字符串比较的运算符。常用的字符串比较运算符包括:

  • = : 判断两个字符串是否相等。
  • != : 判断两个字符串是否不相等。
  • -z : 判断字符串是否为空。
  • -n : 判断字符串长度是否非零。
整数比较:

方括号和test命令还支持用于整数比较的运算符。常用的整数比较运算符包括:

  • -eq : 判断两个整数是否相等。
  • -ne : 判断两个整数是否不相等。
  • -gt : 判断第一个整数是否大于第二个整数。
  • -lt : 判断第一个整数是否小于第二个整数。
  • -ge : 判断第一个整数是否大于等于第二个整数。
  • le : 判断第一个整数是否小于等于第二个整数。
文件属性和权限判断

方括号和test命令还用于检查文件的属性和权限。常用的文件测试运算符包括:

  • -e : 判断文件是否存在。
  • -f : 判断文件是否为普通文件。
  • -d : 判断文件是否为目录。
  • -r : 判断文件是否可读。
  • -w : 判断文件是否可写。
  • -x : 判断文件是否可执行。

if分支结构

if分支结构适用于根据条件的真假执行不同的代码块。它使用条件表达式来做判断,并根据条件的结果选择执行相应的代码块。if分支结构适用于处理复杂的条件逻辑和数值 / 字符串比较。

if语句的基本语法:

if condition
then
# 代码块1,条件为真时执行的代码
else
# 代码块2,条件为假时执行的代码
fi

在这个语法中,condition是一个条件表达式,用于判断真假。如果condition为真,则执行then后的代码块1,否则执行可选的else后的代码块2。

另一种形式的if语句是使用elif来实现多个条件判断,例如:

if condition1
then
# 代码块1,条件1为真时执行的代码
elif condition2
then
# 代码块2,条件2为真时执行的代码
else
# 代码块3,以上条件都为假时执行的代码
fi

case分支结构

在shell编程中,case语句用于根据模式匹配执行不同的操作。case语句类似于其他编程语言中的switch语句,可以根据不同的条件执行不同的代码块。

case语句通常具有以下结构

case expression in 
pattern1)
# 执行pattern1 匹配操作
;;
pattern2)
# 执行pattern2 匹配操作
;;
pattern3)
# 执行pattern3 匹配操作
;;
*)
# 如果没有匹配任何模式,则执行默认操作
;;
esac

case分支结构中,expression是需要匹配的表达式或变量。每个pattern是一个模式,用于于expression进行匹配。如果expression匹配了某个pattern,则执行对应的代码块。如果没有匹配到任何pattern,则执行*对应的代码块(默认情况)。

在每个pattern的代码块中,使用 ;; 表示代码块的结束。;; 是必须的,用于告诉解释器该分支的代码块已经执行完毕,终止当前分支。

case分支结构可以根据需要进行嵌套,以实现更复杂的条件判断和流程控制。可以根据具体的模式匹配需要,编写适当的模式和相应的代码块。

循环结构

for循环

适用范围:是一种常用的控制流程结构,用于重复执行相同或类似的任务。

语法形式:遍历列表、遍历范围和遍历命令输出

1. 遍历列表
for 变量 in 值列表
do
# 执行循环体操作
done
2. 遍历范围
for 变量 in {start..end}
do
# 执行循环体操作
done
3. 遍历命令输出
for 变量 in $(command)
do
# 执行循环体操作
done

while循环

while循环是一种常见的控制流程结构,用于重复执行一系列操作,直到给定的条件不再满足为止。

语法形式:

while 条件表达式
do
# 执行循环体操作
done

函数

函数是一种用于封装一组相关操作的代码块。函数可以被调用多次,并且可以接收参数和返回值,通过合理的适用函数,可以将复杂的脚本逻辑分解为可重用和可维护的模块,提高shell脚本的可读性、可维护性和可扩展性。

函数的定义和调用

函数定义的一般语法如下:

function name() {
# 函数体,包含一些列命令和逻辑
}

函数名可以由字母、数组和下划线组成,但不能以数字开头

要调用函数时,只需要适用函数名即可: name

例如:

#!/bin/bash

# 构造函数,通过函数打印hello world
function hello() {
echo "hello world"
}

hello

函数参数

函数可以接受参数,以便在函数内部适用。在函数定义中使用$1$2等特殊变量来引用传递给函数的参数。

函数返回值

函数可以通过return语句返回一个退出状态码,范围为0-255。在函数中使用return语句后,将退出函数并返回指定的状态码,可以通过$?得到返回值。

局部变量

在函数内部定义的变量默认是全局的,可以在函数外部访问。如果希望在函数内部创建局部变量,可以使用local关键字。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇