Linux之认识和学习Bash

硬件、内核与shell

我们必须要通过“shell”将我们输入的命令与内核通信,好让内核可以控制硬件来正确无误地工作。

操作系统其实是一组软件,由于这组软件在控制整个硬件与管理系统的活动监测,如果这组软件随意被用户操作,若用户应用不当,将会使整个系统崩溃。

只要能够操作应用程序的接口都能够称为shell。狭义的shell指的是命令行方面的软件。广义的shell则包括图形界面的软件。

shell的好处:

  • 命令行界面的shell,大家都一样
  • 远程管理:命令行界面就是比较快
  • 管理系统的关键

系统的合法shell与/etc/shells功能

目前的Linux可以使用的shell(/etc/shells文件):

  • /bin/bash(Bourne Again SHell,Linux默认的shell)
  • /bin/ksh(Kornshell由AT&T Bell lab发展出来,兼容于bash)
  • /bin/tcsh(整合C shell,提供更多的功能)
  • /bin/zsh(基于ksh发展出来,功能更强大)

用户何时取得shell工作以及用户默认的shell记录在/etc/passwd文件内

bash shell的功能

  • 命令记忆能力(history)
  • 命令与文件补全功能(【Tab】按键的好处)
  • 命令别名设置功能(alias)
  • 作业控制、前台、后台控制(job control, foreground, background)
  • 程序脚本(shell script)
  • 通配符(Wildcard)

bash shell的内置命令:type

了解命令是来自于外部命令(指的是其他非bash所提供的命令)或是内置在bash当中

type [-tpa] name

参数:

type:不加任何参数时,type会显示出name是外部命令还是bash内置命令

-t:type将name以下面这些字眼显示出它的意义:

file:表示位外部命令

alias:表示该命令为命令别名所设置的名称

builtin:表示内置命令

-p:如果后面接的name为外部命令时,才会显示完整文件名

-a:会有PATH变量定义的路径中,将所有含name的命令都列出来,包含alias

命令的执行

反斜杠(\)转移字符

shell的变量功能

  • 变量的可变性与方便性
  • 影响bash环境操作的变量:PATH变量
  • 在进入shell之前,由于系统需要一些变量来提供他数据的访问(或者是一些环境的设置参数值,例如是否要显示彩色等的),所以就有一些所谓的“环境变量”需要来读入系统。为了区别与自定义变量的不同,环境变量通常以大写字符来表示
  • 脚本程序设计(shell script)的好帮手

变量的显示与设置:echo,unset

变量的显示echo

只需要在变量名称前面加上$,或者是以${变量}的方式来显示都可以。

设置或者修改变量的内容:用“等号(=)”连接变量与它的内容

在bash中,当一个变量名称尚未被设置时,默认的内容是“空”的。

变量的设置规则:

  • 变量与变量以一个等号“=”来连接
  • 等号两边不能直接接空格符
  • 变量名称只能是英文字母与数字但是开头字符不能是数字
  • 变量内容若有空格符可使用双引号或单引号将变量内容结合起来,但是双引号类的特殊字符如$等,可以保留原本特性;单引号类的特殊字符则仅为一般字符(纯文本)
  • 可用转义字符“\”将特殊符号变成一般字符
  • 在遗传命令中,还需要通过其他的命令提供的信息,可以使用反单引号“`命令`”或“$(命令)”。
  • 若该变量为了增加变量内容时,则可使用“$变量名称”或${变量}累加内容
  • 若该变量需要在其他子进程中执行,则需要以export来使变量变成环境变量
  • 通常大写字符为系统默认变量,自行设置变量可以使用小写字符方便判断
  • 取消变量的方法为使用“unset 变量名称”

子进程:在目前这儿shell的情况下,其打开另一个新的shell,新的shell就是子进程。在一般状态下,父进程的自定义变量是无法在子进程内是使用的。但通过export将变量编程环境变量以后,就能够在子进程下面使用了。

环境变量的功能

用env(environment)查看环境变量与常见环境变量说明

HOSTNAME:这台主机的主机名

TERM=这个终端机使用的环境是什么类型

SHELL=目前这个环境下使用的shell是哪一个程序

HISTSIZE=记录命令的条数,在CentOS中默认可记录1000笔

USER=用户的名称

LS_COLORS=一些颜色显示

MAIL=和这个用户取用的mailbox位置

