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

linux入门学习(介绍、常用命令、vim、shell)

文章目录

  • 前言
  • Linux介绍
    • Linux内核版本
    • Linux发行版本
    • Linux的安装(仅作参考)
    • Linux系统启动过程
      • 加载内核
      • 启动初始化进程init
      • 确定运行级别
      • 加载开机启动程序
      • 用户登录
    • Linux文件目录
    • 文件类型
  • Linux终端命令行格式
    • 查阅命令帮助信息
    • tab键自动补全
    • 终端命令行中的常用ctrl组合键
  • Linux终端命令
    • 列出目录的内容:ls
    • 显示文件元数据:stat
    • 文件访问权限
    • 修改文件权限:chmod
    • 文件内容查看
      • 基本显示:cat、tac
      • 显示行号:nl
      • 分屏显示:more、less
      • 取首尾n行:head、tail
    • 文件管理
      • 输出重定向:>
      • 管道:|
      • 清屏:clear
      • 切换工作目录: cd
      • 显示当前路径:pwd
      • 创建目录:mkdir
      • 删除文件:rm
      • 建立链接文件:ln
      • touch:创建空文件
      • 查找文件:find
      • 文本搜索grep
      • 拷贝文件:cp
      • 移动文件:mv
      • 归档管理:tar
      • 文件压缩解压:gzip
      • 文件压缩解压:zip、unzip
    • 系统管理
      • 查看当前日历:cal
      • 显示或设置时间:date
      • 查看网络状态:netstat
      • 查看进程信息:ps
      • 动态显示进程:top
      • 终止进程:kill
      • 关机重启:reboot、shutdown、init
      • 检测磁盘空间:df
      • 检测目录所占磁盘空间:du
      • 查看或配置网卡信息:ifconfig
      • 测试远程主机连通性:ping
  • vim
    • 什么是 vim?
    • 为什么要学习vim?
    • 使用vim打开文件
    • 工作模式
      • 命令模式
      • 输入模式
      • 底行模式
  • Shell编程
    • 介绍
    • shell脚本命名
    • shell语法
      • 第一个hello world
      • 单行注释
    • 变量
      • 定义变量
      • 使用变量
      • 只读变量
      • 删除变量
      • 从键盘获取值read
        • 案例一
        • 案例二
        • 案例三:读取多个值
      • 变量类型
        • 系统变量
        • 常见系统环境变量
        • 局部变量
    • Shell 函数
      • 案例一:
      • 案例二:带参数的函数
    • 文件包含(调用其他文件)
    • shell数据类型
      • 字符串
      • 数组
        • 定义数组
        • 读取数组元素值
        • 获取数组的长度
    • Shell基本运算符
      • 算术运算符
      • 关系运算符
      • 布尔运算符
      • 逻辑运算符
      • 字符串运算符
      • 文件测试运算符
      • test命令
    • Shell流程控制
      • if 语句语法格式
      • if else 语法格式
      • if else-if else语法格式
      • for循环格式
      • while循环
      • 死循环语法格式
      • until 循环
      • case
      • 跳出循环
  • 参考目录


前言

阅读本文前请注意最后编辑时间,文章内容可能与目前最新的技术发展情况相去甚远。欢迎各位评论与私信,指出错误或是进行交流等。
由于linux内容很多,本文并不能介绍所有知识。仅供参考


Linux介绍

Linux内核版本

内核(kernel)是系统的心脏,是运行程序和管理磁盘等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层。

Linux内核版本又分为稳定版和开发版
稳定版:具有工业级强度,可以广泛地应用和部署。新的稳定版相对于较旧的只是修正一些bug或加入一些新的驱动程序。
开发版:由于要试验各种解决方案,所以变化很快。

内核源码网址:http://www.kernel.org 所有来自全世界的对Linux源码的修改最终都会汇总到这个网站,由Linus领导的开源社区对其进行甄别和修改最终决定是否进入到Linux主线内核源码中。

Linux发行版本

Linux发行版 (也被叫做 GNU/Linux 发行版) 在内核基础上,通常还包含了包括桌面环境、办公套件、媒体播放器、数据库等应用软件。
目前市面上较知名的发行版有:Ubuntu、RedHat、CentOS、Debian、Fedora、SuSE、OpenSUSE、Arch Linux、SolusOS 等。
在这里插入图片描述

Linux的安装(仅作参考)

https://blog.csdn.net/2302_80269895/article/details/143213412

Linux系统启动过程

Linux系统的启动过程可以分为5个阶段:

  • 内核的引导。
  • 运行 init。
  • 系统初始化。
  • 建立终端 。
  • 用户登录系统。

加载内核

当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。

操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。
在这里插入图片描述

启动初始化进程init

内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。

init程序首先是需要读取配置文件/etc/inittab。
在这里插入图片描述

确定运行级别

许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。

init进程的一大任务,就是去运行这些开机启动的程序。

但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。

Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。
在这里插入图片描述

加载开机启动程序

在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。
在这里插入图片描述

用户登录

一般来说,用户的登录方式有三种:

  • (1)命令行登录
  • (2)ssh登录
  • (3)图形界面登录

在这里插入图片描述

Linux文件目录

在这里插入图片描述

  • /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录。
  • /bin: /usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。
  • /boot:放置linux系统启动时用到的一些文件,如Linux的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub。
  • /dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱 mount /dev/cdrom /mnt。
  • /etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有 /etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d。
  • /home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,表示当前用户的家目录,edu 表示用户 edu 的家目录。
  • /lib: /usr/lib: /usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。
  • /lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下。
  • /mnt: /media:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。
  • /opt:给主机额外安装软件所摆放的目录。
  • /proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有 /proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等。
  • /root:系统管理员root的家目录。
  • /sbin: /usr/sbin: /usr/local/sbin:放置系统管理员使用的可执行命令,如fdisk、shutdown、mount 等。与 /bin 不同的是,这几个目录是给系统管理员 root使用的命令,一般用户只能"查看"而不能设置和使用。
  • /tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
  • /srv:服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在 /srv/www 内。
  • /usr:应用程序存放目录,/usr/bin 存放应用程序,/usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local: 存放软件升级包。/usr/share/doc: 系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录。
  • /var:放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下。

从/目录开始描述的路径为绝对路径
从当前位置开始描述的路径为相对路径,如:

cd ../../
ls abc/def每个目录下都有**...**
. 表示当前目录
.. 表示上一级目录,即父目录
根目录下的.和…都表示当前目录

文件类型

文件的颜色含义
蓝色目录
绿色可执行文件
红色压缩文件
浅蓝色链接文件
灰色其他文件

Linux终端命令行格式

linux系统,如果是安装了有图形化界面的版本,可以和windows系统一样,通过图形化的操作实现部分操作。
但主要还是通过终端命令行的方式与Linux系统进行交互。
因此,我们需要学习linux终端命令行。

格式:

command [-options] [parameter]

说明:

  • command :命令名,相应功能的英文单词或单词的缩写
  • [-options] :选项,可用来对命令进行控制,也可以省略
  • parameter :传给命令的参数,可以是 零个、一个 或者 多个

查阅命令帮助信息

命令的选项 和 参数比较多,可以输入
command -help 显示 command 命令的帮助信息
man command 查阅 command 命令的使用手册(man 是 manual 的缩写,是 Linux 提供的一个 手册,包含了绝大部分的命令、函数的详细使用)
当进入查阅 command 命令的使用手册时, 有一些操作键可以帮助我们方便阅读手册。
在这里插入图片描述

tab键自动补全

在敲出命令的前几个字母的同时,按下tab键,系统会自动帮我们补全命令

终端命令行中的常用ctrl组合键

  • Ctrl+c 结束正在运行的程序
  • Ctrl+l 清屏,【是字母L的小写】等同于Clear
  • 当前光标到行首:ctrl+a
  • 当前光标到行尾:ctrl+e
  • Ctrl+x+u 撤销操作
  • ‌复制‌:Ctrl+Shift+C
  • 粘贴‌:Ctrl+Shift+V

Linux终端命令

列出目录的内容:ls

Linux文件或者目录名称最长可以有265个字符,“.”代表当前目录,“…”代表上一级目录,以“.”开头的文件为隐藏文件,需要用 -a 参数才能显示。

ls 目录

ls常用参数:

