- 由于内核在内存中是受保护的区块,因此我们必须要透过『 Shell 』将我们输入的指令与内核沟通,好让内核可以控制硬件来正确无误的工作
- 学习 shell 的原因主要有:文字界面的 shell 在各大Linux发行版都一样;远端管理时命令行模式速度较快; shell 是管理 Linux 系统非常重要的一环,因为 Linux 内很多管理命令都是以 shell 撰写的。
- 系统合法的 shell 均写在 /etc/shells 文件中;
- 使用者默认登录取得的 shell 记录于 /etc/passwd 的最后一个字段;
- bash 的功能主要有:历史命令;命令与文件补全功能;命令别名设定功能;任务管理、前台后台控制;程序化脚本;通配符
-
\+【enter】 #转义【enter】,使其不具有执行功能,变成下一行
组合键 功能 [crtl]+u/[crtl]+k 从光标向前删除/从光标向后删除 [crtl]+a/[crtl]+e 光标移动到最前面/光标移动到最后面
-
- type 可以用来找到执行指令为何种类型,亦可用于与 which 相同的功能;
- 变量就是以一组文字或符号等,来替换一些设定或者是一串保留的数据
- 变量主要有环境变量与自定义变量,或称为全局变量与局部变量
- 使用 env 与 export 可观察环境变量,其中 export 可以将自定义变量转成环境变量;
-
echo $variable #使用变量 echo ${variable} #使用变量 variable=xxxx #设置变量内容,变量名称开头字符不能是数字 var="lang is $LANG" #""双引号内特殊字符$可保持其原有功能,$LANG为变量 var='lang is $LANG' #''单引号内特殊字符仅为纯文本,$LANG仅为文字 export variable #使变量变为环境变量 unset variable #取消变量
- set 可以观察目前 bash 环境下的所有变量;
- $? 亦为变量,是前一个指令执行完毕后的回传值。在 Linux 回传值为 0 代表执行成功;
- locale 可用于观察语系资料;
- 可用 read 让使用者由键盘输入变量的值
- ulimit 可用以限制使用者使用系统的资源情况
- bash 的配置文件主要分为 login shell 与 non-login shell。login shell 主要读取 /etc/profile 与 ~/.bash_profile, non-login shell 则仅读取 ~/.bashrc
- 在使用 vim 时,若不小心按了 [ctrl]+s 则画面会被冻结。你可以使用 [ctrl]+q 来解除冻结
alias lm='ls -al | more' #命令别名
unalias lm #取消命令别名
history #读取历史命令
!! #可执行上个命令
!n #可执行第n个命令
!vi #可执行开头是vi的命令
- 命令执行顺序:1.以相对/绝对路径执行命令,例如【/bin/ls】或【./ls】 2.由alias找到该命令来执行 3.由bash内置的命令来执行 4.通过$PATH这个变量的顺序查找到的第一个命令来执行 ##type 可查看命令的执行顺序
- /etc/issue bash的登录信息
-
组合按键 执行结果 crtl + c
终止目前的命令 crtl + d 输入结束 crtl + m 回车 crtl + s 暂停屏幕的输出 crtl + q 恢复屏幕的输出 crtl + u 在提示字符下,删除整列命令 crtl + z 暂停目前的命令
-
- 通配符主要有: *, ?, [] 等等
-
符号 意义 * 代表『 0 个到无穷多个』任意字符 ? 代表『一定有一个』任意字符 [ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』 [ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的! [^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。 -
符号 内容 # 批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行 \ 跳脱符号:将『特殊字符或通配符』还原成一般字符 | 管线 (pipe):分隔两个管线命令的界定(后两节介绍); ; 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同) ~ 用户的家目录 $ 取用变量前导符:亦即是变量之前需要加的变量取代值 & 工作控制 (job control):将命令变成背景下工作 ! 逻辑运算意义上的『非』 not 的意思! / 目录符号:路径分隔的符号 >, >> 数据流重导向:输出导向,分别是『取代』与『累加』 <, << 数据流重导向:输入导向 (这两个留待下节介绍) ' ' 单引号,不具有变量置换的功能 " " 具有变量置换的功能! ` ` 两个『 ` 』中间为可以先运行的命令,亦可使用 $( ) ( ) 在中间为子 shell 的起始与结束 { } 在中间为命令区块的组合! - 数据流重导向通过 >, 2>, < 之类的符号将输出的信息转到其他文件或装置去;
-
标准输入 (stdin) :代码为 0 ,使用 < 或 << ;
标准输出 (stdout):代码为 1 ,使用 > 或 >> ;
标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;
1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上;
1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上;
2> :以覆盖的方法将『错误的数据』输出到指定的文件或装置上;
2>>:以累加的方法将『错误的数据』输出到指定的文件或装置上;
/dev/null 为垃圾桶,将信息输出此处即不显示,丢弃数据
- 连续命令的下达可通过 ; 或 && 或 || 等符号来处理
命令下达情况 | 说明 |
cmd1 && cmd2 | 1. 若 cmd1 运行完毕且正确运行($?=0),则开始运行 cmd2。 2. 若 cmd1 运行完毕且为错误 ($?≠0),则 cmd2 不运行。 |
cmd1 || cmd2 | 1. 若 cmd1 运行完毕且正确运行($?=0),则 cmd2 不运行。 2. 若 cmd1 运行完毕且为错误 ($?≠0),则开始运行 cmd2。 |
- 管道命令的重点是:『管道命令仅会处理 标准输出standard output,对于标准错误 standard error output 会予以忽略』 『管道命令必须要能够接受来自前一个命令的数据成为标准输入 standard input 继续处理才行。』
- 本章介绍的管线命令主要有:cut, grep, sort, wc, uniq, tee, tr, col, join, paste, expand, split, xargs 等。
命令 | 作用 |
---|---|
cut | 以行为单位截取信息 |
grep | 分析一行信息,如有所需信息取出该行 |
sort | 排序 |
wc | 排序后将重复数据合并显示 |
uniq | 计算输出信息的整体数据,多少字、多少行、多少字符 |
tee | 双向重定向,将数据流分送到文件与屏幕 |
tr | 删除或进行文字信息替换 |
col | 多用于将[tab]替换为空格 |
join | 在两个文件中,将有相同数据的一行,加在一起 |
paste | 将两行贴在一起,中间以[tab]隔开 |
expand | 将[tab]转成空格键 |
split | 将大文件划分为小文件 |
xargs | 参数代换 |