我是靠谱客的博主 着急万宝路,最近开发中收集的这篇文章主要介绍细读shell,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 1.从使用者的角度来说,使用者也没办法直接操作 kernel  而是透过 kernel  "外壳"程序,也就是所谓的 shell  ,来与 kernel  沟通。

每次当我们完成系统登入(log in) 我们就取得一个互动模式的 shell 也称为 login she

primary shell 

若从行程(process)角度来说,我们在 shell 所下达的命令,均是 shell 所产生的子行程。

这现像,我们暂可称之为 fork

如果是执行脚本(shell script)的话,脚本中的命令则是由另外一个非互动模式的子 shell

(sub shell)来执行的。  也就是 primary shell 产生 sub shell 的行程,sub shell 再产生 script 中所有命令的行程。 

 

2.这里,我们必须知道:kernel shell 是不同的两套软件,而且都是可以被替换的

* 不同的操作系统使用不同的 kernel  

* 而在同一个 kernel 之上,也可使用不同的 shell  

linux 的预设系统中,通常都可以找到好几种不同的 shell ,且通常会被列于如

里: 

/etc/shells 

不同的 shell 有着不同的功能,且也彼此各异、或说"大同小异" 

常见的 shell 主要分为两大主流: 

sh 

burne shell (sh) 

burne again shell (bash) 

csh 

c shell (csh) 

tc shell (tcsh) 

korn shell (ksh)

3. shell prompt(PS1) Carriage Return(CR) 的关系?

当你成功登录进一个文字界面之后,大部份情形下,  你会在荧幕上看到一个不断闪烁的方块或底线(视不同版本而别)  我们称之为*游标*(coursor)

假如你刚完成登录还没输入任何按键之前,你所看到的游标所在位置的同一行的左边部份。我们称之为*提示符号*(prompt)

$:给一般使用者帐号使用 

#:给 root (管理员)帐号使用

