Linux-----BASH
1、认识BASH这个Shell
管理整个计算机硬件的其实是操作系统的核心,这个核心是被保护的,我们只能通过Shell来和其沟通。
1.1 硬件、核心与Shell
用户通过Shell将我们输入的指令与kernel沟通,之后让kernel可以控制硬件来正确无误的工作。操作系统其实是一组软件,这组软件控制整个硬件与管理系统的活动检测,所以这组软件不能被使用者随意使用,若使用者操作不当会使整个系统崩溃。shell程序功能是提供使用者操作系统的一个接口,shell程序一般是调用其它软件。
1.2 为什么要学命令行shell
首先是一致性,几乎所有的linux操作系统使用的bash都是一样的。其次是远端管理的时候,使用命令行比较快。在linux系统下管理主机有一定的shell程序编写的能力是很重要的。
1.3 系统的合法shell与/etc/shells功能
系统上合法的shell都写入/etc/shells这个文件,因为系统某些服务在运行过程中会检查使用者能使用的shell,而这些shell的查询就是借由/etc/shells这个文件。
1.4 Bash shell的功能
bash是GNU计划中重要的工具软件之一,有以下几个优点:
*命令修编能力
也就是你在命令行里面按下上下键就可以找到前/后输入的命令,默认的指令记忆功能可以达到1000个,指令记录在~/.bash_history。需要注意的是,记录的是前一次登陆以前所执行过的指令,而这一次登陆所执行的指令都被暂存在内存中,当你成功的登出系统后,该指令记忆才会记录到.bash_history当中。
*命令与文件补全功能
【Tab】接在一串指令的第一个字后面则为命令补全,接在一串指令的第二个字后面则为文件补齐。
*命令别名设置功能
比如显示这个目录下所有文件包括隐藏文件,需要ls -al,可以通过 alias lm ='ls -al',这样就可以将lm设置成ls -al的别名。两者有相同功能。
*工作控制、前景背景控制
*程序化脚本
shell scripts
*万用字符
除了完整的字符串,bash还支持许多万用字符来帮助使用者查询和指令下达。比如ls -al /home/X* 的含义就是显示home下所有以X开头的文件。
1.5 查询指令是否为Bash shell的内置指令:type
为了方便shell操作,Bash已经内置了很多指令,可以使用type这个指令来观察。

如下图:

1.6 指令的下达与快速编辑按钮
指令下达是用Enter按键,如果一行指令太长可以用“\”来将Enter按键跳脱,这样按下Enter会进入下一行可以继续输入命令,而不会执行,需要注意的是\和Enter之间不能有任何字符。如果顺利的在下一行会有>的符号,可以继续输入指令。常见组合按键:
2、Shell的变量功能
2.1 什么是变量
用一个简单的字眼代替另一个比较复杂或是容易变动的数据。
*用变量可以更方便地管理多个用户更加方便。
*影响bash环境操作的变量,系统需要一些变量提供他数据的读取,也就是一些环境变量需要读入系统例如PATH、HOME、MAIL、SHELL等。
*脚本程序设计,上面都是在系统上使用变量的目的或者说好处,对于个人而言,使用变量也能让很多工作更加方便。
2.2 变量的取用与设置:echo,变量设计规则,unset。
变量的取用:echo


两种方式都可以。上面也就表示了变量和变量内容,也就是说PATH这个变量代表了下面输出的那些目录。那么我们如果要设置一个变量就可以用等号来连接他们之间的内容即可。