参数含义
-a显示指定目录下所有子目录与文件,包括隐藏文件
-l以列表方式显示文件的详细信息
-h配合 -l 以人性化的方式显示文件大小
[root@VM_0_9_centos ~]# ll -h
total 24K
-rw-r--r-- 1 root root 1.6K Dec  1  2016 CentOS7-Base-163.repo.1
-rw-r--r-- 1 root root 6.0K Nov 12  2015 mysql-community-release-el7-5.noarch.rpm
-rw-r--r-- 1 root root   90 Nov 23 10:26 passwd
drwxr-xr-t 2 root root 4.0K Nov 22 21:15 test
-rw-r--r-- 1 root root  276 Nov 24 10:01 user
lrwxrwxrwx 1 root root   14 Nov  6 19:18 web -> /var/www/html/

列出的信息的含义:
在这里插入图片描述
ls支持搭配通配符 查找并显示文件:

通配符含义
*代表文件名中所有字符
ls te*查找以te开头的文件
ls *html查找结尾为html的文件
代表文件名中任意一个字符
ls ?.c查找第一个字符任意,后缀为.c的文件
ls a.?查找前2字符为a.,最后一个字符任意的文件
[][”和“]”将字符组括起来,表示可以匹配字符组中的任意一个。“-”用于表示字符范围。
[abc]匹配a、b、c中的任意一个
[a-f]匹配从a到f范围内的的任意一个字符
ls [a-f]*查找从a到f范围内的的任意一个字符开头的文件
\转义字符
ls *a查找文件名为*a的文件

显示文件元数据:stat

stat [文件]# 例 stat file.txt
# 显示内容File: file.txtSize: 6140            Blocks: 16         IO Block: 4096   regular file
Device: fd01h/64769d    Inode: 394398      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-11-23 13:30:42.000000000 +0800
Modify: 2015-11-12 15:58:42.000000000 +0800
Change: 2019-11-23 13:30:42.400300171 +0800
Birth: -
元数据字段含义
Size文件大小
Inode文件唯一标识
Access文件权限
Access最后访问时间
Modify最后内容修改时间
Change最后元数据变更时间
Birth创建时间

文件访问权限

用户能够控制一个给定的文件或目录的访问程度,一个文件或目录可能 有读、写及执行权限:

  • 读权限(r) :对于文件,具有读取文件内容的权限;对于目录,具有浏览目录的权限。
  • 写权限(w) :对于文件,具有修改文件内容的权限;对于目录,具有创建、删除、移动目录内文件的权限。
  • 可执行权限(x): 对于文件,具有执行文件的权限;对于目录,该用户具有进入目录的权限。

通常,Unix/Linux系统只允许文件的属主(所有者)或超级用户改变文件的读写权限。

在这里插入图片描述
第1个字母代表文件的类型:

  • “d” 代表文件夹
  • “-” 代表普通文件
  • “c” 代表硬件字符设备
  • “b” 代表硬件块设备
  • “s”表示管道文件
  • “l” 代表软链接文件。

后9个字母分别代表三组权限:文件所有者、用户组、其他用户拥有的权限。

修改文件权限:chmod

chmod 修改文件权限有两种使用格式:字母法与数字法。

字母法:chmod u/g/o/a +/-/= rwx 文件
[ u/g/o/a ]含义
uuser 表示该文件的所有者
ggroup 表示与该文件的所有者属于同一组( group )者,即用户组
oother 表示其他以外的人
aall 表示这三者皆是
[ ±= ]含义
+增加权限
-撤销权限
=设定权限
rwx含义
rread 表示可读取
wwrite 表示可写入
xexcute 表示可执行

数字法:将rwx的权限利用 数字之和代替

rwx说明
r读取权限,数字代号为 “4”
w写入权限,数字代号为 “2”
x执行权限,数字代号为 “1”
-不具任何权限,数字代号为 “0”

如执行:chmod u=rwx,g=rx,o=r filename
就等同于:chmod u=7,g=5,o=4 filename

文件所有者:读、写、执行权限
同组用户:读、执行的权限
其它用户:读的权限

文件内容查看

Linux系统中使用以下命令来查看文件的内容:

  • cat 由第一行开始显示文件内容
  • tac 从最后一行开始显示(逆向显示)
  • nl 显示的时候,顺道输出行号
  • more 一页一页的显示文件内容,不支持向前翻页等功能
  • less 一页一页的显示文件内容 支持多项功能
  • head 只看头几行
  • tail 只看尾巴几行

基本显示:cat、tac

cat [-AbEnTv] filename

选项:

-A :相当于 -vET 的整合选项,列出特殊字符;
-v :列出一些看不出来的特殊字符
-E :将结尾的断行字节 $ 显示出来;
-T :将 [tab] 按键以 ^I 显示出来;
-b :列出行号,空白行不标行号
-n :列出行号,连同空白行也会有行号

显示行号:nl

nl [-bnw] 文件

选项与参数:

-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在荧幕的最左方显示;
-n rn :行号在自己栏位的最右方显示,且不加 0 ;
-n rz :行号在自己栏位的最右方显示,且加 0 ;
-w :行号栏位的占用的位数。

分屏显示:more、less

more运行后可以输入的命令有:
空白键 (space):代表向下翻一页;
Enter :代表向下翻『一行』;
/字串 :输入要查找的字符串(仅支持向前查找)。;
q :代表立刻离开 more ,不再显示该文件内容。
显示行号:按 =

less运行后可以输入的命令有:
空白键 :向下翻动一页;
b :向上翻动一页;
Enter :向下翻动一行;
k :向上翻动一行;
/字串 :向前搜寻『字串』的功能;
?字串 :向后搜寻『字串』的功能;
q :离开 less 这个程序;
显示行号:按 =

取首尾n行:head、tail

head [-n number] 文件 

选项与参数:
-n :后面接数字,代表显示几行的意思。没有选项与参数,默认显示前面的 10 行。

tail [-n number] 文件 

选项与参数:
-n :后面接数字,代表显示几行的意思。没有选项与参数,默认显示最后的 10 行。

文件管理

输出重定向:>

可将本应显示在终端上的内容保存到指定文件中。

如:ls > test.txt ( test.txt 如果不存在,则创建,存在则覆盖其内容 )

注意: >输出重定向会覆盖原来的内容,>>输出重定向则会追加到文件的尾部。

管道:|

管道:一个命令的输出可以通过管道 做为另一个命令的输入。
“ | ”的左右分为两端,从左端写入到右端。

清屏:clear

clear作用为清除终端上的显示

切换工作目录: cd

提醒:Linux所有的目录和文件名大小写敏感
cd后面可跟绝对路径,也可以跟相对路径。如果省略目录,则默认切换到当前用户的主目录。

命令含义
cd相当于cd ~
cd ~切换到当前用户的主目录(/home/用户目录)
cd .切换到当前目录
cd …切换到上级目录
cd -进入上次所在的目录

显示当前路径:pwd

python@ubuntu:~$ pwd 
/home/python

创建目录:mkdir

注意:新建目录的名称不能与当前目录中已有的目录或文件同名,并且目录创建者必须对当前目录具有写权限。

mkdir [-mp] 目录名称

选项与参数:
-m :指定被创建目录的权限,而不是根据默认权限 (umask) 设定
-p :递归创建所需要的目录

实例:-p递归创建目录:

