函数
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
函数(function)是可以重复使用的代码片段,有利于代码的复用。它与别名(alias)的区别是,别名只适合封装简单的单个命令,函数则可以封装复杂的多行命令。
函数总是在当前 Shell 执行,这是跟脚本的一个重大区别,Bash 会新建一个子 Shell 执行脚本。如果函数与脚本同名,函数会优先执行。但是,函数的优先级不如别名,即如果函数与别名同名,那么别名优先执行。
Bash 函数定义的语法有两种:
fn是自定义的函数名,函数代码就写在大括号之中。
 
一个简单函数的例子
 
调用时,就直接写函数名,参数跟在函数名后面。
数组
type
status
date
slug
summary
tags
category
icon
password
Property
 

 
数组(array)是一个包含多个值的变量。成员的编号从0开始,数量没有上限,也没有要求成员被连续索引。

创建数组

数组可以采用逐个赋值的方法创建。
ARRAY是数组的名字,可以是任意合法的变量名。INDEX是一个大于或等于零的整数,也可以是算术表达式。
创建一个三个成员的数组:
Shell环境和除错
type
status
date
slug
summary
tags
category
icon
password
Property

set、shopt

Bash 执行脚本时,会创建一个子 Shell:
上面代码中,script.sh是在一个子Shell 里面执行。这个子 Shell 就是脚本的执行环境,Bash 默认给定了这个环境的各种参数。
 
set命令用来修改子 Shell 环境的运行参数,即定制环境,一共有十几个参数可以定制。
如果命令行下不带任何参数,直接运行set,会显示所有的环境变量和 Shell 函数。
Linux目录配置
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
FHS 是 File System Hierarchy Standard(文件系统层次化标准)的缩写,多数Linux 版本采用这种文件组织形式,类似于 Windows 操作系统中 c 盘的文件目录,FHS 采用树形结构组织文件。FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理。
根据 FHS(Filesystem Hierarchy Standard) 的官方文件指出, 他们的主要目的是希望让使用者可以了解到已安装软件通常放置于那个目录下,重点在于规范每个特定的目录下应该要放置什么样的数据。
FHS 标准根据文件系统使用的频繁与否以及是否允许用户随意改动,将目录定义为四种交互作用形态:
  • 可分享的:可以分享给其他系统挂载使用的目录
  • 不可分享的:与自身机器直接相关的设备文件等,不能分享给其他主机
  • 不变的:数据不常变动的文件
  • 可变动的:经常改变的数据,如登录文件、新闻组等。
notion image
 
事实上,FHS针对目录树架构仅定义出三层目录下面应该放置什么数据而已,分别是下面这三个目录的定义:
文件与目录管理
type
status
date
slug
summary
tags
category
icon
password
Property
 

 

绝对路径与相对路径

  • 绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如 /home/dmtsai/.bashrc
  • 相对路径:相对于目前路径的文件名写法。 例如 ./home/dmtsai../../home/dmtsai/ 等等,开头不是 / 就属于相对路径
 
举例来说,在 /home 这个目录下, 如果想进入 /var/log 这个目录时:
用户身份与文件权限
type
status
date
slug
summary
tags
category
icon
password
Property
 

 

用户身份与能力

设计Linux系统的初衷之一就是为了满足多个用户同时工作的需求,因此Linux系统必须具备很好的安全性。
在安装Linux系统时,特别要求设置root管理员密码,这个root管理员就是存在于所有类UNIX系统中的超级用户。它拥有最高的系统所有权,能够管理系统的各项功能,如添加/删除用户、启动/关闭服务进程、开启/禁用硬件设备等。虽然以root管理员的身份工作时不会受到系统的限制,但一旦使用这个高能的root管理员权限执行了错误的命令可能会直接毁掉整个系统。
Linux系统的管理员之所以是root,并不是因为它的名字叫root,而是因为该用户的身份号码即UID(User IDentification)的数值为0。在Linux系统中,UID就相当于我们的身份证号码一样具有唯一性,因此可通过用户的UID值来判断用户身份。
  • 管理员UID为0:系统的管理员用户
磁盘与文件系统管理
type
status
date
slug
summary
tags
category
icon
password
Property
 

物理设备的命名规则

