1 认识BASH
我们必须要通过Shell将我们输入的命令与内核沟通,好让内核可以控制硬件来正确无误地工作。
Bash shell的功能
历史命令:命令行按“上下键”就可以找到前/后一个输入的指令。
命令与文件补全功能:
- [Tab] 接在一串指令的第一个字的后面,则为命令补全;
- [Tab] 接在一串指令的第二个字以后时,则为“文件补齐”
命令别名设置功能:
- alias lm='ls -al'
询指令是否为 Bash shell 的内置命令: type
[dmtsai@study ~]$ type [-tpa] name 选项与参数: :不加任何选项与参数时,type 会显示出 name 是外部指令还是 bash 内置指令 -t :当加入 -t 参数时,type 会将 name 以下面这些字眼显示出他的意义: file :表示为外部指令; alias :表示该指令为命令别名所设置的名称; builtin :表示该指令为 bash 内置的指令功能; -p :如果后面接的 name 为外部指令时,才会显示完整文件名; -a :会由 PATH 变量定义的路径中,将所有含 name 的指令都列出来,包含 alias
2 Shell的变量功能
变量即可变的量。如设定一个x,换到别的地方依旧使用x,那么就是变量的方便之处。
变量的取用与设置:echo, 变量设置规则, unset
[dmtsai@study ~]$ echo $variable [dmtsai@study ~]$ echo $PATH
[dmtsai@study ~]$ echo ${myname} <==这里并没有任何数据~因为这个变量尚未被设置 [dmtsai@study ~]$ myname=Roy [dmtsai@study ~]$ echo ${myname}
环境变量的功能
环境变量可以帮我们达到很多功能~包括主文件夹的变换、提示字符的显示、可执行文件搜寻的路径。
列出目前的 shell 环境下的所有环境变量与其内容。 [dmtsai@study ~]$ env HOSTNAME=study.centos.vbird <== 这部主机的主机名称 TERM=xterm <== 这个终端机使用的环境是什么类型 SHELL=/bin/bash <== 目前这个环境下,使用的 Shell 是哪一个程序? HISTSIZE=1000 <== “记录指令的笔数”在 CentOS 默认可记录 1000 笔 OLDPWD=/home/dmtsai <== 上一个工作目录的所在 LC_ALL=en_US.utf8 <== 语系设置 USER=dmtsai <== 使用者的名称啊 LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01: or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32: *.tar=01... <== 一些颜色显示 MAIL=/var/spool/mail/dmtsai <== 这个使用者所取用的 mailbox 位置 PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin PWD=/home/dmtsai <== 目前使用者所在的工作目录 (利用 pwd 取出!) LANG=zh_TW.UTF-8 <== 这个与语系有关,下面会再介绍! HOME=/home/dmtsai <== 这个使用者的主文件夹啊! LOGNAME=dmtsai <== 登陆者用来登陆的帐号名称 _=/usr/bin/env <== 上一次使用的指令的最后一个参数(或指令本身)
3 命令别名与历史命令
命令别名设置: alias, unalias
alias lm='ls -al | more' alias rm='rm -i' |
组合按键 | 执行结果 |
Ctrl + C | 终止目前的命令 |
Ctrl + D | 输入结束 (EOF),例如邮件结束的时候; |
Ctrl + M | 就是 Enter 啦! |
Ctrl + S | 暂停屏幕的输出 |
Ctrl + Q | 恢复屏幕的输出 |
Ctrl + U | 在提示字符下,将整列命令删除 |
Ctrl + Z | “暂停”目前的命令 |
符号 | 内容 |
# | 注解符号:这个最常被使用在 script 当中,视为说明!在后的数据均不执行 |
\ | 跳脱符号:将“特殊字符或万用字符”还原成一般字符 |
| | 管线 (pipe):分隔两个管线命令的界定(后两节介绍); |
; | 连续指令下达分隔符号:连续性命令的界定 (注意!与管线命令并不相同) |
~ | 使用者的主文件夹 |
$ | 取用变量前置字符:亦即是变量之前需要加的变量取代值 |
& | 工作控制 (job control):将指令变成背景下工作 |
! | 逻辑运算意义上的“非” not 的意思! |
/ | 目录符号:路径分隔的符号 |
>, >> | 数据流重导向:输出导向,分别是“取代”与“累加” |
<, << | 数据流重导向:输入导向 (这两个留待下节介绍) |
' ' | 单引号,不具有变量置换的功能 ($ 变为纯文本) |
" " | 具有变量置换的功能! ($ 可保留相关功能) |
` ` | 两个“ ` ”中间为可以先执行的指令,亦可使用 $( ) |
( ) | 在中间为子 shell 的起始与结束 |
{ } | 在中间为命令区块的组合 |
4 数据重定向
- 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
- 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
- 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
指令下达情况 | 说明 |
cmd1 && cmd2 | 1. 若 cmd1 执行完毕且正确执行($?=0),则开始执行 cmd2。 2. 若 cmd1 执行完毕且为错误 ($?≠0),则 cmd2 不执行。 |
cmd1 || cmd2 | 1. 若 cmd1 执行完毕且正确执行($?=0),则 cmd2 不执行。 2. 若 cmd1 执行完毕且为错误 ($?≠0),则开始执行 cmd2。 |
5 管线命令(pipe)
ls -al /etc | lessx
选取命令: cut, grep
[dmtsai@study ~]$ cut -d'分隔字符' -f fields <==用于有特定分隔字符 [dmtsai@study ~]$ cut -c 字符区间 <==用于排列整齐的讯息 选项与参数: -d :后面接分隔字符。与 -f 一起使用; -f :依据 -d 的分隔字符将一段讯息分区成为数段,用 -f 取出第几段的意思; -c :以字符 (characters) 的单位取出固定字符区间;
[dmtsai@study ~]$ grep [-acinv] [--color=auto] '搜寻字串' filename 选项与参数: -a :将 binary 文件以 text 文件的方式搜寻数据 -c :计算找到 '搜寻字串' 的次数 -i :忽略大小写的不同,所以大小写视为相同 -n :顺便输出行号 -v :反向选择,亦即显示出没有 '搜寻字串' 内容的那一行! --color=auto :可以将找到的关键字部分加上颜色的显示喔! 范例一:将 last 当中,有出现 root 的那一行就取出来; [dmtsai@study ~]$ last | grep 'root' |
排序命令: sort, wc, uniq
[dmtsai@study ~]$ sort [-fbMnrtuk] [file or stdin] 选项与参数: -f :忽略大小写的差异,例如 A 与 a 视为编码相同; -b :忽略最前面的空白字符部分; -M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法; -n :使用“纯数字”进行排序(默认是以文字体态来排序的); -r :反向排序; -u :就是 uniq ,相同的数据中,仅出现一行代表; -t :分隔符号,默认是用 [tab] 键来分隔; -k :以那个区间 (field) 来进行排序的意思 范例一:个人帐号都记录在 /etc/passwd 下,请将帐号进行排序。 [dmtsai@study ~]$ cat /etc/passwd | sort
[dmtsai@study ~]$ uniq [-ic] 选项与参数: -i :忽略大小写字符的不同; -c :进行计数 范例一:使用 last 将帐号列出,仅取出帐号栏,进行排序后仅取出一位; [dmtsai@study ~]$ last | cut -d ' ' -f1 | sort | uniq
[dmtsai@study ~]$ wc [-lwm] 选项与参数: -l :仅列出行; -w :仅列出多少字(英文单字); -m :多少字符; 范例一:那个 /etc/man_db.conf 里面到底有多少相关字、行、字符数? [dmtsai@study ~]$ cat /etc/man_db.conf | wc
双向重导向: tee
[dmtsai@study ~]$ tee [-a] file 选项与参数: -a :以累加 (append) 的方式,将数据加入 file 当中! [dmtsai@study ~]$ last | tee last.list | cut -d " " -f1 # 这个范例可以让我们将 last 的输出存一份到 last.list 文件中;
字符转换命令: tr, col, join, paste, expand
tr 可以用来删除一段信息当中的文字
[dmtsai@study ~]$ tr [-ds] SET1 ... 选项与参数: -d :删除讯息当中的 SET1 这个字串; -s :取代掉重复的字符! 范例一:将 last 输出的讯息中,所有的小写变成大写字符: [dmtsai@study ~]$ last | tr '[a-z]' '[A-Z]'
[dmtsai@study ~]$ col [-xb] 选项与参数: -x :将 tab 键转换成对等的空白键
join合并数据
[dmtsai@study ~]$ join [-ti12] file1 file2 选项与参数: -t :join 默认以空白字符分隔数据,并且比对“第一个字段”的数据, 如果两个文件相同,则将两笔数据联成一行,且第一个字段放在第一个! -i :忽略大小写的差异; -1 :这个是数字的 1 ,代表“第一个文件要用那个字段来分析”的意思; -2 :代表“第二个文件要用那个字段来分析”的意思。
paste 就直接“将两行贴在一起
[dmtsai@study ~]$ paste [-d] file1 file2 选项与参数: -d :后面可以接分隔字符。默认是以 [tab] 来分隔的! - :如果 file 部分写成 - ,表示来自 standard input 的数据的意思。
[dmtsai@study ~]$ expand [-t] file 选项与参数: -t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空白键取代。 我们也可以自行定义一个 [tab] 按键代表多少个字符呢!