[root@www ~]# cd /tmp
[root@www tmp]# mkdir test    <==创建一名为 test 的新目录
[root@www tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory `test1/test2/test3/test4': 
No such file or directory       <== 没办法直接创建此目录
[root@www tmp]# mkdir -p test1/test2/test3/test4

删除文件:rm

可通过rm删除文件或目录。使用rm命令要小心,因为文件删除后不能恢复。为了防止文件误删,可以在rm后使用-i参数以逐个确认要删除的文件。

常用参数及含义如下表所示:

参数含义
-i以进行交互式方式执行
-f强制删除,忽略不存在的文件,无需提示
-r递归地删除目录下的内容,删除文件夹时必须加此参数

建立链接文件:ln

软链接:ln -s 源文件 链接文件
硬链接:ln 源文件 链接文件

软链接类似于Windows下的快捷方式,如果软链接文件和源文件不在同一个目录,源文件要使用绝对路径,不能使用相对路径。

硬链接只能链接普通文件不能链接目录。 两个文件占用相同大小的硬盘空间,即使删除了源文件,链接文件还是存在。

touch:创建空文件

语法:touch [OPTION]… FILE…
touch命令用于创建一个或多个空文件。
touch test.txt会在当前目录下创建一个名为test.txt的空文件。

查找文件:find

find 命令通常用来在特定的目录下搜索符合条件的文件
find命令会从指定目录向下递归遍历各个子目录,从而找到满足条件的文件或目录。
语法:find [指定查找目录]… [OPTION]
OPTION常用可选值有以下几种,可以自由组合:

-name:按照名称查找,支持通配符。
-user:使用用户名查找。
-size :按照文件大小查找,+号表示大于,-号表示小于。
-perm:指定文件的权限。
-type :指定文件的类型,d为目录。

示例:
find -name test.txt:在当前目录下查找test.txt。
find / -name ‘*.txt’:从根目录下递归查找以.txt结尾的文件。
find -type d:查找当前目录下的所有目录。
find -size +100M/-100M:查找当前目录下大于100M/小于100M的文件。

文本搜索grep

grep命令是一种强大的文本搜索工具。
语法:grep [OPTION]… PATTERN [FILE]…
常用选项示例:
-n:显示行号。
-i:忽略大小写。

示例:cat 文件 | grep ‘搜索的字符’ 将文件中的内容使用grep进行搜索,|为管道符,可以将前一个命令的处理结果输出传递到后面的命令处理。
在这里插入图片描述

拷贝文件:cp

cp命令的功能是将给出的文件或目录复制到另一个文件或目录中
cp [OPTION]… SOURCE… DIRECTORY
递归复制目录需要使用-r选项。

移动文件:mv

语法:mv [OPTION]… SOURCE… DIRECTORY
mv命令有两个主要用途:一是重命名文件或目录,二是将文件或目录从一个位置移动到另一个位置。
重命名写法:mv old_filename new_filename

归档管理:tar

此命令可以把一系列文件归档到一个大文件中,也可以把档案文件解开以恢复数据。

tar [参数] 打包文件名 文件

常用参数:

参数含义
-c生成档案文件,创建打包文件
-v列出归档解档的详细过程,显示进度
-f指定档案文件名称,f后面一定是.tar文件,所以必须放选项最后
-t列出档案中包含的文件
-x解开档案文件

文件的打包与解开示例

python@ubuntu:~/test$ tar -cvf test.tar 1.txt 2.txt 3.txt 
1.txt
2.txt
3.txt
python@ubuntu:~/test$ ll
总用量 32
drwxrwxr-x  2 python python  4096 1121 14:02 ./
drwxr-xr-x 31 python python  4096 1121 13:34 ../
-rw-rw-r--  1 python python    51 120  2017 1.txt
-rw-rw-r--  1 python python    55 120  2017 2.txt
-rw-rw-r--  1 python python    51 120  2017 3.txt
-rw-rw-r--  1 python python 10240 1121 14:02 test.tar
python@ubuntu:~/test$ rm -rf *.txt
python@ubuntu:~/test$ ll
总用量 20
drwxrwxr-x  2 python python  4096 1121 14:03 ./
drwxr-xr-x 31 python python  4096 1121 13:34 ../
-rw-rw-r--  1 python python 10240 1121 14:02 test.tar
python@ubuntu:~/test$ tar -xvf test.tar 
1.txt
2.txt
3.txt
python@ubuntu:~/test$ ls *.txt
1.txt  2.txt  3.txt

文件压缩解压:gzip

tar与gzip命令结合使用实现文件打包、压缩。 tar只负责打包文件,但不压缩,用gzip压缩tar打包后的文件,其扩展名一般用xxxx.tar.gz。

gzip  [选项]  文件
选项含义
-d解压文件
-r压缩文件
python@ubuntu:~/test$ ll *.tar*
-rw-rw-r-- 1 python python 10240 1125 07:39 test.tar
python@ubuntu:~/test$ gzip -r test.tar test.tar.gz  ==>或者:gzip test.tar
python@ubuntu:~/test$ ll *.tar*
-rw-rw-r-- 1 python python 139 1125 07:39 test.tar.gz
python@ubuntu:~/test$ gzip -d test.tar.gz
python@ubuntu:~/test$ ll *.tar*  
-rw-rw-r-- 1 python python 10240 1125 07:39 test.tar

tar命令中-z选项可以调用gzip实现了一个压缩的功能,实行一个先打包后压缩的过程。

tar zcvf 压缩包包名 文件1 文件2

例如: tar zcvf test.tar.gz 1.c 2.c 3.c 4.c把 1.c 2.c 3.c 4.c 先打包后压缩成 test.tar.gz

python@ubuntu:~/test/code$ ls
1.c  2.c  3.c  4.c
python@ubuntu:~/test/code$ tar zcvf test.tar.gz 1.c 2.c 3.c 4.c 
python@ubuntu:~/test/code$ ls
1.c  2.c  3.c  4.c  test.tar.gz
tar zxvf 压缩包包名 #先解压再解包

.tar.gz 先解压后解包 到指定目录:-C (解压时可以不指定-z选项)

python@ubuntu:~/test/code$ ls number/     
python@ubuntu:~/test/code$ tar xvf test.tar.gz -C number/     
python@ubuntu:~/test/code$ ls number/                    
1.c  2.c  3.c  4.c

文件压缩解压:zip、unzip

通过zip压缩文件的目标文件不需要指定扩展名,默认扩展名为zip。

压缩文件:zip [-r] 目标文件 源文件
解压文件:unzip [-d 解压到指定目录] 压缩文件

系统管理

查看当前日历:cal

cal命令用于查看当前日历,-y显示整年日历:

python@ubuntu:~$ cal十一月 2019        
日 一 二 三 四 五 六  1  2  3  4  5  6  7  8  9  
10 11 12 13 14 15 16  
17 18 19 20 21 22 23  
24 25 26 27 28 29 30 

显示或设置时间:date

设置时间格式(需要管理员权限):

# 查看当前时间 date
# 自定义格式输出时间
date +format
# 例如
date +"今天是:%Y年%m月%d日 %H:%M:%S"
format格式含义
%Y,%y
%m
%d
%H
%M
%S

查看网络状态:netstat

netstat命令用于显示网络状态。

利用netstat指令可让你得知整个Linux系统的网络情况。

netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]

参数说明:

  • -a 显示所有连线中的Socket。
  • -A<网络类型> 列出该网络类型连线中的相关地址。
  • -c 持续列出网络状态。
  • -C 显示路由器配置的快取信息。
  • -e 显示网络其他相关信息。
  • -F显示FIB。
  • -g 显示多重广播功能群组组员名单。
  • -h 在线帮助。
  • -i 显示网络界面信息表单。
  • -l 显示监控中的服务器的Socket。
  • -M 显示伪装的网络连线。
  • -n 直接使用IP地址,而不通过域名服务器。
  • -N 显示网络硬件外围设备的符号连接名称。
  • -o 显示计时器。
  • -p 显示正在使用Socket的程序识别码和程序名称。
  • -r 显示Routing Table。
  • -s 显示网络工作信息统计表。
  • -t 显示TCP传输协议的连线状况。
  • -u 显示UDP传输协议的连线状况。
  • -v 显示指令执行过程。
  • -V显示版本信息。
  • -w 显示RAW传输协议的连线状况。
  • -x 此参数的效果和指定"-A unix"参数相同。
  • –ip 此参数的效果和指定"-A inet"参数相同。

常用:

[root@VM_0_9_centos ~]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name
tcp        0      0    0.0.0.0:22    0.0.0.0:*      LISTEN   3308/sshd
tcp6       0      0         :::80         :::*      LISTEN   4624/httpd

查看进程信息:ps

ps [options]

ps a 显示现行终端机下的所有程序,包括其他用户的程序。
ps -A 显示所有程序。
ps c 列出程序时,显示每个程序真正的指令名称,而不包含路 径,参数或常驻服务的标示。
ps -e 此参数的效果和指定"A"参数相同。
ps e 列出程序时,显示每个程序所使用的环境变量。
ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
ps -H 显示树状结构,表示程序间的相互关系。
ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
ps s 采用程序信号的格式显示程序状况。
ps u 以用户为主的格式来显示程序状况。
ps x 显示所有程序,不以终端机来区分。

动态显示进程:top

top命令用来动态显示运行中的进程。top命令能够在运行后,在指定的时间间隔更新显示信息。-d参数可以指定显示信息更新的时间间隔。

在top命令执行后,可以按下按键得到对显示的结果进行排序:

按键含义
M根据内存使用量来排序
P根据CPU占有率来排序
T根据进程运行时间的长短来排序
U可以根据后面输入的用户名来筛选进程
K可以根据后面输入的PID来杀死进程。
q退出
h获得帮助
python@ubuntu:~$ top
top - 08:31:54 up 2 min,  1 user,  load average: 0.25, 0.37, 0.17
Tasks: 271 total,   1 running, 270 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  0.0 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  4028880 total,  3210104 free,   331668 used,   487108 buff/cache
KiB Swap:  4192252 total,  4192252 free,        0 used.  3414856 avail Mem PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND    4827 redis     20   0   47204   6632   2300 S   0.3  0.2   0:00.21 redis-ser+ 6371 python    20   0   49000   3896   3176 R   0.3  0.1   0:00.12 top        1 root      20   0  119940   6112   4004 S   0.0  0.2   0:02.77 systemd    2 root      20   0       0      0      0 S   0.0  0.0   0:00.02 kthreadd   3 root      20   0       0      0      0 S   0.0  0.0   0:00.11 ksoftirqd+ 

输出字段说明:

pid:进程ID
ppid:父进程ID
user:进程所有者
%cpu:CPU占用百分比
%mem:内存占用百分比
rss:物理内存占用(KB)
vsz:虚拟内存占用(KB)
stat:进程状态(如S=休眠,R=运行)
cmd:完整命令行

终止进程:kill

kill命令指定进程号的进程,配合 ps/top 使用。

使用格式:

kill [-signal] pid

信号值从0到15,其中9为绝对终止,可以处理一般信号无法终止的进程。

关机重启:reboot、shutdown、init

命令含义
reboot重新启动操作系统
shutdown –r now重新启动操作系统,shutdown会给别的用户提示
shutdown -h now立刻关机
shutdown -h 20:25系统在今天的20:25 会关机
shutdown -h +10系统再过十分钟后自动关机
init 0关机
init 6重启

检测磁盘空间:df

df命令用于检测文件系统的磁盘空间占用和空余情况,可以显示所有文件系统对节点和磁盘块的使用情况。

选项含义
-a显示所有文件系统的磁盘使用情况
-m以1024字节为单位显示
-t显示各指定文件系统的磁盘空间使用情况
-T显示文件系统
python@ubuntu:~/test$ df -Th
文件系统       类型      容量  已用  可用 已用% 挂载点
udev           devtmpfs  2.0G     0  2.0G    0% /dev
tmpfs          tmpfs     394M  6.4M  388M    2% /run
/dev/sda1      ext4       21G  8.7G   11G   45% /
tmpfs          tmpfs     2.0G  256K  2.0G    1% /dev/shm
tmpfs          tmpfs     5.0M  4.0K  5.0M    1% /run/lock
tmpfs          tmpfs     2.0G     0  2.0G    0% /sys/fs/cgroup
tmpfs          tmpfs     394M   44K  394M    1% /run/user/1000
[root@VM_0_9_centos ~]# df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
/dev/vda1      ext4       50G  4.8G   42G  11% /
devtmpfs       devtmpfs  909M     0  909M   0% /dev
tmpfs          tmpfs     920M   24K  920M   1% /dev/shm
tmpfs          tmpfs     920M  472K  919M   1% /run
tmpfs          tmpfs     920M     0  920M   0% /sys/fs/cgroup
tmpfs          tmpfs     184M     0  184M   0% /run/user/0

检测目录所占磁盘空间:du

du命令用于统计目录或文件所占磁盘空间的大小,该命令的执行结果与df类似,du更侧重于磁盘的使用状况。

du [选项] 目录或文件名
选项含义
-a递归显示指定目录中各文件和子目录中文件占用的数据块
-s显示指定文件或目录占用的数据块
-b以字节为单位显示磁盘占用情况

查看或配置网卡信息:ifconfig

查看网卡信息。通过该命令可以获取网卡的IP地址、子网掩码、MAC地址等信息,帮助我们了解网络接口的配置情况。

测试远程主机连通性:ping

ping ip地址/域名
测试与某台主机的连通性。例如,ping www.baidu.com 可以测试当前主机与百度服务器之间的网络连接是否正常。

vim

什么是 vim?

Vim是从 vi 发展出来的一个文本编辑器。拥有代码补完、编译及错误跳转等方便编程的功能,在程序员中被广泛使用。vim 的官方网站 (http://www.vim.org)

为什么要学习vim?

vim是Linux上的文本编辑器(写代码的工具),有时候在我们的生产环境下我们的软件可能会出现各种各样的问题,这些问题都需要我们通过vim来解决

这里是一张vim的指令的键盘图
在这里插入图片描述
在我们使用的Linux操作系统上一般都会默认安装vim,不需要我们再次安装。我们可以直接输入vim回车查看是否安装,若显示效果如下则表示以安装。(使用ctrl + z返回)
在这里插入图片描述
若没有vim可使用下面的指令安装

yum install -y vim         //root下
sudo yum install -y vim    //普通用户下,使用sudo安装

使用vim打开文件

vim 文件名(我们可以直接使用vim 文件名打开文件编译,该文件不存在默认创建文件,该文件存在打开该文件)
在使用上述命令打开文件后,就进入vim全屏幕编辑画面:
用vim打开文件之后,默认处于[命令模式],随后对vim这三种工作模式进行介绍。

在这里插入图片描述

工作模式

vim可以分为三种状态:

  • 命令模式(command mode)
  • 插入模式(Insert mode)
  • 底行模式(last line mode)

在这里插入图片描述

命令模式

用户刚刚启动 vim,便进入了命令模式。 任何时候,不管用户处于何种模式,只要按一下ESC键,即可使Vi进入命令模式。此状态下敲击键盘动作会被Vim识别为命令。

在命令行模式下我们可以控制屏幕光标的移动,字符、字或行的删除,移动复制某区段、工作模式切换。

命令模式命令集:

1.切换到插入模式

  • 按【i】切换进入插入模式【insert mode】,按”i“进入插入模式后是从光标当前位置开始输入文件;
  • 按【a】进入插入模式后,是从目前光标所在位置的下一个位置开始插入文字;
  • 按【o】进入插入模式后,是插入新的一行,从行首开始输入文字。
  • 按【ESC】键从插入模式退回命令模式

2.光标移动

  • vim可以直接用光标来上下左右移动,但规定的vim是用小写英文字母 【h】、【j】、【k】、【l】,分别控制光标左、下、上、右移一格。
  • 按 【G】:移动到文章的最后
  • 按 【$】:移动到光标所在行的”行尾“
  • 按 【^】:移动到光标所在行的”行首“
  • 按 【w】:光标跳到下个字的开头
  • 按 【n + w】:光标跳到往后第n个字的开头
  • 按 【e】:光标跳到下个字的字尾
  • 按 【b】:光标回到上个字的开头
  • 按 【n + b】:光标跳到往前第n个字的开头
  • 按 【#】:光标移动到该行的第#个位置,如:51,561
  • 按 【gg】:进入到文本开始
  • 按 【shift + g】:进入文本末端
  • 按 【n + shift + g】:首先输入需要定位的行数n,在按shift + g贯标移至该行
  • ctrl+b:上移一页。
  • ctrl+f:下移一页。
  • ctrl+u:上移半页。
  • ctrl+d:下移半页。

3.删除文字

  • 【x】:每按一次,删除光标所在位置的一个字符
  • 【#x】:例如,【6x】表示删除光标所在位置的”后面(包括自己在内)“6个字符
  • 【X】:大写的X,每按一次,删除光标所在位置的”前面“一个字符
  • 【#X】:例如,【20X】表示删除光标所在位置的”前面“20个字符
  • 【dd】:剪切所在行(在使用p进行粘贴,不使用p操作即为删除)
  • 【#dd】:从光标所在行开始剪切#行

4.复制

  • 【yw】:将光标所在之处到字尾的字符复制到缓冲区中。
  • 【#yw】:复制#个字到缓冲区
  • 【yy】:复制光标所在行到缓冲区
  • 【#yy】:例如,【6yy】表示拷贝从光标所在行“往下数”6行文字
  • 【p】:将缓冲区内的字符贴到光标所位置。注意:所有与”y“有关的复制命令都必须与”p“配合才能完成复制与粘贴功能。

5.替换

  • 【r】:替换光标所在处的字符
  • 【R】:替换光标所到之处的字符,直到按下【ESC】键为止

6.撤销上一次操作

  • 【u】:如果您误执行一个命令,可以马上按下【u】,回到上一个操作。按多次”u“可以执行多次回复
  • 【ctrl + r】:撤销的恢复

7.更改

  • 【cw】:更改光标所在处的字到字尾处
  • 【c#w】:例如,【c3w】表示更改3个字
  • 【shift + ~】:进行大小写切换
  • 【r】+【替换的字符】:先按r后在按需要替换的字符,光标所指字符就替换为要替换的字符了
  • 【n+r】+【替换的字符】:增加n表示替换光标所在位置后的n个字符。
  • 【shift + r】:进入替换模式(使用【ESC】退出该模式)进入替换模式后,vi 画面的左下角处会出现『–REPLACE–』的字样

8.跳至指定的行

  • 【ctrl】+【g】列出光标所在行的行号。
  • 【#G】:例如,【15G】,表示移动光标至文章的第15行行首。

输入模式

在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。在文本输入过程中,若想回到命令模式下,按键ESC即可。
在这里插入图片描述

底行模式

在命令模式下按下:(英文冒号)就进入了底行模式。
底线模式可以输入单个或多个字符的命令,可用的命令非常多(如下所示)。

:set nu 列出行号
:set nonu	取消行号
:#7 跳到文件中的第7/keyword 查找字符  按n向下
?keyword 查找字符  按N向下
:n1,n2/word1/word2/gc  替换指定范围单词,c表示提示
:w 保存文件
:w filename 以指定的文件名另存
:n1,n2 w [filename]	将 n1 到 n2行另存
:r [filename]	读入另一个文件加到光标所在行后面
:! ls /home  在vi当中察看ls输出信息!
:q离开vi
:wq 和 :ZZ 和 :x 保存并退出vi
!强制执行
:% s/^/#/g 来在全部内容的行首添加 # 号注释
:1,10 s/^/#/g 在1~10 行首添加 # 号注释  

按ESC键可随时退出底线模式,回到命令模式。

常用操作:

命令说明
:w保存编辑数据
:q离开 vi
:q!若曾修改过文件,又不想储存,使用 ! 为强制离开不储存文件。
:wq保存并离开vim
ZZ若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开!
:w [filename]另存为
:r [filename]将另一个文件『filename』的数据加到光标所在行后面
:n1,n2 w [filename]将 n1 到 n2 行的内容储存成 filename 这个文件。
:set nu会在每一行的前缀显示该行的行号
:set nonu取消行号显示

Shell编程

介绍

这里说的Shell 脚本(shell script),是在Linux 环境下运行的脚本程序。Shell 脚本是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)。

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器(前文已介绍了vim)和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……

Bash(Bourne Again Shell)是大多数Linux 系统默认的 Shell,在一般情况下,并不区分 Bourne Shell 和 Bourne Again Shell。
查看自己linux系统的默认解析:echo $SHELL
在这里插入图片描述

shell脚本命名

  • shell脚本命名:Shell脚本名称命名一般为英文、大写、小写,后缀以.sh 结尾
  • 不能使用特殊符号、空格
  • 见名知意,名称要写的一眼可以看出功能

shell语法

第一个hello world

# 创建一个Helloword.sh 文件
[root@aly_server01~] touch Helloword.sh# 使用vim编辑Helloword.sh 文件
[root@aly_server01~] vim Helloword.sh# 以下两行为脚本内容
#!/bin/bash
echo "hello world"[root@aly_server01~]# ll Helloword.sh 
-rw-r--r-- 1 root root 85 Sep 20 22:26 Helloword.sh# 赋予执行权限
[root@aly_server01~]# chmod o+x Helloword.sh # 运行helloword.sh 脚本
[root@aly_server01~]# ./Helloword.sh 
hello world

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
echo 命令用于向窗口输出文本。
运行 Shell 脚本,默认情况下,一定要写成 ./Helloword.sh,而不是 Helloword.sh,运行其它二进制的程序也一样。
如果不加./的话, 会默认去找PATH环境变量中是否存在该脚本 并执行。除非将当前目录.加入到PATH环境变量中

另外一种执行方式:bash ./xxx.sh 指明先用bash解析器解析,如果bash不存在 才会使用默认解析器

单行注释

单个"#"号代表注释当前行
在这里插入图片描述

变量

定义变量

格式 :变量名=变量值
如:num=10

变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量

在变量名前面加美元符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

加花括号可以帮助解释器识别变量的边界,比如:

for skill in Ada Coffe Action Java; doecho "I am good at ${skill}Script"
done

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

python@ubuntu:~/shell$ myUrl="http://www.google.com"
python@ubuntu:~/shell$ readonly myUrl
python@ubuntu:~/shell$ myUrl="http://www.baidu.com"
-bash: myUrl: 只读变量

删除变量

使用 unset 命令可以删除变量,但不能删除只读变量:

#!/bin/sh
myUrl="http://www.baidu.com"
unset myUrl
echo $myUrl

从键盘获取值read

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

案例一

在这里插入图片描述

在这里插入图片描述

案例二

在一行上显示和添加提示 需要加上-p
在这里插入图片描述
在这里插入图片描述

案例三:读取多个值

在这里插入图片描述
在这里插入图片描述

变量类型

系统变量
# Shell常见的变量之一系统变量,主要是用于对参数判断和命令返回值判断时使用,系统变量详解如下:$0 		当前脚本的名称;
$n 		当前脚本的第n个参数,n=1,2,9;
$* 		当前脚本的所有参数(不包括程序本身);
$# 		当前脚本的参数个数(不包括程序本身);
$? 		程序执行完后返回的状态,返回0表示执行成功;
$$ 		程序本身的PID号。

在这里插入图片描述
在这里插入图片描述

常见系统环境变量

系统环境变量是系统提供的共享变量.是linux系统加载Shell的配置文件中定义的变量共享给所有的Shell程序使用

PATH  		命令所示路径,以冒号为分割;
HOME  		打印用户家目录;
SHELL 		显示当前Shell类型;
USER  		打印当前用户名;
ID    		打印当前用户id信息;
PWD   		显示当前所在路径;
TERM  		打印当前终端类型;
HOSTNAME    显示当前主机名;
PS1         定义主机命令提示符的;
HISTSIZE    历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间;
RANDOM      随机生成一个 032767 的整数;
HOSTNAME    主机名

系统环境变量输出演示
在这里插入图片描述

局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

Shell 函数

shell中函数的定义格式如下:

[ function ] funname[()]
{action;[return int;]
}

案例一:

#!/bin/bashfunWithReturn(){echo "这个函数会对输入的两个数字进行相加运算..."echo "输入第一个数字: "read aNumecho "输入第二个数字: "read anotherNumecho "两个数字分别为 $aNum 和 $anotherNum !"return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

输出结果:

这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 12 !
输入的两个数字之和为 3 !

函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…

案例二:带参数的函数

#!/bin/bashfunWithParam(){echo "第一个参数为 $1 !"echo "第二个参数为 $2 !"echo "第十个参数为 $10 !"echo "第十个参数为 ${10} !"echo "第十一个参数为 ${11} !"echo "参数总数有 $# 个!"echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

输出结果:

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

当n>=10时,需要使用${n}来获取参数。对于这些特殊字符 可参考上文的系统变量这一小节

文件包含(调用其他文件)

Shell 文件包含的语法格式如下:

. filename   # 注意点号(.)和文件名中间有一空格
或
source filename

实例

创建两个 shell 脚本文件。
test1.sh 代码如下:

#!/bin/bashurl="http://www.baidu.com"

test2.sh 代码如下:

#!/bin/bash#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.shecho "url地址:$url"

接下来,我们为 test2.sh 添加可执行权限并执行:

$ chmod +x test2.sh 
$ ./test2.sh 
url地址:http://www.baidu.com

**注:**被包含的文件 test1.sh 不需要可执行权限。

shell数据类型

字符串

字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号:

str='this is a string'

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号:

your_name='taobao'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
# 输出结果为:
Hello, I know you are "taobao"! 

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

拼接字符串:

your_name="taobao"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

输出结果为:

hello, taobao ! hello, taobao !
hello, taobao ! hello, ${your_name} !

在这里插入图片描述

数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
数组元素的下标由 0 开始编号。

定义数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

或单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
读取数组元素值
valuen=${array_name[n]}

例子:

#!/bin/bashmy_array=(A B C D)echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D

使用 @或* 符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

例子:

#!/bin/bashmy_array[0]=A
my_array[1]=B
my_array[2]=C
my_array[3]=Decho "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

执行脚本,输出结果如下所示:

$ chmod +x test.sh 
$ ./test.sh
数组的元素为: A B C D
数组的元素为: A B C D
获取数组的长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

Shell基本运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
+加法expr $a + $b 结果为 30
-减法expr $a - $b 结果为 -10
*乘法expr $a * $b 结果为 200
/除法expr $b / $a 结果为 2
%取余expr $b % $a 结果为 0
=赋值a=$b 将把变量 b 的值赋给 a
==相等用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false
!=不相等用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true

注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2。
完整的表达式要被 ` 包含,这个字符是反引号在 Esc 键下边。

算术运算符实例如下:

#!/bin/basha=10
b=20val=`expr $a + $b`
echo "a + b : $val"val=`expr $a - $b`
echo "a - b : $val"val=`expr $a \* $b`
echo "a * b : $val"val=`expr $b / $a`
echo "b / a : $val"val=`expr $b % $a`
echo "b % a : $val"if [ $a == $b ]
thenecho "a 等于 b"
fi
if [ $a != $b ]
thenecho "a 不等于 b"
fi

执行脚本,输出结果如下所示:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ]返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。
#!/bin/basha=10
b=20if [ $a -eq $b ]
thenecho "$a -eq $b : a 等于 b"
elseecho "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
thenecho "$a -ne $b: a 不等于 b"
elseecho "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
thenecho "$a -gt $b: a 大于 b"
elseecho "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
thenecho "$a -lt $b: a 小于 b"
elseecho "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
thenecho "$a -ge $b: a 大于或等于 b"
elseecho "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
thenecho "$a -le $b: a 小于或等于 b"
elseecho "$a -le $b: a 大于 b"
fi

