1.了解BASH
(1)何为Shell?
要了解shell(壳)之前,我们需要弄明白人与电脑(机器)之间是如何进行沟通的。
首先,电脑的底层是硬件设备,我们所有的计算任务都需要电脑本身的硬件设备的存在及支持才能够实现,但是电脑本身的硬件设备是无法与人之间直接进行沟通的。针对于这个现状,人们就此发明了操作系统这一个东西,让操作系统的内核来将我们人类的指令翻译成电脑硬件设备能读懂的信号来控制硬件的正常工作。那么既然控制硬件的问题解决了,我们就需要能够控制操作系统内核的工具存在了,这个工具就是shell(壳程序),该程序的作用就是接收用户的操作(点击图标、输入命令),并进行简单的处理,然后再传递给内核,这样用户就能间接地使用操作系统内核了。
我们在windows常使用的图形化界面也就是shell程序的一种,而在不使用xwindows等图形化界面的linux中,命令行模式就是一种shell。shell说白了也就是一种应用程序,和我们日常使用的QQ、迅雷等程序没有区别。
(2)何为Bash?
bash其实也是shell程序的一种,是当前众多Linux开发版的默认shell
(3)Bash有什么功能?
①历史命令
bash默认能够存储1000条用户执行过的命令于~/.bash_history文件中,可以使用↑↓键来进行查看,调用命令为history。不过.bash_history文件记录的是上一次登录系统的时候所输入的命令,当前登录系统后输入的命令保存在内存中,用户注销后才写入文件中。
②命令补全
通过使用TAB键,可以再输入命令时对命令和目录进行补全
③命令别名设置功能(alias)
可以对平时常用的命令来进行一个别名的设置,例如命令ls -al,我可以设置lm为这个命令的别名,将来我输入lm就可以替代ls -al来使用了。
命令范例:alias lm='ls -al'
④任务管理、前台、后台控制(job control、foreground、background)
⑤程序化脚本(shell scripts)
⑥通配符
(4)type命令:查询命令来源
通过type命令,我们可以查询一个命令是不是bash的内置命令?还是外部命令?亦或是别名?
命令格式:type 【-t p a】命令名字
例如:type ls
常用参数:
默认不加参数的情况下,type会直接显示该命令的最主要显示情况

-t:当加入-t参数时,type会用file(外部命令)、alias(该命令为别名)、builtin(bash内置命令)等字眼直接显示命令意义

-p:后续命令为外部命令时,显示完整文件名

-a:显示该命令的来源和其在PATH变量定义的路径里的具体位置

(5)命令的执行和编辑
①命令的执行(转义符\)
bash命令在输入时,可以通过加入转义符\后立马跟enter键来把命令变成多行输入。
②命令的编辑
命令的删除除了直接用delete进行删除外,还有两个快捷键可以进行使用,分别是:
ctrl+u/ctrl+k:分别是从光标处向前/后删除命令
ctrl+a/ctrl+e:分别是将光标移动到命令的最前/后边
2.Shell的变量
(1)何为变量?
变量就是以一组文字或符号等,来替换一些设置或一些保留数据,也可以说是让某一特定字符串代替不固定的内容。
例如:v2ray='cd /etc/v2ray-agent',这就是一个变量的表示方法,其中左边为变量名称,右边为变量内容,总之可以理解为:
变量名称=变量内容(=为赋值)
通过输入v2ray='cd /etc/v2ray-agent'这个命令,其实就相当于用v2ray这个变量来代替了cd /etc/v2ray-agent这个命令,之后我们通过输入$v2ray这个命令,就可以达成cd /etc/v2ray-agent这个效果。

(2)变量的使用与设置
①echo——显示变量内容
通过echo命令可以显示变量的内容,不过要注意变量在使用时,需要在变量前加入$
命令格式:echo $变量名
例如:echo $PATH
②变量设置规则
Ⅰ.变量名字和内容之间通过"="连接
例如:asoul=diana
Ⅱ.变量名字可以用字符和数字,但是不能以数字开头
例如:12asoul=diana,这样是不合法的

Ⅲ.变量内容不能直接加空格
例如:asoul=diana ava,这样是不合法的,正确的做法应该是加入单引号【''】;或双引号【“”】,但是单双引号的使用是有不同的意义的。
单引号:单引号内的特殊字符仅为一般字符(纯文本)
双引号:双引号内的特殊字符保留原本特性