命令行读进 CR(Carriage Return,由 Enter 键产生

所谓的命令行,就是在 shell prompt CR 字符之间所输入的文字。

 

4.同的命令可接受的命令行格式或有不同, 一般情况下, 一个标准的命令行格式为如下所列:

command-name options argument 

若从技术细节来看, shell 会依据 IFS(Internal Field Seperator) command line

输入的文字给拆解为"字段"(word) 

然后再针对特殊字符(meta)先作处理,最后再重组整行 command line  

其中的 IFS shell 预设使用的字段分隔符,可以由一个及多个如下按键组成: 

* 空格键(White Space) 

* 表格键(Tab) 

* 回车键(Enter) 

系统可接受的命令名称(command-name)可以从如下途径获得:

* 明确路径所指定的外部命令 

* 命令别名(alias) 

* 自定功能(function) 

* shell 内建命令(built-in) 

* $PATH 之下的外部命令 

每一个命令行均必需含用命令名称,这是不能缺少的。

 

5.关于echo

$ echo -n  不换行输出

事实上,echo 除了 -n options 之外,常用选项还有: 

-e :启用反斜线控制字符的转换(参考下表

-E:关闭反斜线控制字符的转换(预设如此

-n :取消行末之换行符号( -e 选项下的 c 字符同意

关于 echo 命令所支持的反斜线控制字符如下表: 

aALERT / BELL (从系统喇叭送出铃声

bBACKSPACE ,也就是向左删除键 

c:取消行末之换行符号 

EESCAPE,跳脱键 

fFORMFEED,换页字符 

nNEWLINE,换行字符 

rRETURN,回车键 

tTAB,表格跳位键 

vVERTICAL TAB,垂直表格跳位键 

nASCII 八进位编码( x 开首为十六进制

\:反斜线本身

 

6. 关于command

command line 的每一个 charactor ,分为如下两种

* literal:也就是普通纯文字,对 shell 来说没特殊功能。 

* meta shell 来说,具有特定功能的特殊保留字符。 

CR 则是用来结束 command line 用的,这也是为何我们敲 <enter> 命令就会跑的原

除了 IFS CR ,常用的 meta 还有: 

= 设定变量。 

$ 作变量或运算替换(请不要与 shell prompt 搞混了) 

> :重导向 stdout 

< :重导向 stdin 

|:命令管线。 

& :重导向 file descriptor ,或将命令置于背境执行。 

( ):将其内的命令置于 nested subshell 执行,或用于运算或命令替换。 

{ }:将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。

; :在前一个命令结束时,而忽略其返回值,继续执行下一个命令。 

&& :在前一个命令结束时,若返回值为 true,继续执行下一个命令。 

|| :在前一个命令结束时,若返回值为 false,继续执行下一个命令。 

!:执行 history 列表中的命令 

.... 

 

7.quoting

bash 中,常用的 quoting 有如下三种方法: 

* hard quote' ' (单引号),凡在 hard quote 中的所有 meta 均被关闭。 

* soft quote " " (双引号),在 soft quoe 中大部份 meta 都会被关闭,但某些则保留(

$ )(注二

* escape (反斜线),只有紧接在 escape (跳脱字符)之后的单一 meta 才被关闭。 

( 注二:在 soft quote 中被豁免的具体 meta 清单,我不完全知道, 

有待大家补充,或透过实作来发现及理解。

代码:

   $ A=B C   # 空格键未被关掉,作为 IFS 处理。 

   $ C: command not found. 

   $ echo $A 

    

   $ A="B C"   # 空格键已被关掉,仅作为空格键处理。 

   $ echo $A 

   B

C

 

   $ A="B 

   > C

> " 

$ echo $A 

B C

 

 $ A=B 

   > C 

   > 

   $ echo $A 

   BC

 

$ A=B C 

   $ echo "$A" 

   B C 

   $ echo '$A' 

   $A

 

  $ A=B C 

  $ echo '"$A"'   # 最外面的是单引号 

  "$A" 

  $ echo "'$A'"   # 最外面的是双引号 

  'B C' 

  (提示:单引号及双引号,在 quoting 中均被关?#93;了。)

 

8.面我们提到的那些 meta ,都是在 command line 中有特殊用途的, 

比方说 { }  是将其内一系列 command line  置于不具名的函式中执行(可简单视为

command block ) 

但是,awk 却需要用 { } 来区分出 awk 的命令区段(BEGIN, MAIN, END) 

若你在 command line 中如此输入:  

$ awk {print $0} 1.txt

由于 { } shell 中并没关闭,那 shell 就将 {print $0} 视为 command block  

但同时又没有" ; "符号作命令区隔,因此就出现 awk 的语法错误结果。 

要解决之,可用 hard quote   

$ awk '{print $0}' 1.txt

上面的 hard quote 应好理解,就是将原本的 {<space>$(注三)} 这几个 shell meta 关闭,  避免掉在 shell 中遭到处理,而完整的成为 awk 参数中的 command meta  

( 注三:而其中的 $0 awk 内建的 field number ,而非 awk 的变量, 

awk 自身的变量无需使用 $ )

要是理解了 hard quote 的功能,再来理解 soft quote escape 就不难:

awk "{print $0}" 1.txt 

awk {print $0} 1.txt

然而,若你要改变 awk $0 0 值是从另一个 shell 变量读进呢? 

比方说:已有变量 $A 的值是 0 ,那如何在 command line 中解决 awk $$A 呢?  你可以很直接否定掉 hard quoe 的方案:  

$ awk '{print $$A}' 1.txt

那是因为 $A $ hard quote 中是不能替换变量的。

我想,应该可以解释为何我们可以使用如下操作了吧:

代码:

A=0 

awk "{print $$A}" 1.txt 

awk {print $$A} 1.txt 

awk '{print $'$A'}' 1.txt 

awk '{print $'"$A"'}' 1.txt     # 注:"$A" 包在 soft quote

 


转载于:https://blog.51cto.com/qqtthappygo/955779

最后

以上就是着急万宝路为你收集整理的细读shell的全部内容,希望文章能够帮你解决细读shell所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部