执行脚本,输出结果如下所示:

10 -eq 20: a 不等于 b
10 -ne 20: a 不等于 b
10 -gt 20: a 不大于 b
10 -lt 20: a 小于 b
10 -ge 20: a 小于 b
10 -le 20: a 小于或等于 b

布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
!非运算表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o或运算有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
#!/bin/basha=10
b=20if [ $a != $b ]
thenecho "$a != $b : a 不等于 b"
elseecho "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
thenecho "$a 小于 100 且 $b 大于 15 : 返回 true"
elseecho "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
thenecho "$a 小于 100 或 $b 大于 100 : 返回 true"
elseecho "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
thenecho "$a 小于 5 或 $b 大于 100 : 返回 true"
elseecho "$a 小于 5 或 $b 大于 100 : 返回 false"
fi

执行脚本,输出结果如下所示:

10 != 20 : a 不等于 b
10 小于 10020 大于 15 : 返回 true
10 小于 10020 大于 100 : 返回 true
10 小于 520 大于 100 : 返回 false

逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
#!/bin/basha=10
b=20if [[ $a -lt 100 && $b -gt 100 ]]
thenecho "返回 true"
elseecho "返回 false"
fiif [[ $a -lt 100 || $b -gt 100 ]]
thenecho "返回 true"
elseecho "返回 false"
fi

