认识与学习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的操作环境

路径与指令搜寻顺序

指令运行的顺序:

  1. 以相对/ 绝对路径执行指令,例如/ bin / ls 或 . / ls。
  2. 由alias找到该指令来执行。
  3. 由bash内置的(builtin)指令来执行。
  4. 通过$PATH这个变量的顺序搜寻到的第一个指令来执行。

bash的进站与欢迎讯息:/ etc / issue,/ etc / motd

登陆时的提示字串。

登陆后取得一些讯息,可以将讯息加入到/ etc / motd中,一定要root的身份才能修改。

bash的环境配置文件

login与non-login shell

区别在于取得bash用不用登陆(login)。这两个取得bash的情况中,读取的配置文件数据并不一致。
login shell会读取下列文件:

  1. / etc / profile:这是系统整体的设置,最好不要修改这个文件。
  2. ~ / .bash_profile 或 ~ / .bash_login 或 ~ / .profile :属于使用者个人设置,要改自己的数据,就写入这里。

non-login shell仅会读取:~ / .bashrc 而已。

终端机的环境设置:stty,set

bash默认组合键。

万用字符与特殊符号

万用字符:

特殊符号:

数据流重导向

数据流重导向就是将某个指令执行后应该要出现在屏幕上的数据,给它传输到其他的地方,例如文件或者是设备,在Linux文字模式下很重要,尤其是如果想要将某些数据存储下来。

什么是数据流重导向

命令执行的判断依据:;,&&,‖

管线命令(pipe)

管线命令使用的是“|”界定符号,管线命令与连续下达命令式不一样的。管线命令“|”仅能处理经由前面一个指令传来的正确信息,也就是standard output信息,对于stdandard error并没有直接处理的能力。

  1. 管线命令仅会处理standard output,对于standard error output会予以忽略
  2. 管线命令必须能够接受来自前一个指令的数据成为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就对了,可以将一个大文件依据文件大小或行数来分区,就可以将大文件分区为小文件了。

参数代换:xargs

关于减号-的用途