Ⅳ.可以使用转义符【\】将特殊符号变成一般符号
可以转义enter、$、/、空格、`等
Ⅴ.使用反单引号【`】和【$(command)】,可以在一串命令的执行中,借由其他额外的命令所提供的信息
例如:定义version=uname -r
或$(uname -r),在echo $version时,就可以显示linux的版本内核号

在其他命令搭配使用时,也可以使用$(command)这些用法,可以优先执行括号内的命令,在执行之外的命令,就像四则运算中括号()的用法一样

Ⅵ.扩充变量内容
命令格式:变量名=${变量名}:内容
例如:原本name=laoju,现在我想在laoju的后边加上 :love ava,应该如何操作?
可以输入name=${name}:'love ava' 或者 name="$name":'love ava'

如果不想添加“:”号,只要直接去掉就好

Ⅶ.export命令将自定义变量转为环境变量
export命令可以让父进程中自定义变量转问环境变量供子进程
Ⅷ.unset命令取消变量设置
命令格式:unset 变量
例如:unset path
(3)环境变量的功能
①env及export命令:查看系统环境变量


常用环境变量解释:
shell:告知我们当前系统所用的shell是哪个程序
MAIL:系统读取邮件的位置
HOME:家目录位置
LANG:系统的语系数据
HISISIZE:系统保存的历史执行目录的数量
②set命令:查看系统环境变量及自定义变量
通过set命令,我们可以获得更详细的关于系统环境变量及用户自定义变量的信息。其中,以下将列出比较重要的几个环境变量的意义。
常用的系统环境变量:
①PS1(提示字符的设置)



通过联系上面三张图分析,我们可以知道PS1的设置主要就是BASH的右边的命令提示字符的设置
其中的常用参数分别为(注意\为转义符):
\u:当前登录用户
\h:当前主机名称,取完整主机名第一个小数点之前的名字
\w:完整的工作目录名称,由根目录写起的完整名称,但根目录以~替换
\W:利用basename函数取得的名称,只会列出最后一个目录的名称
\d:可显示出【星期 月 日】的日期格式
\t:显示24小时时制的时间,【HH:MM:SS】
\T:显示12小时时制的时间,【HH:MM:SS】
\A:显示24小时时制的时间,【HH:MM】
\@:12小时,【HH:MM】
\ #:执行的第几个命令
\ $:提示字符,如果是root用户就显示#,如果是其他用户就显示$

②$(查询shell的UID)
$本身也是一个变量,通过echo $$能够得到当前shell的UID

③?(查询上一个命令的执行记录)
通过echo $?我们可以查询前一个命令的执行情况,0代表无错误,非0则代表错误码,可以通过查询错误码来找到错误的原因

(4)locale命令:修改影响显示结果的语系变量
我们有时候在输出一个文件的结果时,可能会因为语系识别错误的原因而出现乱码,这时候我们只要更改最重要的两个语系变量LANG和LC_ALL并通过export输出为环境变量就好。
通过locale命令,我们可以查询到当前系统的语系变量

而通过LANG=en_US.utf8这些命令,则可以更改系统的语系变量

(5)理解变量的有效范围
首先我们要了解到,变量是有环境变量与自定义变量之分,而系统进程又有父进程与子进程之分,父进程的环境变量可以被子进程使用,但是自定义变量不行,为什么会这样?
我们需要知道,当我们打开一个shell(父进程)的时候,系统会为这个shell分配一个内存区域,这个内存区域中的变量可以可以被子进程使用,但是默认这个内存区域只存在父进程的环境变量,如果我们想要子进程(另外启动一个shell)能够使用父进程的自定义变量,那我们就需要使用export或者declare命令来将自定义变量变成环境变量写入内存,然后子进程在把父进程的内存区域的环境变量导入自己内存区域的环境变量中。
(6)变量键盘的读取(read)和声明(declare)
①read命令实现与用户的交互
如果想与用户来进行键盘交互来输入某个变量的值,就可以使用read这个命令(类似于python中的input命令)
命令格式:read 【-pt】 变量名
例如:read -p "请输入你在asoul里最爱的人:" asoul
常用参数:
-p:后面可以跟你想要提示的文字
-t:后面可以跟等待的秒数