执行脚本,输出结果如下所示:

返回 false
返回 true

字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否为0,不为0返回 true。[ -n “$a” ] 返回 true。
$检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。
#!/bin/basha="abc"
b="efg"if [ $a = $b ]
thenecho "$a = $b : a 等于 b"
elseecho "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
thenecho "$a != $b : a 不等于 b"
elseecho "$a != $b: a 等于 b"
fi
if [ -z $a ]
thenecho "-z $a : 字符串长度为 0"
elseecho "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
thenecho "-n $a : 字符串长度不为 0"
elseecho "-n $a : 字符串长度为 0"
fi
if [ $a ]
thenecho "$a : 字符串不为空"
elseecho "$a : 字符串为空"
fi

执行脚本,输出结果如下所示:

abc = efg: a 不等于 b
abc != efg : a 不等于 b
-z abc : 字符串长度不为 0
-n abc : 字符串长度不为 0
abc : 字符串不为空

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:

操作符说明举例
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false。
-p file检测文件是否是有名管道,如果是,则返回 true。[ -p $file ] 返回 false。
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
-r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
-w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true。

变量 file 表示文件 /var/www/runoob/test.sh,它的大小为 100 字节,具有 rwx 权限。下面的代码,将检测该文件的各种属性:

#!/bin/bashfile="/var/www/runoob/test.sh"
if [ -r $file ]
thenecho "文件可读"
elseecho "文件不可读"
fi
if [ -w $file ]
thenecho "文件可写"
elseecho "文件不可写"
fi
if [ -x $file ]
thenecho "文件可执行"
elseecho "文件不可执行"
fi
if [ -f $file ]
thenecho "文件为普通文件"
elseecho "文件为特殊文件"
fi
if [ -d $file ]
thenecho "文件是个目录"
elseecho "文件不是个目录"
fi
if [ -s $file ]
thenecho "文件不为空"
elseecho "文件为空"
fi
if [ -e $file ]
thenecho "文件存在"
elseecho "文件不存在"
fi