Linux系统中一切都是文件,硬件设备也不例外。既然是文件,就必须有文件名称。系统内核中的udev设备管理器会自动把硬件名称规范起来,目的是让用户通过设备文件的名字可以猜出设备大致的属性以及分区信息等;这对于陌生的设备来说特别方便。另外,udev设备管理器的服务会一直以守护进程的形式运行并侦听内核发出的信号来管理/dev目录下的设备文件。Linux系统中常见的硬件设备的文件名称:
硬件设备
文件名称
IDE设备
/dev/hd[a-d]
SCSI/SATA/U盘
/dev/sd[a-z]
virtio设备
/dev/vd[a-z]
软驱
/dev/fd[0-1]
打印机
/dev/lp[0-15]
光驱
/dev/cdrom
鼠标
/dev/mouse
软件安装
type
status
date
slug
summary
tags
category
icon
password
Property

 

Linux 安装软件

Windows 安装软件大概的过程如下:
  1. 在用户指定的安装目录下建立安装程序目录
Linux 安装软件大概的过程如下:
算法复杂度
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
算法复杂度(Algorithm complexity):在问题的输入规模为的条件下,程序的时间使用情况和空间使用情况。
 
算法所追求的就是 所需运行时间更少(时间复杂度更低)占用内存空间更小(空间复杂度更低)。所以进行「算法分析」,就是从运行时间情况、空间使用情况两方面对算法进行分析。
 
要比较两个算法的优劣通常有两种方法:
  • 事后统计:将两个算法各编写一个可执行程序,交给计算机执行,记录下各自的运行时间和占用存储空间的实际大小,从中挑选出最好的算法
  • 预先估算:在算法设计出来之后,根据算法中包含的步骤,估算出算法的运行时间和占用空间。比较两个算法的估算值,从中挑选出最好的算法
大多数情况下,会选择第 2 种方式。因为第 1 种方式的工作量实在太大,得不偿失。另外,即便是同一个算法,用不同的语言实现,在不同的计算机上运行,所需要的运行时间都不尽相同。所以我们一般采用预先估算的方法来衡量算法的好坏。
采用预先估算的方式下,编译语言、计算机运行速度都不是我们所考虑的对象。只关心随着问题规模扩大时,时间开销、空间开销的增长情况。
 
数组 vector
type
status
date
slug
summary
tags
category
icon
password
Property
 

vector是STL中最常见的容器,它是一种顺序容器,支持随机访问。vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似,不同的地方就是:数组是静态分配空间,一旦分配了空间的大小,就不可再改变了;而vector是动态分配空间,随着元素的不断插入,它会按照自身的一套机制不断扩充自身的容量。
 

vector的扩充机制

按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。
迭代器_First指向使用空间的头部,_Last指向使用空间大小(size)的尾部,_End指向使用空间容量(capacity)的尾部
vector题目
type
status
date
slug
summary
tags
category
icon
password
Property
目录
目录

加一

题目:给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。可以假设除了整数0之外,这个整数不会以零开头。
示例:
 
对数组 加一时,只需要关注 的末尾出现了多少个即可。可以考虑如下的三种情况:
  • 如果 的末尾没有,例如,那么直接将末尾的数加一,得到并返回
  • 如果 的末尾有若干个,例如,那么只需要找出从末尾开始的第一个不为的元素,即,将该元素加一,随后将末尾的全部置零,得到并返回
链表 list
type
status
date
slug
summary
tags
category
icon
password
Property
目录
目录

 

链表

链表是一种用于存储数据的数据结构,通过如链条一般的指针来连接元素。它的特点是插入与删除数据十分方便,但寻找与读取数据的表现欠佳。
  • 链表因其链状的结构,能方便地删除、插入数据,操作次数是。但也因为这样,寻找、读取数据的效率不如数组高,在随机访问数据中的操作次数是
  • 数组可以方便地寻找并读取数据,在随机访问中操作次数是。但删除、插入的操作次数是次。
 
优点:存储空间不必事先分配,在需要存储空间的时候可以临时申请,不会造成空间浪费;一些操作的时间效率远比数组高(插入、移动、删除等)
缺点:不仅数据元素本身的数据信息要占用存储空间,指针也需要占用存储空间,链表结构比数组结构的空间开销大。
1
...
45678
...
78