一、认识bash这个shell
操作系统就是一组软件,由这组软件在控制整个硬件爱你与管理系统的活动检测,如果这组软件能被用户随意的操作,那么当使用者使用不当的时候,就会使整个系统崩溃。所以用户可以透过应用程序来指挥kernel,让kernel完成我们需要的硬件任务。
也就是说,只有能够操作应用程序的借口都能被称为壳(shell)程序。狭义的壳程序指的是指令行方面的软件,包括bash。广义的shell泽包括了图形接口的软件,因为图形接口其实也能够操作各种应用程序来调用内核工作。
通过在/etc/shells文件,我们就可以看到自己的linux下面有几个可用的shells。例如我的是:
/bin/sh
/bin/bash(Linux默认的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”』,则『echovar』可得『lang is zh_TW.UTF-8』。
②单引号内的特殊字符仅为一般字符,例如
『var=’lang is LANG’』,则『echovar』可得『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命令收信时,系统回去读取邮箱。 | |
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.变量键盘读取、数组与声明:read、array、declare
(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=expr | var= | var=$str |
var=${str:-expr} | var=expr | var=expr | var=$str |
var=${str+expr} | var= | var=expr | var=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 输出至 stderr | var= | var=$str |
var=${str:?expr} | expr 输出至 stderr | expr 输出至 stderr | var=$str |