20191226刘煊赫

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

 

 

第十章、sh编程

 

  1. sh脚本

 

   sh脚本是一个包含sh语句的文本文件,命令解释程序sh要执行该语句。

   2.sh脚本与C程序

 

  sh脚本和C程序有一些相似之处,但他们在根本上是不同的。首先,sh是一个程序,逐行读取sh脚本文件并直接执行这些行。如果行是可执行命令且为内置命令,那么sh可直接执行。否则,它会复刻一个子进程来执行命令,并等待子进程终止后再继续,这与它执行单个命令行完全一样。相反,C程序必须先编译链接到一个二进制可执行文件,然后通过主sh的子进程运行二进制可执行文件。其次,在C程序中,每个变量必须有一个类型,例如charintfloat、派生类型(如struct)等。相反,在sh脚本中,每个变量都是字符串。因此不需要类型,因为只有一种类型,即字符串。最后,每个C程序必须有一个main()函数,每个函数必须定义一个返回值类型和参数(如有)。相反,sh脚本不需要main函数。在sh脚本中,第一个可执行语句是程序的入口点。

 

    3.命令口参数

 

  可使用与运行sh命令完全相同的参数调用sh脚本,如:

 

mysh one two three

 

sh脚本中,可以通过位置参数$0$1$2等访问命令行参数。前10个命令行参数可以作为$0~$9被访问。

4.sh变量

 

  sh有许多内置变量,如PATHHOMETERM等。除了内置变量外,用户还可使用任何符号作为sh变量。不需要声明。所有的sh变量值都是字符串。未赋值的sh变量是NULL字符串。

