转载于网络,稍加整理。linux
咱们知道计算机的运做不能离开硬件,但使用者却没法直接对硬件做驱动,硬件的驱动只能透过一个称为"操做系统(Operating System)"的软件来控管,事实上, 咱们天天所谈的linux , 严格来讲只是一个操做系统, 咱们称之为"核心(kernel)"。然而,从使用者的角度来讲,使用者也没办法直接操做 kernel ,而是透过 kernel 的"外壳"程序,也就是所谓的 shell ,来与 kernel 沟通。这也正是 kernel 跟 shell 的形像命名关系。shell
从技术角度来讲, shell 是一个使用者与系统的互动界面(interface),主要是让使用者透过命令行(command line)来使用系统以完成工做。所以, shell 的最简单的定义就是---命令解译器(Command Interpreter):bash
每次当咱们完成系统登入(log in), 咱们就取得一个互动模式的 shell , 也称为 login shell或 primary shell。
若从进程(process)角度来讲,咱们在 shell 所下达的命令,均是 shell 所产生的子进程。这现像,咱们暂可称之为 fork 。
若是是执行脚本(shell script)的话,脚本中的命令则是由另一个非互动模式的子 shell(sub shell)来执行的。
也就是 primary shell 产生 sub shell 的进程, sub shell 再产生 script 中全部命令的进程。网络
当你成功登陆进一个文字界面以后,大部份情形下,你会在荧幕上看到一个不断闪烁的方块或底线(视不一样版本而别),咱们称之为游标(coursor)。
游标的做用就是告诉你接下来你从键盘输入的按键所插入的位置,且每输如一键游标便向右边移动一个格子,若连续输入太多的话,则自动接在下一行输入。
假如你刚完成登陆还没输入任何按键以前,你所看到的游标所在位置的同一行的左边部份,咱们称之为提示符号(prompt)。
提示符号的格式或因不一样系统版本而各有不一样,在 Linux 上,只需留意最接近游标的一个可见的提示符号,一般是以下二者之一:
$:给通常使用者账号使用
#:给 root (管理员)账号使用学习
事实上, shell prompt 的意思很简单:ui
咱们能够说,使用者只有在获得 shell prompt 才能打命令行,而 cursor 是指示键盘在命令行所输入的位置,使用者每输入一个键, cursor 就日后移动一格,直到碰到命令行读进 CR(Carriage Return,由 Enter 键产生)字符为止。
CR 的意思也很简单:编码
严格来讲,所谓的命令行,就是在 shell prompt 与 CR 字符之间所输入的文字。spa
系统可接受的命令名称(command-name)能够从以下途径得到:操作系统
每个命令行均必须含用命令名称,这是不能缺乏的。命令行
echo
是一个很是简单、直接的 Linux 命令:
将 argument 送出至标准输出(STDOUT),一般就是在监视器(monitor)上输出。
先运行一下echo
命令:
$ echo $
会发现只有一个空白行,而后又回到 shell prompt 上了。
这是由于 echo
在预设上,在显示完 argument 以后,还会送出一个换行符号(new-line
charactor)。
可是上面的 command 并没任何的 argument ,那结果就只剩一个换行符号了...
若你要取消这个换行符号,可利用 echo
的 -n option
:
$ echo -n $
要想看看 echo
的 argument ,可试试以下的输入:
$ echo hello hello $ echo -n hello hello$
上两个 echo
命令中,你会发现 argument 的部份显示在你的荧幕,而换行符号则视 -n option
而定。
很明显的,第二个 echo
因为换行符号被取消了,接下来的 shell prompt 就接在输出结果同
一行了。
事实上, echo
除了 -n options
以外,经常使用选项还有:
-e :启用反斜线控制字符的转换 -E:关闭反斜线控制字符的转换 -n :取消行末之换行符号
关于 echo
命令所支持的反斜线控制字符以下表:
\a: ALERT / BELL (从系统喇叭送出铃声) \b: BACKSPACE ,也就是向左删除键 \c:取消行末之换行符号 \E: ESCAPE,跳脱键 \f: FORMFEED,换页字符 \n: NEWLINE,换行字符 \r: RETURN,回车键 \t: TAB,表格跳位键 \v: VERTICAL TAB,垂直表格跳位键 \n: ASCII 八进位编码(以 x 开首为十六进制) \\:反斜线自己
" "
和‘ ’
的区别?通过前面两章的学习,应该很清楚当你在 shell prompt 后面敲打键盘、直到按下 Enter 的时
候,你输入的文字就是 command line 了,而后 shell 才会以行程的方式执行你所交给它的命令。
可是,在 command line 输入的每个文字,对 shell 来讲,是有类别之分的!
简单而言, command line 的每个 charactor ,分为以下两种:
Literal 没甚么好谈的,凡举 abcd、 123456 这些"文字"都是 literal ,但 meta 却常使咱们困惑。
事实上,前两章咱们在 command line 中已碰到两个机乎每次都会碰到的 meta :
<space>
或 <tab>
或 <enter>
三者之一组成(咱们经常使用 space )。<enter>
产生。IFS 是用来拆解 command line 的每个词(word)用的,由于 shell command line 是按词来处理的。
而 CR 则是用来结束 command line 用的,这也是为什么咱们敲
除了 IFS 与 CR ,经常使用的 meta 还有:
= : 设定变量。 $ : 做变量或运算替换(请不要与 shell prompt 搞混了)。 > :重导向 stdout。 < :重导向 stdin。 | :命令管线。 & :重导向 file descriptor ,或将命令置于背境执行。 ( ) :将其内的命令置于 nested subshell 执行,或用于运算或命令替换。 { } :将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。 ; :在前一个命令结束时,而忽略其返回值,继续执行下一个命令。 && :在前一个命令结束时,若返回值为 true,继续执行下一个命令。 || :在前一个命令结束时,若返回值为 false,继续执行下一个命令。 ! :执行 history 列表中的命令
假如咱们须要在 command line 中将这些保留字符的功能关闭的话,就须要 quoting 处理了。在 bash 中,经常使用的 quoting 有以下三种方法:
' '
(单引号),凡在 hard quote 中的全部 meta 均被关闭。" "
(双引号),在 soft quoe 中大部份 meta 都会被关闭,但某些则保留(如$ )。下面的例子将有助于咱们对 quoting 的了解:
$ A=B C # 空格键未被关掉,做为 IFS 处理。 $ C: command not found. $ echo $A $ $ A="B C" # 空格键已被关掉,仅做为空格键处理。 $ echo $A B C
在第一次设定 A 变量时,因为空格键没被关闭, command line 将被解读为:
<IFS>
,再执行 C 命令。在第二次设定 A 变量时,因为空格键被置于 soft quote 中,所以被关闭,再也不做为 IFS :<space>
C空格键不管在 soft quote 仍是在 hard quote 中,均会被关闭。 Enter 键亦然。