认识与学习BASH
认识BASH这个Shell
硬件,核心与Shell
必须通过shell将我们输入指令与内核沟通,好让内核可以控制硬件来正确无误的工作。操作系统其实是一组软件,这组软件在控制整个硬件与管理系统的活动监测,操作系统管理的就是整个硬件功能。使用者通过应用程序来指挥内核让内核达成我们所需要的硬件任务。壳程序的功能知识提供使用者操作系统的一个接口,因此需要可以调用其他软件,就是很多其他的指令,我们可以通过壳程序(就是命令行界面)来操作这些应用程序,让这些应用程序调用核心来运行所需的工作。只要能够操作应用程序的接口都能称为壳程序,狭义的壳程序指的是命令行包括bash,广义的壳程序包括图形接口软件。
为何要学命令行shell
命令行shell:大家都一样
几乎各家distribution使用的bash都是一样的。
远端管理:命令行就是比较快
Linux的管理常常需要通过远端连线,而连线时命令行的传速度一定比较快,而且不容易出现断线或者是信息外流的问题。
Linux的任督二脉:shell
系统的合法shell与/etc/shells功能
shell有众多版本,Linux的叫bash,也是基于GNU架构下发展出来的。shell还包括sh,csh。在/ etc / shells这个文件中至少就有几个可以用的shells。
我们系统合法的shell要写入/ etc / shells这个文件,系统某些服务在运行过程中,会去检查使用者能够使用的shells,检查的文件就是 / etc / shells这个文件。
Bash shell的功能
bash是Linux distributions的标准shell。bash主要相容于sh。bash的主要优点:
命令编修能力(history)
bash可以使用上下键找到前后一个输入的指令,在很多distribution中,默认的指令记忆功能可以达到1000个,指令记录放在主文件夹内的.bash_history中,不过~/ .bash_history记录的是前一次登录以前所执行的指令,这一次登录的指令都被暂存在内存中,当成功登出系统后,指令记忆才会记录到.bash_history中。
命令与文件补全功能(【tab】键的好处)
命令别名设置功能:(alias)
在命令行输入alias就可以知道目前的命令别名有哪些了。
就可以用alias来替代ls -al命令了。
工作控制,前景背景控制(job control,foreground,background)
程序化脚本(shell scripts)
将管理系统需要下达的连续指令写成一个文件,该文件可以通过对谈互动式的方式来进行主机的侦测工作,也可以借由shell提供的环境变量及相关指令来进行设计。
万用字符(wildcard)
bash还支持许多的万用字符来帮助使用者查询与指令下达,比如想知道有多少以X为开头的文件,就可使用 X * 来查看。
查询指令是否是Bash shell的内置命令:type
通过type指令来知道指令是来自于外部指令(其他非bash所提供的指令)或是内置在bash当中的指令。
指令的下达与快速编辑按钮
使用反斜杠加回车键,可以进行多行的输入。
Shell的变量功能
什么是变量
变量的可变性与方便性
小写的mail是指令,大写的MAIL是变量名称。
影响bash环境操作的变量
系统通过PATH这个变量里面的内容记录的路径顺序来搜寻指令。环境变量如PATH,HOME,MAIL,SHELL等等,都是很重要的,为了区别与自订变量的不同,环境变量通常以大写字符表示。
脚本程序设计(shell script)的好帮手
变量的取用与设置:echo,变量设置规则,unset
变量的取用:echo
变量前面要加上$符号才行。
设置和修改变量内容,用等号连接变量与他的内容就好了。
当一个变量名称尚未被设置时,默认的内容是空,变量在设置时也要符合一些规则,否则设置失败。
子程序就是在目前这个shell的情况下,去启用另一个新的shell,新的shell就是子程序,在一般状态下,父程序的自订变量是无法在子程序中使用的,但是通过export将变量变成环境变量后,就能够在子程序下面应用了。
环境变量的功能
用env观察环境变量与常见环境变量说明
MAIL当我们使用mail这个指令收信时,系统会去读取的邮件信箱文件(mailbox)。
用set观察所有变量(含环境变量与自订变量)
影响显示结果的语系变量(locale)
利用locale指令查询Linux支持了多少语系。
变量键盘读取,数组与声明:read,array,declare
read
要读取来自键盘输入的变量,就是用read这个指令。
declare,typeset
declare与typeset是一样都是声明变量的类型。
变量的默认类型是字符串,所以若是不指定变量类型,则1+2为一个字符串而不是计算式,bash环境中的数值计算默认最多能达到整数形态,所以1 / 3结果是0。
array变量类型
与文件系统及程序的限制关系:ulimit
由于Linux主机是多用户多任务操作系统,防止资源超过限制,bash可以限制使用者的某些系统资源,包括可以打开的文件数量,可以使用的CPU时间,可以使用的内存总量。用ulimit来实现。
一般身份使用者如果以ulimit设置了-f的文件大小,那么只能继续减小文件的大小,不能增加文件的大小。
变量内容的删除,取代与替换(optional)
变量内容的删除与取代
变量的测试与内容替换
命令别名与历史命令
命令别名设置:alias,unalias
历史命令:history
当以bash登陆Linux主机之后,系统会主动由主文件夹的~ / .bash_history读取以前曾经下过的指令,记录的条数与bash的HISTFILESIZE这个变量设置值有关。
Bash Shell的操作环境
路径与指令搜寻顺序
指令运行的顺序:
- 以相对/ 绝对路径执行指令,例如/ bin / ls 或 . / ls。
- 由alias找到该指令来执行。
- 由bash内置的(builtin)指令来执行。
- 通过$PATH这个变量的顺序搜寻到的第一个指令来执行。
bash的进站与欢迎讯息:/ etc / issue,/ etc / motd
登陆时的提示字串。
登陆后取得一些讯息,可以将讯息加入到/ etc / motd中,一定要root的身份才能修改。
bash的环境配置文件
login与non-login shell
区别在于取得bash用不用登陆(login)。这两个取得bash的情况中,读取的配置文件数据并不一致。
login shell会读取下列文件:
- / etc / profile:这是系统整体的设置,最好不要修改这个文件。
- ~ / .bash_profile 或 ~ / .bash_login 或 ~ / .profile :属于使用者个人设置,要改自己的数据,就写入这里。
non-login shell仅会读取:~ / .bashrc 而已。
终端机的环境设置:stty,set
bash默认组合键。
万用字符与特殊符号
万用字符:
特殊符号:
数据流重导向
数据流重导向就是将某个指令执行后应该要出现在屏幕上的数据,给它传输到其他的地方,例如文件或者是设备,在Linux文字模式下很重要,尤其是如果想要将某些数据存储下来。
什么是数据流重导向
命令执行的判断依据:;,&&,‖
管线命令(pipe)
管线命令使用的是“|”界定符号,管线命令与连续下达命令式不一样的。管线命令“|”仅能处理经由前面一个指令传来的正确信息,也就是standard output信息,对于stdandard error并没有直接处理的能力。
- 管线命令仅会处理standard output,对于standard error output会予以忽略
- 管线命令必须能够接受来自前一个指令的数据成为standard input继续处理才行。
选取命令:cut,grep
cut
cut主要用途是在于将同一行里面的数据进行分解。
grep
grep是分析一行讯息,若当中有我们所需要的信息,就将该行拿出来。
排序命令:sort,wc,uniq
sort
uniq
想要将重复的数据仅列出一个显示。
wc
wc指令可以帮我们计算输出讯息的整体数据。
双向重导向:tee
字符转换命令:tr,col,join,paste,expand
tr
tr可以用来删除一段讯息中文字,或者是进行文字讯息的替换。
col
col键可以用来简单的处理将tab按键取代为空格键。
join
paste
相对于join要对比两个文件的数据相关性,paste就是直接将两行粘在一起,中间以tab隔开。
expand
分区命令:split
如果有文件太大,找split就对了,可以将一个大文件依据文件大小或行数来分区,就可以将大文件分区为小文件了。