一、认识bash这个shell

操作系统就是一组软件,由这组软件在控制整个硬件爱你与管理系统的活动检测,如果这组软件能被用户随意的操作,那么当使用者使用不当的时候,就会使整个系统崩溃。所以用户可以透过应用程序来指挥kernel,让kernel完成我们需要的硬件任务。

也就是说,只有能够操作应用程序的借口都能被称为壳(shell)程序。狭义的壳程序指的是指令行方面的软件,包括bash。广义的shell泽包括了图形接口的软件,因为图形接口其实也能够操作各种应用程序来调用内核工作。

通过在/etc/shells文件,我们就可以看到自己的linux下面有几个可用的shells。例如我的是:

/bin/sh

/bin/bashLinux默认的shell

/bin/rbash

/bin/dash

bash有以下几I个有点

(1)命令记忆能力。

(2)命令与文件补全功能(Tab案件)。使用Tab的作用:

①Tab接着一串命令的第一个字后面,则为命令补全;

②Tab接着一串命令的第二个字后面,则为文件补全;

③若安装了bash-completion软件,则在某些命令后面使用Tab的时候,可以执行“选项/参数补全”功能。

(3)命令别名设置功能(alias)。比如我们可以使用“lm”来代替“ls -al”,那么我们可以使用下面的命令:

alias lm =’ls -al’

(4)作业控制、前台、后台控制。使用前台、后台的控制可以让作业进行得更为顺利。至于作业控制,可以让我们随时将工作丢到后台去执行,而不怕使用Ctrl+C来中断该程序,也可以在单一登录的环境中达到多任务的目的。

(5)程序脚本。

(6)通配符:使用通配符来匹配想要的文件。

另外,我们还可以使用type命令来查询命令是否为Bash shell的内置命令。使用格式如下:

[dmtsai@study ~]$ type [-tpa] name

选项与参数:

:不加任何选项与参数时,type会显示出name是外部指令还是bash内建指令

-t:当加入-t参数时,type会将name以底下这些字眼显示出他的意义:

file:表示为外部指令;

alias:表示该指令为命令别名所设定的名称;

builtin:表示该指令为bash内建的指令功能;

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

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

如果命令太长,我们可以使用两行输出,只需要在线要切换到第二行的地方输入一个“\”然后敲回车即可。

另外,如果命令特别长,或者输入了一串错误的命令时,你想要快速将这个命令删除掉,可以用一下组合键:

组合键功能与示例
[ctrl]+u/[ctrl]+k分别是从光标处向前删除指令串([ctrl]+u)及向后删除指令串([ctrl]+k)。
[ctrl]+a/[ctrl]+e分别是让光标移到指令串的最前面([ctrl]+a)或最后面([ctrl]+e)。

 

二、shell的变量功能

变量是以一组文字或符号等,来取代一些设置或者一串保留的数组。

1.变量的取用与设定:echo,变量设定规则,unset

使用echo进行变量取用的格式如下所示:

[dmtsai@study ~]$ echo ${PATH}

使用echo进行变量的设定:

[dmtsai@study ~]$ echo ${myname}

[dmtsai@study ~]$ myname=xiaoao

变量的设置规则:

(1)变量与变量内容以“=”相连接。

(2)等号两边不能直接接空格。例如myname = xiaoao是错误的。

(3)变量名称只能是英文与数字,但是开头字符不能是数字。

(4)变量内容若有空格,可使用双引号或单引号将内容结合起来,他们有以下不同:

双引号内的特殊字符如$等,可以保有原来的特性。例如

『var="lang is $LANG"』,则『echo $var』可得『lang is zh_TW.UTF-8』。

②单引号内的特殊字符仅为一般字符,例如

『var='lang is $LANG'』,则『echo $var』可得『lang is $LANG』。

(5)可用转义字符“\”将特殊符号(例如Enter、$、\、空格符、‘等)变成一般字符。