执行脚本,输出结果如下所示:

文件可读
文件可写
文件可执行
文件为普通文件
文件不是个目录
文件不为空
文件存在

test命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符串和文件三个方面的测试,搭配基础运算符使用。
test 命令在现代 shell 脚本中通常被 [] 替换,具有相同的功能。两者可以互换使用。

举例一:数值测试(判断是否相等)

test "111" -eq  "111" && echo "相等" || echo "不相等"
# 下面是一种等价写法,需要注意的是中括号和条件之间需要有至少一个空格
[ "111" -eq  "111" ] && echo "相等" || echo "不相等"

举例二:字符串比较(判断是否相等)

test "aaa" = "aaa" && echo "字符串相等" || echo "字符串不相等"
# 下面是一种等价写法,需要注意的是中括号和条件之间需要有至少一个空格
[ "aaa" = "aaa" ] && echo "字符串相等" || echo "字符串不相等"

举例三: 文件测试(判断是否存在)

test -e /etc/passwd && echo "是文件" || echo "不是文件"
# 下面是一种等价写法,需要注意的是中括号和条件之间需要有至少一个空格
[ -e /etc/passwd ] && echo "是文件" || echo "不是文件"

Shell流程控制

if 语句语法格式

if condition
thencommand1 command2...commandN 
fi

if else 语法格式

if condition
thencommand1 command2...commandN
elsecommand
fi

if else-if else语法格式

if condition1
thencommand1
elif condition2 
then command2
elsecommandN
fi

for循环格式

for var in item1 item2 ... itemN
docommand1command2...commandN
done

while循环

while condition
docommand
done

示例

#!/bin/bash
int=1
while(( $int<=5 ))
doecho $intlet "int++"
done

while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按Ctrl-D结束循环。

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
doecho "是的!$FILM 是一个好网站"
done

运行脚本,输出类似下面:

按下 <CTRL-D> 退出
输入你最喜欢的网站名:淘宝
是的!淘宝 是一个好网站

死循环语法格式

while :
docommand
done

或者

while true
docommand
done# 或者
for (( ; ; ))

until 循环

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

until condition
docommand
done

condition 为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

case

Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;
esac

跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。

break命令允许跳出所有循环(终止执行后面的所有循环)。

下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。

#!/bin/bash
while :
doecho -n "输入 1 到 5 之间的数字:"read aNumcase $aNum in1|2|3|4|5) echo "你输入的数字为 $aNum!";;*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"break;;esac
done

continue命令与break命令类似,它不会跳出所有循环,仅仅跳出当前循环。


参考目录

https://www.bilibili.com/video/BV1vk4y1r7cW
https://blog.csdn.net/weixin_44895651/article/details/105289038
https://blog.csdn.net/lydms/article/details/101368670
https://blog.csdn.net/weixin_45075226/article/details/146059491
https://blog.csdn.net/liuwei0376/article/details/88245472
https://blog.csdn.net/as604049322/article/details/120446586
https://blog.csdn.net/leah126/article/details/131558171
https://blog.csdn.net/qq_41877371/article/details/119569877
https://blog.csdn.net/m0_52094687/article/details/128542024

相关文章:

linux入门学习(介绍、常用命令、vim、shell)

文章目录 前言Linux介绍Linux内核版本Linux发行版本Linux的安装&#xff08;仅作参考&#xff09;Linux系统启动过程加载内核启动初始化进程init确定运行级别加载开机启动程序用户登录 Linux文件目录文件类型 Linux终端命令行格式查阅命令帮助信息tab键自动补全终端命令行中的常…...

archlinux中挂载macOS的硬盘

问&#xff1a; 你好&#xff0c;我如何在archlinux中挂载macOS的硬盘呢&#xff1f;/dev/sda4 5344161792 7813773311 2469611520 1.2T Apple HFS/HFS AI回答&#xff1a; 你好&#xff01;在 Arch Linux 中挂载 macOS 的 HFS 或 HFS 硬盘&#xff08;例如 /dev/sda4&#x…...

Java Web 应用安全响应头配置全解析:从单体到微服务网关的实践

背景&#xff1a;为什么安全响应头至关重要&#xff1f; 在 Web 安全领域&#xff0c;响应头&#xff08;Response Headers&#xff09;是防御 XSS、点击劫持、跨域数据泄露等攻击的第一道防线。通过合理配置响应头&#xff0c;可强制浏览器遵循安全策略&#xff0c;限制恶意行…...

Generative Diffusion Prior for Unified Image Restoration and Enhancement论文阅读

Generative Diffusion Prior for Unified Image Restoration and Enhancement 1. 论文的研究目标及实际意义1.1 研究目标1.2 实际问题与产业意义2. 论文的创新方法及公式解析2.1 核心思路2.2 关键公式与算法2.2.1 DDPM基础2.2.2 条件引导概率建模2.2.3 两种引导策略2.2.4 退化模…...

