1. 由于核心在内存中是受保护的区块,因此我们必须要透过『 Shell 』将我们输入的命令与 Kernel 沟通,好让 Kernel 可以控制硬件来正确无误的工作。
2.为何要学习命令行界面shell?
(1) .命令行界面的shell
(2) .远程管理:命令行界面比较快
(3) .Linux的任督二脉
3. 系统合法的 shell 均写在 /etc/shells 文件中;
4.用户默认登陆取得的 shell 记录于 /etc/passwd 的最后一个字段
5.bash 的功能主要有:
(1)命令记忆能力;
(2)命令与文件补全功能;
[Tab] 接在一串命令的第一个字的后面,则为命令补全;
[Tab] 接在一串命令的第二个字以后时,则为『文件补齐』!
(3)命令别名配置功能(alias);
(4)作业控制、前台 后台控制;
(5)程序化脚本;
(6)通配符;
6. type 可以用来找到运行命令为何种类型,亦可用于与 which 相同的功能;
7. 变量:
(1)变量就是以一组文字或符号等,来取代一些配置或者是一串保留的数据。
(2)变量的显示:echo
变量设置规则:
1. 变量与变量内容以一个等号『=』来连结,如下所示:
『myname=VBird』
2. 等号两边不能直接接空格符,如下所示为错误:
『myname = VBird』或『myname=VBird Tsai』
3. 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
『2myname=VBird』
4. 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
1. 双引号内的特殊字符如 $ 等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』则『echo $var』可得『lang is en_US』
2. 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
5. 可用跳脱字符『 \ 』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;
6. 在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或 『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』
7. 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:
『PATH="$PATH":/home/bin』
8. 若该变量需要在其他子程序运行,则需要以 export 来使变量变成环境变量:
『export PATH』
9. 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;
(3)取消变量的方法为使用 unset :
『unset 变量名称』例如取消 myname 的配置:unset myname
8.使用 env 与 export 可观察环境变量,其中 export 可以将自定义变量转成环境变量。
9.set 可以观察目前 bash 环境下的所有变量。
10.$? 亦为变量,是前一个命令运行完毕后的回传值。在 Linux 回传值为 0 代表运行成功。
11.locale 可用于观察语系数据。
12.变量键盘读取、数组与宣告
(1) read [-pt] varible
read 之后不加任何参数,直接加上变量名称,那么底下就会主动出现一个空白行等待你的输入(如范例一)。 如果加上 -t 后面接秒数,那么 30 秒之内没有任何动作时, 该命令就会自动略过了;如果是加上 -p ,在输入的光标前就会有比较多可以用的提示字符给我们参考
(2) .数组 (array) 变量类型
var[index]=content
(3)declare [-airx] varible
变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。
13. ulimit 可用以限制用户使用系统的资源情况。
14. 命令别名配置: alias, unalias
那么命令别名与变量有什么不同呢?
命令别名是『新创一个新的命令, 你可以直接下达该命令』的,至于变量则需要使用类似『 echo 』命令才能够呼叫出变量的内容。
15. 历史命令:history
16. Bash Shell 的操作环境:
(1)路径与命令搜寻顺序
**以相对/绝对路径运行命令,例如『 /bin/ls 』或『 ./ls 』;
**由 alias 找到该命令来运行;
**由 bash 内建的 (builtin) 命令来运行;
**透过 $PATH 这个变量的顺序搜寻到的第一个命令来运行。
(2)bash 的配置文件主要分为 login shell 与 non-login shell。 login shell 主要读取 /etc/profile 与 ~/.bash_profile, non-login shell 则仅读取 ~/.bashrc
(3)终端机的环境配置: stty, set
eof : End of file 的意思,代表『结束输入』。
erase : 向后删除字符,
intr : 送出一个 interrupt (中断) 的讯号给目前正在 run 的程序;
kill : 删除在目前命令列上的所有文字;
quit : 送出一个 quit 的讯号给目前正在 run 的程序;
start : 在某个程序停止后,重新启动他的 output
stop : 停止目前屏幕的输出;
susp : 送出一个 terminal stop 的讯号给正在 run 的程序。
17. 通配符与特殊符号
符号 |
意义 |
|
* |
代表『 0 个到无穷多个』任意字符 |
|
? |
代表『一定有一个』任意字符 |
|
[ ] |
同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』 |
|
[ - ] |
若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的! |
|
[^ ] |
若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。 |
|
符号 |
内容 |
|
# |
批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行 |
|
\ |
跳脱符号:将『特殊字符或通配符』还原成一般字符 |
|
| |
管线 (pipe):分隔两个管线命令的界定(后两节介绍); |
|
; |
连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同) |
|
~ |
用户的家目录 |
|
$ |
取用变量前导符:亦即是变量之前需要加的变量取代值 |
|
& |
工作控制 (job control):将命令变成背景下工作 |
|
! |
逻辑运算意义上的『非』 not 的意思! |
|
/ |
目录符号:路径分隔的符号 |
|
>, >> |
数据流重导向:输出导向,分别是『取代』与『累加』 |
|
<, << |
数据流重导向:输入导向 (这两个留待下节介绍) |
|
' ' |
单引号,不具有变量置换的功能 |
|
" " |
具有变量置换的功能! |
|
` ` |
两个『 ` 』中间为可以先运行的命令,亦可使用 $( ) |
|
( ) |
在中间为子 shell 的起始与结束 |
|
{ } |
在中间为命令区块的组合! |
18. 数据流重导向
(1)什么是数据流重导向啊?这得要由命令的运行结果谈起!一般来说,如果你要运行一个命令,通常他会是这样的:
(2)standard output 与 standard error output
标准输出指的是『命令运行所回传的正确的信息』
标准错误输出可理解为『 命令运行失败后,所回传的错误信息』
标准输出:读取 /etc/crontab 后,将该文件内容显示到屏幕上;
标准错误输出:因为无法找到 /etc/vbirdsay,因此在屏幕上显示错误信息
(3)标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
19. 命令运行的判断依据: ; , &&, ||
20. 管道命令 (pipe)
(1)选取命令: cut grep
Cut -d ‘分隔字符’ -f fields
Cut -c 字符范围
Grep [-acinv] [--color] ‘查找字符串’ filename
(2)排序命令: sort, wc, uniq
Sort [-fbMnrtuk] [file or stdin]
Wc [-iwm]
Uniq [-ic]
(3) 双向重导向: tee
(4) 字符转换命令: tr, col, join, paste, expand
Tr [-ds] SET1
Col [-xb]
Join [-ti12] file1 file2
在使用 join 之前,你所需要处理的文件应该要事先经过排序 (sort) 处理
Paste [-d] file1 file2
Expand [-t] file
(5) 分割命令: split
(6) 参数代换: xargs
Xargs [-0epn] command