5.sh中的引号

 

  sh有许多特殊字符,如$/*><等。要想把它们用作普通字符,可使用\或单引号来引用它们。

 

  通常,\用于引用单个字符。单引号用于引用长字符串。单引号内没有置换。双引号用于保留双引号字符串中的空格,但在双引号内会发生替换。

6.sh语句

 

  sh语句包括所有Unix/Linux命令,以及可能的I/O重定向。此外,sh编程语言还支持控制sh程序执行的测试条件、循环、case等语句。

7.sh命令

 

(1) 内置命令

 

sh有许多内置命令,这些命令由sh执行,不需要创建一个新进程。下面列出一些常用的内置sh命令。

 

.file:读取并执行文件。

 

break[n]:从最近的第n个嵌套循环中退出。

 

cd[dirname]:更换目录。

 

continue[n]:重启最近的第n个嵌套循环。

 

eval[arg...]:计算一次参数并让sh执行生成的命令。

 

exec[arg...]:通过这个sh执行命令,sh将会退出。

 

exit[n]:使sh退出,退出状态为n

 

export[var...]:将变量导出到随后执行的命令。

 

read[var...]:stdin中读取一行并为变量赋值。

 

set[arg...]:在执行环境中设置变量。

 

shift:将位置参数$2$3...重命名为$1$2...

 

trap[arg][n]:接收到信号n后执行参数。

 

umask[ddd]:将掩码设置为八进制数ddd的。

 

wait[pid]:等待进程pid,如果没有给出pid,则等待所有活动子进程。

 

Read命令:当sh执行read命令时,它会等待来自stdin的输入行。它将输入行划分为几个标记,分配给列出的变量。read的一个常见用法是允许用户与正在执行的sh进行交互,在获得输入后,sh可能会测试输入字符串,以决定下一步做什么。

 

(2) Linux命令

 

   sh可以执行所有的Linux命令。其中,有些命令几乎成为sh不可分割的一部分,因为它们广泛应用于sh脚本中。下文列出并解释了其中一些命令。

 

   echo命令:echo只是将参数字符串作为行回显到stdout。它通常将相邻的多个空格压缩为一个空格,除非有引号。

 

   expr命令:因为所有的sh变量都是字符串,所以我们不能直接将它们改为数值。

 

   管道命令:在sh脚本中经常使用管道作为过滤器。

 

   实用命令:除了上面的Linux命令之外,sh还使用许多其他实用程序作为命令。其中包括:awk:数据处理程序 cmp:比较两个文件 comm:选择两个排序文件共有的行

 

grep:匹配一系列文件的模式 diff:找出两个文件的差异

 

join:通过使用相同的键来连接记录以比较两个文件 sed:流或行编辑命令

 

sort:排序或合并文件 tail:打印某个文件的最后ntr:一对一字符翻译

 

uniq:从文件中删除连续重复行

 

8.命令替换

 

  sh中,$A会被替换成A值。同样,当sh遇到cmd(用括号引起来)$(cmd)时,它会先执行cmd,然后用执行的结果字符串替换$(cmd)

9.sh控制语句

 

  sh是一种编程语言,支持许多执行控制语句,类似于C语言中的语句

 

(1) if-else-if语句

 

     if [ condition ] ; then

 

statements

 

else

 

statements

 

fi

 

需要注意的是,在sh中,0TURE,而非0FALSE

 

运算符-eq-ne-It-gt等将参数作为整数进行比较。

 

除了比较字符串或数值之外,测试程序还可以测试文件操作中经常需要的文件类型和文件属性。

 

if [-e name ] test whether file name exists

 

if [ -f name ] test whether name is a(REG)file

 

if [-d name ] test whether name is a DIR

 

if [ -r name ] test whether name is readable; similarly for -w,-x,etc.

 

if[ f1 -ef f2 ] test whether f1,f2 are the SAME file

 

(2) if-elif-else-fi语句

 

     if[ condition1 ]: then

 

commands

 

elif [ condition2 ] ; then

 

commands

 

else

 

commands

 

fi

 

复合条件:与在C语言中一样,sh也允许在符合条件中使用&&AND)和||OR),但是语法比C语言更加严格。条件必须用喻队匹配的双括号[[]]括起来。

 

(3) for语句

 

     for VARIABLE in string1 string2 ...stringn

 

 do

 

commands

 

done

 

(4) while语句

 

while[ condition ]

 

  do

 

commands

 

  done

 

(5)  until-do语句

 

until[  $ANS=give up”  ]

 

  do

 

echo -n enter your answer :

 

read ANS

 

  done

 

(6)  case

 

case $variable in

 

pattern1)  commands;

 

pattern2)  commands;

 

patternN)  commands ;

 

Esac

 

(7) continuebreak语句

10.I/O重定向

 

   当进入sh命令时,我们可以指使shI/O重定向到除默认stdinstdoutsterr以外的文件。I/O重定有以下形式和含义:

 

   >file std转向文件,如果文件不存在,将会创建文件。

 

>>file stdout追加到文件。

 

<file 将文件用作stdin;文件必须存在并具有r权限。

 

<<word here文件中获取输入,知道只包含”word”的行。

 

11.嵌入文档

 

   可以指示输出命令从stdin获取输入,将其回显到stdout,直到遇到预先安排的关键字。

12.sh函数

 

   由于sh逐行执行命令,所以必须在任何可执行语句之前定义sh脚本中的所有函数。sh语句

 

func s1 s2 ... sn

 

调用sh函数,以参数(字符串)形式传递s1~sn。在被调函数中,参数被引用为$0$1$n。通常,$0是函数名,$1$n是与命令行参数对应的位置参数。函数执行结束时,$?表示其退出状态,如果成功,状态为0,否则,状态为非0$?值可用函数的显式返回值进行更改。但是,为了测试$?的最后一次执行,必须将其分配给一个变量,然后测试该变量。

13.sh中的通配符

 

   星号通配符:sh中最有用的通配符是*,可扩展到当前目录中的所有文件。

 

示例10.14:

 

 file*:列出当前目录中所有文件的信息。

 

 ls *.c:列出当前目录中所有以.c结尾的文件。

 

?通配符:查询某文件名中的字符

 

示例10.15:

 

- file ???:3个字符的所有文件名。

 

· 1s *.??:一个点号.后有2个字符的所有文件名。

 

[]通配符:查询文件名中一对[中的字符。

 

示例10.16:

 

file *[ab]*:包含字符ab的所有文件名。 ls *[xyz]*:列出所有包含xyz的文件名。

 

    ls*[a-m]*:列出包含am范围内字符的所有文件名。

14.eval语句

 

   evalsh的一个内置命令。它由sh自己执行,而不需要复刻新进程。它将输入参数字符串连接到一个字符串中,计算一次,即执行变量和命令替换,然后给出结果字符串供sh执行。

15.调试sh脚本

 

   sh脚本可由带有-x选项的子sh运行,以进行调试,如:

 

   bash -x mysh

 

sh将在执行命令之前显示要执行的每个sh命令,包括变量和命令替换。它允许用户跟踪命令执行。如果出现错误,sh将在错误行上停止并显示错误信息。

16.sh脚本的应用

 

   sh脚本最常用于执行涉及冗长命令序列的常规作业

 

   

 

   

posted on 2021-09-26 20:33  20191226刘煊赫  阅读(29)  评论(0编辑  收藏  举报