这样的设置是暂时的,在bash中当一个变量名称未被设置时,默认内容是空。
变量设置规则:
1、变量与变量内容以一个等号“=”来连接
2、等号两边不能直接接空白字符
3、变量名称只能是英文字母和数字,但开头字符不能是数字
4、 变量内容若有空白字符可使用双引号“”或单引号将变量内容结合起来。
5、可用跳脱字符“\”将特殊符号变成一般符号。
6、在一串指令的执行中还要借由其他额外的指令所提供的信息时,可以使用反单引号指令或者$指令。
7、若该变量为扩增内容时,则可用$变量名称或${变量}累加内容。
8、若该变量需要在其他子程序执行则需要以export使变量称为环境变量。
9、通常大写字符为系统默认变量,自行设置变量可以使用小写字符。
10、取消变量的方法使用unset:unset变量名称。
2.3 环境变量的功能
可以通过env和export来查阅目前shell环境中有多少默认的环境变量。

用set观察所有变量包括环境变量和自定变量

在linux默认情况中使用{大写的字母}来设置的变量一般为系统内定的需要的变量。
export:自定变量转为环境变量
子程序会继承父程序的环境变量,子程序不会继承父程序的自定变量。如果想让自定变量在子程序中使用,那么可以使用export变量。它用于分享自己的变量设置给后来调用的文件或其他程序。
![]()
2.4 影响显示结果的语系变量
locale指令查询当前linux支持的语系。

可以通过下面的变量来修改。

2.5 变量的有效范围
基本可以理解为环境变量=全局变量,自定变量=区域变量。
2.6 变量键盘读取、阵列与宣告:read、array、declare
read 读取来自键盘输入的变量,使用read指令。

如下图:
、
declare/typeset是一样的功能,就是宣告变量的类型,如果后面不加参数和set作用一样。

默认情况下,变量被定义为字符串类型,在bash中计算默认最多到整数形态。

如果需要非字符串类型变量,需要使用declare。
2.7 与文件系统及程序的限制关系:ulimit
bash可以限制使用者的某些系统资源,包括打开文件的数量,可以使用CPU的时间、可以使用内存总量。ulimit。

列出当前用户的所有限额:

2.8 变量内容的删除、取代和替换
变量的内容可以通过很简单的指令来删除。通过以下实验来看。首先另一个自己定义的变量等于环境变量,之后我们开始删除这个自定变量里面的内容。

上图可以用下图说明,

删除前面所有目录,仅保留最后一个目录。

可以用下图总结:

变量的测试与内容替换

3、命令别名与历史命令
3.1 命令别名设置:alias、unalias
使用命令别名可以简化很多时候需要输入的命令。设置方法也很简单:

上图设置了命令别名,并使用原命令显示,下图使用命令别名。

取消命令别名,在设置命令alias的前面加上un,也就是unalias。如下图:

3.2 历史命令:history
history的用法如下:

同一个账号同时多次登陆的history写入问题:虽然所有的bash都会记录历史命令,但是退出时只有最后的bash才会真的写入数据。其他的bash的指令操作不会被记录下来。
无法记录时间:指令记录是无法记录指令下达的时间的。
4、Bash Shell的操作环境
4.1 路径与指令搜寻顺序
基本上指令运行的顺序可以看作:
(1)以相对/绝对路径执行指令
(2)以alias找到指令
(3)以bash内置指令来执行
(4)通过$PATH这个变量的顺序搜寻到的第一个指令执行。
4.2 bash的进站和欢迎讯息
bash进站欢迎讯息在/etc/issue里面。
![]()

如果想要使用者登陆后取得一些讯息,可以将讯息加入/etc/motd中。
4.3 bash的环境配置文件
进入bash能有很多可以用的变量等都是因为系统有一些环境配置文件的存在,可以让bash在启动时就读取这些配置文件。
login shell:取得bash时需要完整的登陆流程,就称为login shell,需要输入使用者的账号与密码
non-login shell :取得bash接口的方法不需要重复登陆的举动。

进入纯命令行:ctrl+alt+F1~F6。退出:ctrl+alt+F7。
4.4 终端机的环境设置:stty,set
查阅目前的按键内容可以使用stty。