PATH:执行文件命令查找路径

INOUTERC=与键盘功能有关,可以设置特殊按键

PWD=目前用户所在的工作目录

LANG=这个与语系相关

HOME=这个用户的主文件夹

_=上一次使用的命令的最后一个参数(或命令本身)

RANDOM:“随机数”变量,内容介于0~32767之间

用set查看所有变量(含环境变量与自定义变量)

HISTFILE=历史命令记录的放置文件,隐藏文件

MAILCHECK=每60秒去扫描一次信箱有无新信

PS1=命令提示符的设置值

PS2=使用转义符号第二行以后的提示符

$目前这个shell所使用的PID

?刚才执行完命令的回传码

一般来说,不论是否为环境变量,只要跟目前这个shell的接口操作有关的变量,通常都会被设置为大写字符,也就是说,基本上,在Linux默认的情况中,使用{大写字符}来设置的变量一般为系统内定需要的变量。

PS1(提示符的设置)

$(关于本shell的PID)

?(关于上个执行命令的回传码)

一般来说,如果成功执行命令,则会回传一个0值,如果执行过程中发生错误,就会回传“错误代码”,一般就是以非0的数值来替代

export:自定义变量转成环境变量

环境变量与自定义变量的差异:该变量是否会被子进程所继续使用

子进程仅会继承父进程的环境变量,子进程不会继承父进程的自定义变量

影响显示结果的语系变量(locale)

locale

变量的有效范围

环境变量可以被子进程所引用,但是其他的自定义变量内容就不会存在于子进程中

  • 当启动一个shell,操作系统会分配一个记忆块给shell使用,此内存类的变量可让子进程取用
  • 若在父进程利用一个export功能,可以让自定义变量的内容写到上述记忆块当中(环境变量)
  • 当加载另一个shell时,子shell可以将父shell的环境变量所在的记忆块导入到自己的环境变量块当中

变量键盘的读取、数组与声明:read,array,declare

read:读取来自键盘输入的变量

参数:

-p:接提示信息

-t:接等待的“秒数”

declare/typeset:声明变量类型

参数:

-a:数组类型

-i:整型

-x:环境变量

-r:readonly类型,该变量不可被更改内容,也不能重设

在默认的情况下,bash对于变量有几个基本的定义:

  • 变量类型默认为“字符串”
  • bash环境中的数值运算,默认最多仅能达到整数类型

与文件系统及程序的限制关系:ulimit

ulimit [-SHacdfltu] [配额]

参数:

-H:hard limit,严格的设置,必定不能超过这个设置的数值

-S:soft limit,警告的设置,可以超过这个数值,但是若超过则有警告信息

-a:列出所有的限制额度

-c:当某些进程发生错误时,系统会将该进程在内存中的信息写成文件(排错用),这种文件就被称为内核文件(core file),此为限制每个内核文件的最大容量

-f:此shell可以创建的最大文件容量(一般为2GB)单位为KB

-d:进程可使用的最大断裂内存(segment)容量

-l:用于锁定(lock)的内存量

-t:可使用的最大CPU时间

-u:单一用户可以使用的最大进程(process)数量

变量内容的删除、替代与替换

命令别名设置:alias,unalias

历史命令:history 【n】

history 【-c】

history 【-raw】 histfiles

参数:

n:数字,是要列出最近的n条命令行

-c:将目前的shell所有的history内容全部消除

-a:将目前新增的history命令新增入histfiles中,若没有加histfiles,则默认写入~/.bash_history

-r:将histfiles的内容读到目前这个shell的history记忆中

-w:将目前的history记忆内容写入histfiles中(默认为~/.bash_history)

历史命令在注销时,会将最近的HISTSIZE条记录到记录文件当中

!number:执行第几条命令

!command:有最近的命令向前搜寻命令串开头为command的那个命令,并执行

!!:执行上一个命令

Bash Shell的操作环境

路径与命令查找的顺序:

  1. 以相对/绝对路径执行命令
  2. 由alias找到该命令执行
  3. 由bash内置的(builtin)命令来执行
  4. 通过$PATH这个变量的顺序找到的第一个命令来执行

bash的登陆与欢迎信息:/etc/issue,/etc/motd

bash的环境配置文件

login与no-login shell

login shell:取得bash时需要完整的登陆流程,读取/etc/profile(系统整体设置),~/.bash_profile或~/.bash_login或~/.profile(属于用户个人设置)

