广义shell就是用户与操作系统kernel交互的工具
狭义shell当然就是要学习的bash shell,或者csh等
shell版本众多,/etc/shells这个文件中记录了合法的shell,系统会去这个文件中检查使用者能够是用的shell版本
用户登陆时取得的shell由/etc/passwd这个文件规定
基本功能:
内建命令 type:
这个命令可以查看命令的种类,内建(builtin),别名(alias),或者外部指令
1.首先,必须了解bash环境变量(PATH,MAIL,USER等)
env命令可以查看当前shell的环境变量,
set:bash 可不只有环境变量喔,还有一些与 bash 操作介面有关的变量(如HISTFILE,PS1,PS2,$当前shell的PID , ?刚执行完指令的返回值等),以及使用者自己定义的变量存在的。set可以查看所有这些变量
export也可以查看环境变量,而且,在父shell或子shell中声明的变量都只能自己使用,若要使父shell的变量为子shell所用,则要将变量export为环境变量。(不过子shell的变量能不能给父shell用呢?)
2. 变量的申明和使用
3.影响显示结果的语系变量(locale)
locale -a 可以查看系统支持的所有语系
locale则列出当前的语系,如:
- LANG=en_US.UTF-8
- LC_CTYPE="en_US.UTF-8"
- LC_NUMERIC="en_US.UTF-8"
- LC_TIME="en_US.UTF-8"
- LC_COLLATE="en_US.UTF-8"
- LC_MONETARY="en_US.UTF-8"
- LC_MESSAGES="en_US.UTF-8"
- LC_PAPER="en_US.UTF-8"
- LC_NAME="en_US.UTF-8"
- LC_ADDRESS="en_US.UTF-8"
- LC_TELEPHONE="en_US.UTF-8"
- LC_MEASUREMENT="en_US.UTF-8"
- LC_IDENTIFICATION="en_US.UTF-8"
- LC_ALL=
有很多,但是一般只需要定义LANG,后面的选项自动设置
注意:/etc/sysconfig/i18n中定义了系统预设语系
4.变量键盘读取、数组与宣告: read, array, declare
- read [-pt] variable
- 选项与参数:
- -p :后面可以接提示字元!
- -t :后面可以接等待的秒数
array:
- declare [-aixr] variable
- 选项与参数:
- -a :将后面名为 variable 的变数定义成为阵列 (array) 类型
- -i :将后面名为 variable 的变数定义成为整数数字 (integer) 类型
- -x :用法与 export 一样,就是将后面的 variable 变成环境变数;
- -r :将变数设定成为 readonly 类型,该变数不可被更改内容,也不能 unset
用+取代-,可以将相应的特征除去
前面提到,变量默认是字符串,在此可以将变量定义为数组或者整数,但似乎不能处理小数?(bash 环境中的数值运算,预设最多仅能到达整数形态,所以 1/3 结果是 0;)
- ulimit [-SHacdfltu] [配额]
- 选项与参数:
- -H :hard limit ,严格的设定,必定不能超过这个设定的数值;
- -S :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息。
- 在设定上,通常 soft 会比 hard 小,举例来说,soft 可设定为 80 而 hard
- 设定为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时,
- 系统会有警告讯息通知你!
- -a :后面不接任何选项与参数,可列出所有的限制额度;
- -c :当某些程式发生错误时,系统可能会将该程式在记忆体中的资讯写成档案(除错用),
- 这种档案就被称为核心档案(core file)。此为限制每个核心档案的最大容量。
- -f :此 shell 可以建立的最大档案容量(一般可能设定为 2GB)单位为 Kbytes
- -d :程序可使用的最大断裂记忆体(segment)容量;
- -l :可用于锁定 (lock) 的记忆体量
- -t :可使用的最大 CPU 时间 (单位为秒)
- -u :单一使用者可以使用的最大程序(process)数量。
在Bash Shell中,$算符会触发下述3种扩展:
3.变量扩展(三)
alias只是一种简化写法,不要期望它能做更智能的事
alias lm="ls -l | more",如果这样使用lm:lm file,是不能按照你的意愿执行的
历史:
- 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 中!
- !number
- !command
- !!
- 选项与参数:
- number :执行第几笔指令的意思;
- command :由最近的指令向前搜寻‘指令串开头为 command’的那个指令,并执行;
- !! :就是执行上一个指令(相当于按↑按键后,按 Enter)
注意:默认情况下~/.bash_history文件记录的是本次登录前的命令记录,本次登录使用的历史记录需要登出后才会写入这个文件。
在同一账号有多个终端登录的情况下,非最后登出的本次历史记录将被覆盖
执行命令的先后顺序:
login 与 non-login shell:
这两个取得 bash 的情况中,读取的文件资料并不一样。
一般来说,login shell 其实只会读取这两个文件:
注意:一般情况下,修改了配置文件后,不能立即生效,要在下次登录时才能生效。利用source或者(.)命令可以使配置文件立即生效。在有多个配置文件切换使用比较有用
non-login shell只读取~/.bashrc这一个配置文件
其他几个配置文件:
/etc/man.config(man相关),~/.bash_history,~/.bash_logout(登出处理)
预设情况下已经很好了,不需要动,知道有这两个命令就可以了,用到再说吧
bash预设的组合键:
- 组合按键 执行结果
- Ctrl + C 终止目前的命令
- Ctrl + D 输入结束 (EOF),例如邮件结束的时候;
- Ctrl + M 就是 Enter 啦!
- Ctrl + S 暂停萤幕的输出
- Ctrl + Q 恢复萤幕的输出
- Ctrl + U 在提示字元下,将整列命令删除
- Ctrl + Z ‘暂停’目前的命令
10.通配符和特殊符号
通配符:
- * 代表‘ 0 个到无穷多个’任意字元
- ? 代表‘一定有一个’任意字元
- [ ] 同样代表‘一定有一个在括号内’的字元(非任意字元)。例如 [abcd] 代表‘一定有一个字元,
- 可能是 a, b, c, d 这四个任何一个’
- [ - ] 若有减号在中括号内时,代表‘在编码顺序内的所有字元’。例如 [0-9] 代表 0 到 9
- 之间的所有数字,因为数字的语系编码是连续的!
- [^ ] 若中括号内的第一个字元为指数符号 (^) ,那表示‘反向选择’,例如 [^abc] 代表
- 一定有一个字元,只要是非 a, b, c 的其他字元就接受的意思。
特殊符号:
- # 注解符号:这个最常被使用在 script 当中,视为说明!在后的资料均不执行
- \ 转义符号:将‘特殊字元或万用字元’还原成一般字元
- | 管线 (pipe):分隔两个管线命令的界定(后两节介绍);
- ; 连续指令下达分隔符号:连续性命令的界定 (注意!与管线命令并不相同)
- ~ 使用者的家目录
- $ 取用变数前置字元:亦即是变数之前需要加的变数取代值
- & 工作控制 (job control):将指令变成背景下工作
- ! 逻辑运算意义上的‘非’ not 的意思!
- / 目录符号:路径分隔的符号
- >, >> 资料流重导向:输出导向,分别是‘取代’与‘累加’
- <, << 资料流重导向:输入导向 (这两个留待下节介绍)
- ' ' 单引号,不具有变数置换的功能
- " " 具有变数置换的功能!
- ` ` 两个‘ ` ’中间为可以先执行的指令,亦可使用 $( )
- ( ) 在中间为子 shell 的起始与结束
- { } 在中间为命令区块的组合!