MongoDB 的主要优势和劣势是什么?适用于哪些场景?

MongoDB 的主要优势 (Advantages) 灵活的文档模型 (Flexible Document Model): 无需预定义模式 (Schemaless/Flexible Schema): 这是 MongoDB 最核心的优势之一。它存储 JSON 格式的文档&#xff0c;每个文档可以有不同的字段和结构。这使得在开发过程中修改数据结构非常容易&a…...

人脸识别备案:筑牢人脸信息 “安全墙”

人脸识别备案制度主要依据《人脸识别技术应用安全管理办法》建立&#xff0c;人脸识别技术广泛应用于安防、金融、门禁、交通等领域&#xff0c;带来便利高效的同时&#xff0c;人脸信息安全问题也引发担忧。为规范技术应用、保护个人信息权益&#xff0c;人脸识别备案制度应运…...

Excelize 开源基础库发布 2.9.1 版本更新

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库&#xff0c;基于 ECMA-376&#xff0c;ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Excel、WPS、OpenOffice 等办公软件创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式&#xf…...

工具类------对象与 Map 之间的相互转换

entity2Map - 将 Java 对象转换为 Mapmap2Entity - 将 Map 转换为 Java 对象 package com.toolconclusion.transition;import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map;public class E…...

BGP实验练习2

需求&#xff1a; 1.AS1存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xff0c;该地址不能再任何协议中宣告 AS3存在两个环回&#xff0c;该地址不能再任何协议中宣告 AS1还有一个环回地址为10.1.1.0/24&#xff0c;AS3另一个环回地址是11.1.1.0/24 最终要求这两…...

centos7.x下,使用宝塔进行主从复制的原理和实践

操作原理&#xff1a; 一、主库配置 1.修改 MySQL 配置文件 # 编辑主库配置文件&#xff08;路径根据实际系统可能不同&#xff09; vim /etc/my.cnf # 添加以下配置 [mysqld] server-id 1 # 唯一 ID&#xff0c;主库设置为 1 log-bin mysql-bin …...

项目图标组件处理

我们如何复用项目里的图标&#xff0c;如何维护和引用图标&#xff1f; 为了形成便于使用的图标库&#xff0c;做了如下调研&#xff1a; iconfont&#xff08;webfont&#xff09;unocsssvgriconParkunplugin-icons 我们希望达到的目的 开发自行维护&#xff0c;而不是由设…...

el-tree结合checkbox实现数据回显

组件代码 <el-tree:data"vertiList"show-checkboxnode-key"id":props"defaultProps"ref"treeRefx"class"custom-tree"check-change"handleCheckChange"> </el-tree>获取选择的节点 handleCheckChan…...

虚拟机Ubuntu系统怎么扩展容量,扩展容量后进不去系统怎么办?

当我解压大文件时&#xff0c;突然报错&#xff0c;说我空间不足&#xff0c;我关闭虚拟机&#xff0c;删除了快照&#xff0c;在设置里点击扩展容量后&#xff0c;发现进不去系统了。 1.扩展容量 扩展容量需要关闭快照&#xff0c;请提前做好数据备份&#xff01; 2.进不去界…...

道通EVO MAX系列无人机-支持二次开发

道通EVO MAX系列无人机-支持二次开发 EVO Max 系列采用Autel Autonomy自主飞行技术&#xff0c;实现复杂环境下的全局路径规划、3D场景重建、自主绕障和返航&#xff1b;高精度视觉导航能力&#xff0c;使其在信号干扰强、信号遮挡、信号弱等复杂环境下&#xff0c;依然获得高精…...

解构认知边界:论万能方法的本体论批判与方法论重构——基于跨学科视阈的哲学-科学辩证

一、哲学维度的本体论批判 &#xff08;1&#xff09;理性主义的坍缩&#xff1a;从笛卡尔幻想到哥德尔陷阱 笛卡尔在《方法论》中构建的理性主义范式&#xff0c;企图通过"普遍怀疑-数学演绎"双重机制确立绝对方法体系。然而哥德尔不完备定理&#xff08;Gdel, 19…...

论文学习_Understanding the AI-powered Binary Code Similarity Detection

摘要&#xff1a;近年来&#xff0c;AI驱动的二进制代码相似性检测&#xff08;Binary Code Similarity Detection, 简称 BinSD&#xff09;已广泛应用于程序分析领域。该技术通过神经网络将复杂的二进制代码比较问题转化为代码嵌入向量之间的距离度量。然而&#xff0c;由于现…...

使用PHP对接日本股票市场数据

本文将介绍如何通过StockTV提供的API接口&#xff0c;使用PHP语言来获取并处理日本股票市场的数据。我们将以查询公司信息、查看涨跌排行榜和实时接收数据为例&#xff0c;展示具体的操作流程。 准备工作 首先&#xff0c;请确保您已经从StockTV获得了API密钥&#xff0c;并且…...

(vue)el-steps从别的页面跳转进来怎么实现和点击同样效果

(vue)el-steps从别的页面跳转进来怎么实现和点击同样效果 需求&#xff1a; 解决思路&#xff1a;监听路由&#xff0c;给active赋值对应下标 组件&#xff1a; <el-steps:active"active"finish-status"process"class"steps custom-steps":…...

什么是原码和补码

补码的本质确实是模运算&#xff08;Modular Arithmetic&#xff09;&#xff0c;这是理解补码为何能统一加减法的核心数学原理。下面用最通俗的语言和例子解释清楚&#xff1a; —### 1. 先理解什么是“模运算”- 模运算就是“周期性计数”&#xff0c;比如钟表&#xff1a; -…...

vscode 同一个工作区,不同文件夹之间跳转问题

你说的问题&#xff0c;其实和 VS Code 的「工作区」机制、c_cpp_properties.json、compile_commands.json 或 LSP 后端&#xff08;如 clangd&#xff09;的索引行为有关。 ⸻ &#x1f4cc; 你的现象总结&#xff1a; 操作方式 是否能跳转 说明 打开整个上层文件夹&#x…...

嵌入式学习--江协51单片机day5

江协每个模块的学习都是第一集讲原理&#xff0c;第二集将简单应用。如果比较着急的&#xff0c;可以不看第一集&#xff0c;只要明白怎么用就行。 今天学习DS1302时钟和蜂鸣器 DS1302 内部原理图&#xff0c;DS1302是有内部电源&#xff0c;电源的引脚名要注意 这两个原理图…...

记录算法笔记(2025.5.13)二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] …...

关于github使用总结

文章目录 一、本地使用git&#xff08;一&#xff09;创建一个新的本地Git库首先在本地创建一个新的git仓库然后进行一次初始提交提交过后就可以查看提交记录 &#xff08;二&#xff09;在本地仓库进行版本恢复先执行 git log 查看项目提交历史使用 git checkout 恢复版本 二、…...

进程与线程:09 进程同步与信号量

课程引入&#xff1a;进程同步与信号量 接下来这节课开始&#xff0c;我们再开始讲多进程图像。讲多进程图像的下一个点&#xff0c;前面我们讲清楚了多进程图像要想实现切换&#xff0c;调度是如何做的。同时&#xff0c;多个进程放在内存中&#xff0c;就会存在多进程合作的…...

鸿蒙 Core File Kit(文件基础服务)之简单使用文件