上图中 ^表示【ctrl】的意思。如上intr=^C表示ctrl+C。几个重要的意义的:
intr:送出一个interrupt中断的讯号给正在运行的程序,其实就是终止。
quit:送出一个quit的讯号给正在运行的程序。
erase:向后删除字符
kill:删除目前命令行上的所有文字
eof:结束输入
start:在某个程序停止之后,重新启动他的output
stop:停止目前输出
susp:送出一个terminal stop讯号给正在运行的程序
还可以通过set指令设置指令输出输入的环境。

bash默认的组合键如下:

4.5 万用字符与特殊符号
下图为常用的万用字符

特殊符号:

5、数据流重导向
5.1 什么是数据流重导向
当执行一个指令的时候,指令可能从文件读入数据,经过处理后再将数据输出到屏幕上。当执行一个指令时通常是下图:

标准输出指的是:指令执行所回传的正确讯息,标准错误输出:指令执行失败后所回传的错误信息。
数据流重导向可以将标准输出和标准错误输出份被传送到其他文件或设备而分别传送所用的特殊字符如下所示:
可以从下图看出其使用方法:

在使用了数据流重导向之后可以将数据输入到一个文件中,如上图。打开输入的文件:

可以看到其实就是本来应该显示在屏幕上的信息。这个文件的创建方式是:如果没有这个文件就创建,如果有那么先清空在写入,也就是以>输出到一个已存在的文件中,这个文件会被覆盖。如果不想被覆盖那么使用>>就好。上例应该改为“|| / >> ./rootfile”。上面说到的是正确数据,如果是错误的数据那么就要通过2>和2>>。也就是说:

标准输入:<和<<
也就是说将原本从键盘输入的数据改由文件内容代替。下图是由键盘输入的。

同样也可以从一个文本文件输入。如下图将一个C++文件输入到catfile。

<<的作用是结束的输入字符。

输入eof之后就停止输入了。
5.2 命令执行的判断依据:;,&& ,||
有时候需要一次执行多条指令,可以通过;号来实现。在指令指令之间用;隔开,则会按照顺序执行。
有时候前面的指令和后面的指令相关的话就要用到&&或||。

6、管线命令
管线命令使用“|”这个界定符号。管线命令仅能处理经由前面一个指令传来的正确信息也就是对错误信息没有直接处理能力。整体的管线命令可用下图表示:

在每一个管线后面接的第一个数据必定是指令,这个指令必须能够接受标准输入数据才可以,这样的指令才可以是管线命令。比如:less、more、head、tail等都是管线命令,但是ls、cp、mv等都不是。管线命令主要有两个需要注意的地方:一是管线命令只会处理标准输出,不会处理错误输出(可以通过数据流重导向),二是管线命令必须要能够接受来自前一个指令的数据成为标准输入继续处理才行。
6.1 撷取命令:cut、grep
撷取讯息通常是针对一行一行来分析的。
cut:这个指令可以将一段讯息的某一段切出来。主要用途在于将同一行里面的数据进行分解,最常用在分析一些数据或文字数据的时候。

grep:grep是分析一行讯息,其中有需要的就拿出来。

6.2 排序命令:sort、wc、uniq
sort:可以进行排序,并且可以依据不同的数据型态进行排序。如果需要排序最号先让语系统一,这样数据排序会比较好一点。

uniq:如果排序完了,想要将重复的数据仅列出一个显示,那么可以使用uniq。

这个指令用来将重复的行删除掉只显示一个。
wc:这个指令可以知道一个文件里有多少个字、多少行。

6.3 双重导向:tee
tee会同时将数据流分送到文件和屏幕,送到屏幕的其实就是stdout,可以继续处理。

6.4 字符转换命令:tr、col、join、paste、expand
6.5 分区命令:split
6.6 参数代换:xargs
6.7 关于减号的用途
7、重点
(1)理解shell的概念:因为内核是受保护的,只能通过shell才能进行沟通。
(2)bash的主要功能:命令编修能力;命令与文件补全功能,工作控制、前景背景控制、程序化脚本、万用字符
(3)变量的设置
(4)数据流重导向
(5)管线命令

浙公网安备 33010602011771号