②declare命令声明变量的类型
变量的类型也是可以转换的,默认的变量的类型就是字符串,如果需要非字符串类型(整数、数组等)的变量,就需要使用declare进行声明
命令格式:declare 【-a i x r】 变量名
例如:declare -i man=10+20
常用参数:
-a:将变量的类型变为数组(array)类型
-i:将变量的类型变为整数(integer)类型

-x(+x):类似于export命令,可以将自定义变量写入到环境变量里,-x是自定义变量→环境变量,+x是环境变量→自定义变量
例如:declare -x man
而要是想把环境变量变成自定义变量,则可以使用declare +x 这个命令


-r:将变量的类型变成只读(readonly),不可更改内容,也不可以unset
(7)ulimit命令:限制用户系统资源的使用
在多用户登录的linux系统上,管理员必须要对每个用户进行一定的系统资源分配以防止多个用户之间进行大量的系统资源使用而导致系统的崩溃。
这时候我们就需要ulimit这个命令来对各个用户系统资源进行分配管理
恢复ulimit设置的最简单方法就是注销登录
命令格式:ulimit 【-a H S f d l t u c】
例如:ulimit -f 10240
常用参数:
-a:ulimit -a命令可以显示当前系统的资源限制分配情况

-H:严格限制,配合其他参数使用,必定不能超过这个参数设定的值
-S:警告设置,配合其他参数使用,可以超过这个参数的值,但是超过之后系统会进行警告(-S一般会小于-H的值,例如-S为80,-H为100,则系统在你使用某个资源的量超过80时就会警告你,但还是允许你使用,只要不超过100就好)
-f:当前shell可以建立的单一文件的最大容量,单位为Kbytes(一般可以设置为2G)
-d:程序可使用的最大段内存(segment)的容量
-l(L的小写):可用与锁定(lock)的内存量
-t:可使用的最大CPU时间(单位为秒)
-u:单一使用者可以使用的最大进程(process)量
-c:核心文件(core file)的大小(用于记录系统程序在出错时候的内存信息)
(8)变量的删除、取代及替换
变量除了可以通过设置来直接修改原本的内容以外,还提供了删除、取代及替换等微调变量内容的方法
①变量的删除
命令格式:变量名=${变量名#/##/%/%%匹配的内容}
例如:name=${name/%:love*}

变量的删除主要需要记住两个符号,分别是#和%,其中#代表的是从变量的左边开始删除;%代表的是从变量的右边开始删除(记住#和%在键盘的位置,分别在$的左边和右边就很好理解了)
然后一个#和一个%:代表的是匹配替换字符【最短的】那一个(最短匹配);
两个##和%%:代表的是匹配替换字符【最长的】那一个(最长匹配)
下面我们通过一些例子来进行理解:
例1:

如上图的这个,v2ray这个变量有两个目录,如果我想先删除右边那个目录的/xray目录我该怎么做?
首先根据命令的格式,我们可以先输入${v2ray},然后因为是从右边开始删除,所以我们需要%这个符号,然后又因为只要删除/xray这个目录,所以我们用最短匹配,一个%就好。然后我们观察我们想删除的这个目录的前后符号,前边是/,后边也是/,所以我们的被删除部分就可以写成/*(通配符匹配=xray前边的任意内容)xray/。
则命令的全称为echo(显示结果) ${v2ray%/*xray/}
那么我又想接着删除最右边的目录的话怎么办?
同上,我们只要观察想删除的内容的前后符号,可见该目录前边有一个冒号“:”,所以命令我们就可以写成:
echo ${v2ray%:*}这样就好。a
例2:

如上图,我想删除path这个变量的/toor/bin前边的全部东西,我应该怎么删除?
首先我们先输入${path}然后因为我是从左边开始删除,所以选择#这个符号,又因为需要删除长目录,所以选择两个##号。接着我们来看如何匹配我们要删除的目录,首先看到目录最左边,有/,然后直到/root/bin前边有个冒号:“:”,所以我们的命令可以为:echo ${path##/*:}
例3:

②变量的取代
替换变量的内容有两个命令,分别是:
命令格式:${path/旧字符/新字符}(只替换一次)
${path//旧字符/新字符}*(符合条件的全部替换)
例如:echo ${path//man/MAN}

Comments NOTHING