查看常用的沙箱目录 应用沙箱文件访问关系图 应用文件目录结构图 Entry Component struct Index {build() {Button(查看常用的沙箱目录).onClick(_>{let ctx getContext() // UI下只能使用这个方法&#xff0c;不能 this.contextconsole.log(--应用缓存文件保存目录&#x…...

游戏引擎学习第277天:稀疏实体系统

回顾并为今天定下基调 上次我们结束的时候&#xff0c;基本上已经控制住了跳跃的部分&#xff0c;达到了我想要的效果&#xff0c;现在我们主要是在等待一些新的艺术资源。因此&#xff0c;等新艺术资源到位后&#xff0c;我们可能会重新处理跳跃的部分&#xff0c;因为现在的…...

基于Win在VSCode部署运行OpenVINO模型

一、准备工作 1、Python 下载Win平台的Python安装包&#xff0c;添加环境变量&#xff0c;测试&#xff1a; python --version 在VSCode里&#xff08; CtrlShiftP 打开命令面板&#xff09;&#xff0c;指定Python解释器为上面安装路径。写一个python脚本运行测试。 2、虚…...

关于maven的依赖下不下来的问题

相信大家对于maven下不下依赖会感到很烦&#xff0c;这里就来给大家进行解惑。 首先maven依赖报错基本是两种情况&#xff0c;一个是下载报错&#xff0c;这种情况就要考虑是否在maven的setting.xml文件中配了阿里云的相关配置没&#xff0c;其次就要检查是否真的存在这个依赖…...

按键精灵ios脚本新增元素功能助力辅助工具开发(一)

元素节点功能&#xff08;iOSElement&#xff09;​ 在按键精灵 iOS 新版 APP v2.2.0 中&#xff0c;新增了元素节点功能 iOSElement&#xff0c;该功能包含共 15 个函数。这一功能的出现&#xff0c;为开发者在处理 iOS 应用界面元素时提供了更为精准和高效的方式。通过这些函…...

【数据结构】——栈和队列OJ

一、有效的括号 题目链接&#xff1a; 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 题目的要求很简单&#xff0c;就是要求我们判断其输入的括号字符串是否是有效的括号&#xff0c;那么我们要如何判断呢&#xff1f; 我们可以这样&#xff0c;我们遍历出传入的…...

Windows部署LatentSync唇形同步(字节跳动北京交通大学联合开源)

#工作记录 一、前言 LatentSync&#xff1a;基于音频驱动的端到端唇形同步框架​ LatentSync是由ByteDance开源的一个先进唇形同步框架&#xff0c;旨在通过音频条件驱动的潜在扩散模型实现高精度的唇形同步。与传统基于像素空间扩散或两阶段生成的方法不同&#xff0c;Late…...

MySQL:关系模型的基本理论

系列文章目录 1.关系模型的基本概念 2.数据库的完整性 文章目录 系列文章目录前言一、关系模型的基本概念 1.基本术语&#xff1a; 2.关系的特征二、数据库的完整性 1.常见用例&#xff1a;2.三类完整性原则3.MySQL提供的约束 三、触发器 1.触发器的定义 2.…...

9.1 C#控制SW中零件的变色与闪烁

本文介绍:装配件中某零件隐藏与显示、零件的颜色修改。 探讨本话题的目的是为了实现如下目的:如果某个气缸报警,那么3D中该气缸红色并闪烁。 目前,当勾选部件1闪烁时,零件1-1将在显示与隐藏之间闪烁。 示例代码放到如下位置: C#与solidworks示例1-零部件的显示与隐藏资源…...

Spring Boot 跨域问题全解:原理、解决方案与最佳实践

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、跨域问题的本质 1.1 什么是跨域&#xff1f; 跨域&#xff08;Cross-Origin&#xff09;问题源于浏览器的同源策略&#xff08;Same-Origin Policy&…...

C++学习之路,从0到精通的征途:继承

目录 一.继承的概念及定义 1.继承的概念 2.继承的定义 (1)继承的定义格式 (2)继承基类成员访问方式的变化 二.基类与派生类间的转换 1.派生类对象赋值给基类的引用/指针 2. 派生类对象直接赋值给基类对象 三.继承的作用域 四.派生类的默认成员函数 1.构造函数 2.拷…...

从零开始掌握FreeRTOS(2)链表之节点的定义

目录 节点 节点定义 节点实现 根节点 根节点定义 精简节点定义 根节点实现 在上篇文章,我们完成了 FreeRTOS 的移植。在创建任务之前,我们需要先了解FreeRTOS的运转机制。 FreeRTOS是一个多任务系统,由操作系统来管理执行每个任务。这些任务全都挂载到一个双向循…...

C 语言_常见排序算法全解析

排序算法是计算机科学中的基础内容,本文将介绍 C 语言中几种常见的排序算法,包括实现代码、时间复杂度分析、适用场景和详细解析。 一、冒泡排序(Bubble Sort) 基本思想:重复遍历数组,比较相邻元素,将较大元素交换到右侧。 代码实现: void bubbleSort(int arr[], i…...

LamaIndex rag(增强检索)入门

LamaIndex RAG 搭建 lamaindex rag 的简单是例 from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.core import Settings,SimpleDirectoryReader,VectorStoreIndex from llama_index.llms.huggingface import HuggingFaceLLM#初始化一个…...

七、深入 Hive DDL:管理表、分区与洞察元数据

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月13日 专栏&#xff1a;Hive教程 内容导航 一、表的 DDL 操作 (非创建)二、分区的 DDL 操作三、洞察元数据&#xff1a;SHOW 命令的威力结语&#xff1a;DDL 与 SHOW&#xff0c;Hive 管理的双翼练习题一、选择题二、代码题…...

SQLMesh信号机制详解:如何精准控制模型评估时机

SQLMesh的信号机制为数据工程师提供了更精细的模型评估控制能力。本文深入解析信号机制的工作原理&#xff0c;通过简单和高级示例展示如何自定义信号&#xff0c;并提供实用的使用技巧和测试方法&#xff0c;帮助读者优化数据管道的调度效率。 一、为什么需要信号机制&#xf…...

STM32 __main汇编分析

在STM32的启动流程中&#xff0c;__main是一个由编译器自动生成的C标准库函数&#xff0c;其汇编级调用逻辑可通过启动文件&#xff08;如startup_stm32fxxx.s&#xff09;观察到&#xff0c;但具体实现细节被封装在编译器的运行时库中。以下是其核心逻辑解析&#xff1a; 一、…...

Google Earth Engine(GEE) 代码详解:批量计算_年 NDVI 并导出(附 Landsat 8 数据处理全流程)

一、代码整体目标 基于 Landsat 8 卫星数据,批量计算 2013-2020 年研究区的 NDVI(归一化植被指数),实现去云处理、数据合成、可视化及批量导出为 GeoTIFF 格式,适用于植被动态监测、生态环境评估等场景。 二、代码分步解析(含核心原理与易错点) 1. 加载并显示研究区边…...

【漫话机器学习系列】257.填补缺失值(Imputing Missing Values)

数据科学必备技能&#xff1a;填补缺失值&#xff08;Imputing Missing Values&#xff09; 在数据分析和机器学习项目中&#xff0c;缺失值&#xff08;Missing Values&#xff09; 是非常常见的问题。缺失的数据如果处理不当&#xff0c;会严重影响模型的训练效果&#xff0…...

c 中的哈希表

哈希是一种可以接受各种类型、大小的输入&#xff0c;输出一个固定长度整数的过程。你可以将哈希理解成一种特殊的映射&#xff0c;哈希映射&#xff0c;将一个理论无限的集合A映射到有限整数集合B上。 哈希函数&#xff1a;哈希函数是哈希过程的核心&#xff0c;它决定了哈希映…...

AI空域调度系统的社会角色与伦理边界

当AI空域调度系统成为城市运行不可或缺的一部分&#xff0c;其角色已不再是单纯的技术工具&#xff0c;而逐步具备了社会属性。平台既作为智能基础设施的调度中枢&#xff0c;也承担起数据治理、行为规训和公共资源分配等功能。本章聚焦AI调度系统的“类政府性”角色崛起&#…...

pringboot3+vue3融合项目实战-大事件文章管理系统-文章分类列表

GetMappingpublic Result <List<Category>>list(){List<Category> list categoryService.list();return Result.success(list);}然后在categoryservice接口新增 List list(); 然后再categoryserviceimpl实现类里面加入 Overridepublic List<Category&g…...

关于cleanRL Q-learning

内置变量 内置变量是由编程语言解释器或运行时环境预定义的变量。它们通常用于提供程序的元信息&#xff08;如文件路径、模块名称&#xff09;或控制程序行为。在 Python 中&#xff0c;内置变量通常以双下划线开头和结尾&#xff0c;例如 __file__、__name__。 以下是一些常…...

Electron-Vue3、Electron-React、Electron-Angular打造舆情监控系统项目

Electron是一个跨平台的桌面应用开发框架&#xff0c;可以让我们用html css js的技术开发跨平台桌面上可以安装的软件。视频详解: Electron教程 ElectronVue跨平台桌面软件开发教程-2024年更新&#xff08;大地老师&#xff09; 从Electron环境搭建开始到手把手教你调试、Elect…...

STM32 修炼手册

第一章 计算机体系结构(了解) 后续在板子上开发的时候&#xff0c;需要考虑是否有操作系统 方式一&#xff1a;有操作系统&#xff0c;通过c库通过os api操作硬件方式二&#xff1a;无操作系统&#xff0c; 通过c库通过固件库操作硬件 第二章 STM32开发板概述 板子/开发板&…...

React vs Vue:点击外部事件处理的对比与实现

React vs Vue&#xff1a;点击外部事件处理的对比与实现 在 Web 应用中&#xff0c;“点击外部事件监听”是一种常见需求&#xff0c;典型应用如&#xff1a;点击弹窗外部关闭弹窗、点击下拉菜单外关闭菜单。虽然在 React 和 Vue 中实现的原理类似——都是通过监听 document 的…...