no-login shell:取得bash接口的方法不需要重复登录的举动,读取~/.bashrc

source读入环境配置文件

其他相关配置文件

/etc/man.config:规定了使用man的时候man page的路径到那里去寻找

~/.bash_history:历史命令记录

~/.bash_logout:记录注销bash后系统完成的操作

终端机环境设置:stty,set

通配符与特殊符号

数据流重定向

执行一个命令的时候,这个命令可能会由文件读入数据,再将数据输出到屏幕上。

standard output:标准输出,命令执行所回传的正确信息

standard error output:标准错误输出,命令执行失败后,所回传的错误信息

数据流重定向可以将standard output(简称stdout)与standard error output(简称stderr)分别传送到其他的文件或设备去,分别传送所用的特殊字符如下:

  • 标准输入(stdin):代码为0,使用<或<<;
  • 标准输出(stdout):代码为1,使用>或>>;
  • 标准错误输出(stderr):代码为2,使用2>或2>>;

1>:以覆盖的方法将正确的数据输出到指定的文件或设备上

1>>:以累加的方法将正确的数据输出到制定的文件或设备上

/dev/null垃圾桶黑洞设备与特殊写法

如果知道错误将要发生,将错误信息忽略掉而不显示或存储

将错误和正确的数据通通写入一个文件:2>&1也可以是&>

standard input:<与<<

将原本需要由键盘输入的数据改由文件内容替代

<<代表结束输入的意思

使用命令输出重定向的原因:

  • 屏幕输出的信息很重要,而且需要将它存下来
  • 后台执行中的程序,并不希望它干扰屏幕正常的输出结果
  • 一些系统的例行命令的执行结果,希望它可以存下来时
  • 一些执行命令的可能已知错误信息时,想以“2>/dev/null”将它丢掉时
  • 错误信息与正确信息需要分别输出时

命令执行的判断依据:

cmd;cmd(不考虑命令相关性的连续命令执行)

$? (命令回传码)与&&或||

cmd1 && cmd2:若cmd1执行完毕且正确执行($?=0),则开始执行cmd2

cmd1 || cmd2:若cmd1执行完毕且正确执行($?=0),则cmd2不执行

一般来书,假设判断式有三个:cmd1 && cmd2 || cmd3,cmd2和cmd3会放置肯定可以执行成功的命令

管道命令(pipe)

管道命令“|”仅能处理经由前面一个命令传来的正确信息,也就是standard output的信息,对于standard error output并没有直接的处理能力。

在每个管道后面接的第一个数据必定是“命令”,而且这个命令必须要能接受standard input的数据才行

选取命令:

cut:将一段信息的某一段“切”出来,处理的信息是以“行”为单位

cut –d ‘分隔字符’ –f fields(取出第几段)

cut –c 字符范围(以字符的单位去除固定字符区间)

grep:分析一行信息,若当中有需要的信息,就将该行拿出来

grep [-acinv] [—color=auto] ‘查找字符串’filename

参数:

-a:将binary文件以text文件的方式查找数据

-c:计算找到‘查找字符串’的次数

-i:忽略大小写

-n:输出行号

-v:反向选择,即显示没有‘查找字符串’内容的哪一行

--color=auto:将找到的关键字部分加上颜色显示

排序命令:

sort:排序命令,依据不同的数据类型排序

uniq:将重复的数据仅列出一个显示

wc:文件里面的字数,行数和字符数

双重定向:tee

同时将数据流送与文件与屏幕(screen);而输出到标准屏幕的,其实就是stdout,可以让下个命令继续处理

tee –a file:以累加的方式,将数据加入file中

字符转换命令:

tr:删除一段信息当中的文字,或者是进行文字信息的转换

tr [-ds] set1

参数;

-d:删除信息当中的set1这个字符串

-s:替换掉重复的字符

col [-xb]

参数:

-x:将tab键换成对等的空格键

-b:在文字内有反斜杠(/)

col经常被利用于将man page转存为纯文本文件以方便查阅的功能

join,将两个文件当中有相同数据的那一行加在一起

join [-ti12] file1 file2

参数:

-t:join默认以空格符分隔数据,并且对比“第一个字段”的数据

-i:忽略大小写

-1:代表第一个文件要用哪个字段来分析

-2:代表第二个文件要用哪个字段来分析

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值