首页 > 代码库 > Bash shell
Bash shell
一、认识bash shell
1、登录取得的shell就记录在/etc/passwd这个文件内
可以使用cat /etc/passwd查看
2、bash shell 功能
a. 命令记忆能力(history),默认1000个,存在~/.bash_history文件
b. 命令与文件补全功能(Tab键的好处)
【Tab】接在一串命令的第一个字的后面,则为命令补全
【Tab】接在一串命令的第二个字以后时,则为文件补齐。
c. 命令别名设置功能(alias), alias lm=‘ls -al‘
d. 作业控制、前台、后台控制
e. 程序脚本(shell script)
f. 通配符(Wildcard)
3、bash shell 的内置命令: type
语法:type [-tpa] name
参数:
type: 不加任何参数时, type会显示name是外部命令还是bash内置命令
-t: 当加入-t 参数时, type会将name以下面这些字眼显示出它的意义:
file:表示为外部命令;
alias: 表示该命令为命令别名所设置的名称
builtin : 表示该命令为bash内置的命令功能
-p: 如果后面接的name为外部命令时, 才会显示完整文件名
-a :会由PATH变量定义的路径中,将所有含name的命令都列出来,包含alias
type主要在找出“执行文件”而不是一般文件名。所以,这个type也可以用来作为类似which命令的用途
二、shell 的变量功能
1、变量的显示与设置: echo, unset
变量的显示: echo ---》 echo $variable 或 echo ${varible}
变量的设置规则:
a. 变量与变量内容以一个等号“=”来连接,如下所示: myname=sam
b. 等号两边不能直接接空格符
c. 变量名称只能是英文字母与数字,但是开头字符不能是数字
d. 变量内容若有空格符可使用双引号" 或单引号 ‘ 将变量内容结合起来,但是双引号内的特殊字符如$等,可以保留原本的特性,单引号内的特殊字符则仅为一般字符(纯文本)
e.可用转义字符“\”将特殊符号变成一般字符
f. 在一串命令中,还需要通过其他的命令提供的信息,可以使用反单引号。`命令` 或 $(命令),
特别注意,那个是键盘上方数字键1左边那个按键,而不是单引号。
g. 若该变量为了增加变量内容时, 则可用$变量名称或¥{变量}累加内容,如下:
PATH=$PATH:/home/bin
h. 若该变量需要在其他子进程执行,则需要以export来使变量变成环境变量:
"export PATH"
i. 通常大写字符为系统默认变量,自行设置变量可以使用小写字符, 方便判断
j.取消变量: unset 变量名称
子进程: 就是说在我目前这个shell的情况下,去打开另一个新的shell,新的那个shell就是子进程。在一般的状态下,父进程的自定义变量是无法再子进程内使用的。但是通过export将变量变成环境变量后,就能够在子进程下面应用了。
2、 环境变量的功能
查看环境量: env
常见的环境变量:
HOME: 代表用户的主文件夹。
SHELL: 它告知我们目前这个环境使用的shell是哪个程序?Linux默认使用/bin/bash的
HISTSIZE: 这个与“历史命令”有关,即是我们曾经执行过的命令可以被系统记录下来,而记录的“条数”则是由这个值来设置的。
MAIL:当我们使用mail这个命令在收信时系统会去读取的邮件信箱文件
PATH: 就是执行文件查找的路径,目录 与目录中间以冒号(:)分隔,由于文件的查找是依序由PATH的变量内的目录来查询,所以目录的顺序也是重要的。
LANG:语系数据
RANDOM: 这是“随机数”的变量。在BASH的环境下,这个RANDOM变量的内容介于0~32767
set查看所有变量(含有环境变量与自定义变量)
a. PS1(提示符的设置):
这是PS1(数字的1, 不是英文字母),这个东西就是我们的“命令提示符”。当我们每次按下【Enter】键去执行某个命令后,最后要在次出现提示符时, 就会主动去读取这个变量值了。上面PS1内显示的是一些特殊符号,这些特殊符号可以显示不同的信息,每个distributions的bash默认的PS1变量内容可能有些区别,你可以用man bash 查询一下PS1的相关说明,以理解下面的一些符号意义。
\d: 可显示出“星期月日”的日期格式, 如“Mon Feb 2”
\H: 完整的主机名, 如“www.vbird.tsai”
\h: 仅去主机名在第一个小数点之前的名字, 如“www”
\t: 显示时间,为24小时格式的“HH:MM:SS”
\T: 显示时间, 为12小时格式的“HH:MM:SS”
\A: 显示时间,为24小时格式的“HH:MM”
\@:显示时间, 为12小时格式的“am/pm”样式
\u: 目前用户的账号名称,如“root”
\v: BASH的版本信息
\w: 利用basename函数取得工作目录名称,所以仅会列出最后一个目录名
\#: 执行的第几个命令
\$: 提示符,如果是root时,提示符为#, 否则就是$
例: PS1=‘[\u@\h \w \A #\#]\$ ‘ --------》 [root@www /home/dmtsai 16:40 #12]#
b.$(关于本shell的PID)
“$”本身也是个变量。这个代表的是目前这个Shell的线程号,即是所谓的PID(Process ID)
c. ? (关于上个执行命令的回传码)
这个变量是上一个执行命令所传回的值, 当我们执行某些命令时, 这些命令都会回传一个执行后的代码。一般来说, 如果成功执行该命令,则会回传一个0值。如果发生错误,则回传一个非0值。
d. OSTYPE, HOSTTYPE, MACHTYPE(主机硬件与内核的等级)
export: 自定义变量转成环境变量
export 变量名称
3、影响显示结果的语系变量(locale)
4、变量键盘读取、数组与声明: read, array, declare
a. read : 读取来自键盘输入的变量
read 【-pt】 variable
-p: 后面可以接提示符
-t: 后面可以接等待的“秒数”
b. declare/typeset
declare或typeset是一样的功能,就是声明变量的类型。
declare [-aixr] variable
参数:
-a: 将后面名为variable的变量定义成为数组(array)类型
-i: 将后面名为variable的变量定义为整数数字(integer)类型
-x: 用法与export一样,就是将后面的variable变成环境变量, 注意将-变成+可以进行“取消”操作,将环境变量变成一般变量
-r: 将变量设置成为readonly类型,该变量不可被更改内容,也不能重设
由于在默认的情况下面, bash对于变量有几个基本的定义:
a. 变量类型默认为“字符串”, 所以若不指定变量类型, 则1+2为一个“字符串”而不是“计算式”,
b. bash环境中的数值计算, 默认最多仅能到达整数类型,所以1/3结果是0
数组(arry)变量类型
var[index]=content
读取: ${var[index]}
5、与文件系统及程序的限制关系: ulimit
bash可以限制用户的某些系统资源的,包括可以打开的文件数量、可以使用的CPU时间、可以使用的内存总量等
ulimit [-SHacdfltu] [配额]
参数:
-H: hard limit 严格的设置,必定不能超过这个设置的数值
-S: soft limit 警告的设置,可以超过这个设置值,但是若超过则有警告信息
-a: 后面不接任何参数,可列出所有的限制额度
-c: 当某些进程发生错误时,系统可能会将该进程在内存中的信息写成文件(排错用), 这种文件就被称为内核文件。此为限制每个内核文件的最大容量。
-f: 此shell可以创建的最大文件容量(一般可能设置为2GB)单位为KB
-d: 进程可使用的最大断裂内存(segment)容量
-l: 可用于锁定(lock)的内存量。
-t: 可使用的最大CPU时间(单位为秒)
-u: 单以用户可以使用的最大进程数量。
注意: 想要复原ulimit的设置最简单的方法就是注销再登陆,否则就是得要重新以ulimit设置才行。不过要注意的是一般身份用户如果以ulimit设置了-f的文件大小,那么他只能继续减少文件的容量,不能增加文件的容量。
6、变量内容的删除、替代与替换
变量内容的删除与替换
变量设置方式 | 说明 |
${变量#关键字} | 若变量内容从头开始的数据符合“关键字”, 则将符合的最短数据删除 |
${变量##关键字} | 若变量内容从头开始的数据符合“关键字”, 则将符合的最长数据删除 |
${变量%关键字} | 若变量内容从尾向前的数据符合“关键字”,则将符合的最短数据删除 |
${变量%%关键字} | 若变量内容从尾向前的数据符合“关键字”, 则将符合的最长数据删除 |
${变量/旧字符串/新字符串} | 若变量内容符合“旧字符串”, 则第一个旧字符串被新字符串替换 |
${变量//旧字符串、新字符串} | 若变量内容符合“旧字符串”, 则全部旧字符串被新字符串替换 |
变量的测试与内容替换
在某些时刻我们经常需要“判断”某个变量是某存在,若变量存在则使用既有的设置,若变量不存在则给予一个常用的设置。
new_var=${old_var-content}
new_var: 新的变量,主要用来替换旧变量。新旧变量名称其实经常是一样的
old_var: 旧的变量, 被测试的选项
content: 变量的“内容”
注: new_var=${old_var:-content}
加上:后若变量内容为空或者为未设置,度能够以后面的内容替换
如果想要将旧变量内容也一起替换掉的话,那么就是用等号(=):
如: unset str; var=${str=newvar} --->var=newvar, str=newvar
str="oldvar"; var=${str=newvar}--->var=newvar, str=oldvar
如果只想知道,如果旧变量不存在时, 整个测试就告知我“有错误”,此时就能够使用问号“?”
如: var=${str?无此变量}
三、命令别名与历史命令
1、命令别名设置:alias, unalias
例: alias rm=‘rm -i‘
alias 列出所有命令别名
unalias rm 解除命令别名
2、历史命令:history
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中
有关history的命令:
!number :执行第几条命令
!command : 由最近的命令向前搜寻命令串开头为command的那个命令,并执行
!! : 就是执行上一个命令(相当于按up键后,按enter键)
四、Bash Shell的操作环境
1、路径与命令查找顺序
基本上,命令运行的顺序可以这样看:
1、以相对/绝对路径执行命令,例如: "/bin/ls"或“./ls”
2、由alias找到该命令来执行
3、由bash内置的(builtin)命令来执行
4、通过$PATH这个变量的顺序找到的第一个命令来执行
可以通过type -a command 查看执行顺序
2、bash的登录与欢迎信息:/etc/issue, /etc/motd
a. 终端机接口(tty1~tty6)登录时的登录界面: /etc/issue登录界面提示符设置文件
issue内的各个代码意义 | |
\d | 本地端时间的日期 |
\l | 显示第几个终端机接口 |
\m | 显示硬件的等级(i386/i486/i586/i686...) |
\n | 显示主机的网络名称 |
\o | 显示domain name |
\r | 操作系统的版本(相当于rname -r) |
\t | 显示本地端的时间 |
\s | 操作系统的名称 |
\v | 操作系统的版本 |
如果你想要让用户登录后取得一些信息,例如你想要让大家都知道的信息,那么可以将信息加入/etc/motd里面去:如下
3、bash的环境配置文件
(1)、 login与non-login shell
login shell:取得bash完整的登录流程中,就称为login shell.
non-login shell:
login shell 只会读取这两个配置文件:
/etc/profile:这是系统整体的设置,最好不要修改此配置文件
~/.bash_profile或~/.bash_login或~/.profile: 属于用户个人设置
/etc/profile(login shell才会读):
这个文件设置的变量主要有:
PATH:会依据UID决定PATH变量要不要含有sbin的系统命令目录
MAIL: 依据账号设置好用户的mailbox到/var/spool/mail/账号名
USER: 根据用户的账号设置此变量内容
HOSTNAME: 依据主机的hostname命令决定此变量内容
HISTSIZE:历史命令记录条数
/etc/profile不止会做这些事, 还会去调用外部的设置数据,下面这些数据会依序被调用进来:
a. /etc/inputrc: 这个文件会主动判断用户有没有自定义输入的按键功能,如果没有,/etc/profile就会决定设置“INPUTRC=/etc/inputrc”这个变量。此文件内容为bash的热键、【Tab】键有没有声音等的数据。
b. /etc/profile.d/*.sh: 只要在/etc/profile.d/这个目录内且扩展名为.sh,另外用户能够具有r的权限,那么该文件就会被/etc/profile调用。这个目录下面的文件规定了bash操作接口的颜色、语系、ll与ls命令别名、vi的命令别名、which的命令别名等。如果需要帮所有用户设置一些共享的命令别名时,可以在这个目录下面自行创建扩展名为.sh的文件,并将所需要的数据写入即可。
c. /etc/sysconfig/i18n: 这个文件是由/etc/profile.d/lang.sh调用的。这也是我们决定bash默认使用何种语系的重要配置文件。文件里最重要的就是LANG这个变量的设置。
注意:bash的login shell情况下所读取的整体环境配置文件其实只有/etc/profile,但是/etc/profile还会调用其他的配置文件。
其实bash在都玩了整体环境设置的/etc/profile并借此调用其他配置文件后,接下来则是会读取用户的个人配置文件。在login shell的bash环境中,所读取的个人偏好配置文件其实主要有三个,依序分别是:
~/.bash_profile, ~/.bash_login, ~/.profile, 其实bash的loginshell设置只会读取上面三个文件的其中一个,而读取的顺序则是依照上面的顺序。
读出顺序如下:
(2):source: 读入环境配置文件的命令
source 配置文件名
. 配置文件名
利用source或小数点(.)都可以将配置文件的内容读进目前的shell环境中。
(3): non-login shell:
当你取得non-login shell时, 该bash配置文件仅会读取~/.bashrc而已
(4): /etc/bashrc帮我们的bash定义下面的数据:
根据不同的UID规定umask的值
依据不同的UID规定提示符(就是PS1变量)
调用/etc/profile.d/*.sh的设置
(5)、其他相关配置文件
a、 /etc/man.config: 这个文件的内容规定了使用man的时候man page的路径到哪里去寻找。
b、~/.bash_history: 每次登录bash后,bash会先读取这个文件,将所有的历史命令读入内存
c、 ~/.bash_logout: 这个文件记录当我们注销bash后系统再帮我们做完什么操作后才离开
4、终端机的环境设置: stty, set
查阅目前的一些按键内容: stty [-a]
参数: -a : 将目前所有的stty参数列出来
设置热键: 如 stty erase ^h ^h--->[ctrl]+h
eof: End of file 的意思,代表结束输入
erase: 向后删除字符
intr: 送出一个interrupt(中断)信号给目前正在运行的程序
kill: 删除在目前命令行上的所有文字
quit: 送出一个quit的信号给目前正在运行的进程
start: 在某个进程停止后,重新启动它的输出
stop: 停止目前屏幕的输出
susp: 送出一个terminal stop的信号给正在运行的进程
Bash shell