(6)在一串命令的执行中,还需要通过其它的命令提供的信息,可以使用反单引号“指令”或“$(指令)”。特别注意,那个`是键盘上方的数字键1左边那个按键。

(7)若该变量为了增加变量内容时,可以使用“$变量名称”或“${变量}”来累加内容。

(8)若改变量需要在其它子程序运行,则需要export来使变量变成环境变量

(9)通常大写字母为系统默认变量,自行设置的变量可以使用小写字母,方便用户判断。

(10)取消变量的方法为使用unset。使用方式为“unset 变量名称”。

下面做一个小练习,如图2.1所示。

图2.1 练习图

2.环境变量的功能

(1)用env观察环境变量。在终端情况下,输入env,可以得到当前系统下所有的环境变量及其内容。

常用的几个环境变量说明如下:

环境变量名称环境变量说明
HOME顾名思义,HOME目录。
SHELL默认使用的shell程序。
HISTSIZE历史命令的记录个数
MAIL使用mail命令收信时,系统回去读取邮箱。
PATH执行文件查询的路经,目录与目录之间以:分割。
LANG语言版本资料。
RANDOM随机数变量。只需要echo ${RANDOM}就可以得到0~32767的数值。特别说明,如果想使用0~9之间的数,可以用declare来声明数值类型,然后执行“declare -i number=$RANDOM*10/32768 ; echo $number”

(2)用set观察所有变量(含环境变量和自定义变量)

在系统变量中,比较重要的有以下几个:

①PS1(提示字符的设置)。这个东西就是我们的“命令提示字符”。

②$(关于本shell的PID):目前这个Shell的线程带好,也就是所谓的PID(Process ID)。

③?(关于上个执行命令的回传码):上一个执行的指令回传的值。

④OSTYPE,HOSTTYPE,MACHTYPE(主机硬件与内核的等级)

(3)export:自动将变量转为环境变量。

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

我们可以通过使用“locale -a”命令获取我们的Linux支持多少种语系。

如果其他的语系变量都未设定,且你有设定LANG或者是LC_ALL时,则其他的语系变量就会被这两个变量所取代

4.变量的有效范围

环境变量=全局变量;自定义变量=局部变量。

5.变量键盘读取、数组与声明:readarraydeclare

(1)read

要读取来自键盘输入的变量,就是用read。read的语法如下:

[dmtsai@study ~]$ read [-pt] variable

选项与参数:

-p:后面可以接提示字符

-t:后面可以接等待的秒数。

read之后不加任何参数,直接加上变量名称,那么底下就会主动出现一个空白行等待你的输入。如果加上-t后面接秒数,那么指定秒数之内没有任何动作时,该指令就会自动略过。如果是加上-p,在输入的光标前就会有比较多可以用的提示字符给我们参考。

(2)declare/typeset

声明变量的类型。如果declare后面没有接任何参数,那么bash就会主动将所有变量名称与内容通通调出来。declare用法如下:

[dmtsai@study ~]$ declare [-aixr] variable

选项与参数:

-a:将后面名为variable的变量定义成为数组(array)类型;

-i:将后面名为variable的变量定义成为整数数字(integer)类型;

-x:用法与export一样,就是将后面的variable变成环境变量;

-r:将变量设定成为readonly类型,该变量不可被更改内容,也不能unset。

注意以下两个事项:

①变量类型预设为字符串,所以若不指定变量类型,那么就会直接现实出来。

②bash环境中的数值计算只能计算整形。

(3)数组变量类型

在bash里面,数组的设置方式为:var[index]=content

例如:

范例:设定上面提到的 var[1] ~ var[3] 的变量。

[dmtsai@study ~]$ var[1]="small min"

[dmtsai@study ~]$ var[2]="big min"

[dmtsai@study ~]$ var[3]="nice min"

[dmtsai@study ~]$ echo "${var[1]}, ${var[2]}, ${var[3]}"

small min, big min, nice min

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

我们的bash可以“限制使用者的某些系统资源”,包括打开文件的数量、可以使用的CPU时间、可以使用的内存总量等。使用方式如下:

[dmtsai@study ~]$ ulimit [-SHacdfltu] [配额]

选项与参数:

-H:hardlimit,严格的设定,必定不能超过这个设定的数值;

-S:softlimit,警告的设定,可以超过这个设定值,但是若超过则有警告信息。在设定上,通常soft会比hard,举例来说,soft可设定为80而hard设定为100,那么你可以使用到90,但介于80~100之间时,系统会有警告信息通知你。

-a:后面不接任何选项与参数,可列出所有的限制额度;

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

-f:此shell可以建立的最大文件容量(一般可能设定为2GB)单位为Kbytes

-d:程序可使用的最大内存段落(segment)容量;

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

-t:可使用的最大CPU时间(单位为秒)

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

注意:

想要复原ulimit的设定最简单的方法就是注销再登入,否则就是得要重新以ulimit设定才行!不过,要注意的是,一般身份使用者如果以ulimit设定了-f的文件大小,那么他『只能继续减小文件容量,不能增加文件容量喔!』另外,若想要管控使用者的ulimit限值,可以参考第十三章的pam的介绍

7.变量内容的删除、替代和替换

(1)变量内容的删除去替换

以下面来说明:

${variable#/*local/bin:}

上面的特殊字体部分是关键词!用在这种删除模式所必须存在的

${variable#/*local/bin:}

这就是原本的变量名称,以上面范例二来说,这里就填写 path 这个『变量名称』啦!

${variable#/*local/bin:}

这是重点!代表『从变量内容的最前面开始向右删除』,且仅删除最短的那个。当使用了两个#之后,就是删除最长的那一个。

${variable#/*local/bin:}

代表要被删除的部分,由于 # 代表由前面开始删除,所以这里便由开始的 / 写起。

需要注意的是,我们还可以透过通配符 * 来取代 0 到无穷多个任意字符

所以:

#是符合替换文字“最短”的那一个;##是符合替换文字的“最长”的那一个。

如果是从右往左看,就用%。例如

[dmtsai@study ~]$ echo ${path%:*bin}

总的来说,有以下几点:

变量设定方式说明
${变量#关键词}
${变量##关键词}
若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除
若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除
${变量%关键词}
${变量%%关键词}
若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除
若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除
${变量/旧字符串/新字符串}
${变量//旧字符串/新字符串}
若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』
若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』

(2)变量的测试与内容替换

在某些时候,我们需要判断某个变量是否存在,若存在则使用既有设置,否则就赋予一个固定设置。如下所示:

new_var=${old_var-content}

新的变量,主要用来取代旧变量。新旧变量名称其实常常是一样的

new_var=${old_var-content}

这是本范例中的关键词部分!必须要存在的哩!

new_var=${old_var-content}

旧的变量,被测试的项目!

new_var=${old_var-content}

变量的『内容』,在本范例中,这个部分是在『给予未设定变量的内容』

具体设置如下:

变量设定方式str 没有预设str预设为空字符串str预设非为空字符串
var=${str-expr}var=exprvar=var=$str
var=${str:-expr}var=exprvar=exprvar=$str
var=${str+expr}var=var=exprvar=expr
var=${str:+expr}var=var=var=expr
var=${str=expr}str=expr
var=expr
str 不变
var=
str 不变
var=$str
var=${str:=expr}str=expr
var=expr
str=expr
var=expr
str 不变
var=$str
var=${str?expr}expr 输出至 stderrvar=var=$str
var=${str:?expr}expr 输出至 stderrexpr 输出至 stderrvar=$str