Linux的shell编程

来源:互联网 发布:财经杂志知乎 编辑:程序博客网 时间:2024/04/28 01:45

 

<!-- /* Font Definitions */ @font-face{font-family:"MS 明朝";panose-1:2 2 6 9 4 2 5 8 3 4;mso-font-alt:"MS Mincho";mso-font-charset:128;mso-generic-font-family:roman;mso-font-pitch:fixed;mso-font-signature:-1610612033 1757936891 16 0 131231 0;}@font-face{font-family:SimSun;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:宋体;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:Century;panose-1:2 4 6 4 5 5 5 2 3 4;mso-font-charset:0;mso-generic-font-family:roman;mso-font-pitch:variable;mso-font-signature:647 0 0 0 159 0;}@font-face{font-family:"MS Pゴシック";panose-1:2 11 6 0 7 2 5 8 2 4;mso-font-charset:128;mso-generic-font-family:modern;mso-font-pitch:variable;mso-font-signature:-1610612033 1757936891 16 0 131231 0;}@font-face{font-family:"/@SimSun";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 135135232 16 0 262145 0;}@font-face{font-family:"/@MS 明朝";panose-1:2 2 6 9 4 2 5 8 3 4;mso-font-charset:128;mso-generic-font-family:roman;mso-font-pitch:fixed;mso-font-signature:-1610612033 1757936891 16 0 131231 0;}@font-face{font-family:"/@MS Pゴシック";panose-1:2 11 6 0 7 2 5 8 2 4;mso-font-charset:128;mso-generic-font-family:modern;mso-font-pitch:variable;mso-font-signature:-1610612033 1757936891 16 0 131231 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-parent:"";margin:0mm;margin-bottom:.0001pt;text-align:justify;text-justify:inter-ideograph;mso-pagination:none;font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:Century;mso-fareast-font-family:"MS 明朝";mso-bidi-font-family:"Times New Roman";mso-font-kerning:1.0pt;}a:link, span.MsoHyperlink{color:blue;text-decoration:underline;text-underline:single;}a:visited, span.MsoHyperlinkFollowed{color:purple;text-decoration:underline;text-underline:single;}p{mso-margin-top-alt:auto;margin-right:0mm;mso-margin-bottom-alt:auto;margin-left:0mm;mso-pagination:widow-orphan;font-size:12.0pt;font-family:"MS Pゴシック";mso-bidi-font-family:"MS Pゴシック";} /* Page Definitions */ @page{mso-page-border-surround-header:no;mso-page-border-surround-footer:no;}@page Section1{size:595.3pt 841.9pt;margin:99.25pt 30.0mm 30.0mm 30.0mm;mso-header-margin:42.55pt;mso-footer-margin:49.6pt;mso-paper-source:0;layout-grid:18.0pt;}div.Section1{page:Section1;}-->

Linuxshell

http://tech.sina.com.cn/c/1338.html

Shell本身是一个用C写的程序,它是用使用Linux梁。Shell既是一命令言,又是一程序设计语言。作命令言,它交互式地解行用户输入的命令;作程序设计语言,它定了各种变量和参 数,并提供了多在高级语言中才具有的控制构,包括循和分支。它然不是Linux核心的一部分,但它用了系核心的大部分功能来行程序、建 立文件并以并行的方式协调各个程序的运行。因此,于用shell是最重要的用程序,深入了解和熟掌握shell的特性极其使用方法,是用好 Linux关键。可以shell使用的熟程度反映了用户对Linux使用的熟程度。

  一、什shell

  当一个用Linux之后,系初始化程序init为每一个用运行一个称shell(外壳)的程序。那shell是什呢? 确切一点shell就是一个命令行解器,它提供了一个向Linux内核求以便运行程序的界面系统级程序,用可以用shell来启、 挂起、停止甚至是写一些程序。

  当用使用Linux是通命令来完成所需工作的。一个命令就是用shell间对话的一个基本位,它是由多个字符成并以束的 字符串。shell户输入的命令,就象DOS里的command.com所做的一,所不同的是,在DOS中,command.com只有一个,而在Linux下比流行的shell有好几个,shell都各有千秋。一般的Linux都将bashshell

  二、几流行的shell

  目前流行的shellashbashkshcshzsh等,你可以用下面的命令来看你自己的shell型:

  #echo $SHELL

  $SHELL是一个量,它记录所使用的shell型。你可以用命令:

  #shell-name

  来转换shellshell-name是你想要尝试使用的shell的名称,如ash等。个命令又启了一个shellshell在最初登的那个shell之后,称shell或子shell。使用命令:

  $exit

  可以退出个子shell

  使用不同的shell的原因在于它各自都有自己的特点,下面作一个简单的介

  1.ash

  ash shell是由Kenneth Almquist写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。

  2.bash

  bashLinux使用的shell,它由Brian FoxChet Ramey共同完成,是Bourne Again Shell写,内部命令一共有40个。Linux使用它作shell是因它有如以下的特色:

  (1)可以使用DOS下面的doskey的功能,用方向键查阅和快速入并修改命令。

  (2)过查找匹配的方式出以某字符串开头的命令。

  (3)包含了自身的帮助功能,你只要在提示符下面help就可以得到相的帮助。

  3.ksh

  kshKorn shell写,由Eric Gisin写,共有42条内部命令。shell最大的点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买版本的情况下尝试版本的性能了。

  4.csh

  cshLinux大的内核,它由以William Joy代表的共47位作者成,共有52个内部命令。shell是指向/bin/tcsh这样的一个shell,也就是csh就是tcsh

  5.zch

  zchLinux最大的shell之一,由Paul Falstad完成,共有84个内部命令。如果只是一般的用途,是没有必要安装这样shell的。

3. shell程序设计(部分)

  其命令言交互式地解行用户输入的命令只是shell功能的一个方面,shell可以用来行程序设计,它提供了定义变量和参数 的手段以及丰富的程序控制构。使用shell似于DOS中的批理文件,称shell script,又叫shell程序或shell命令文件。

  1.shell基本

  shell的基本法主要就是如何入命令运行程序以及如何在程序之shell的一些参数提供便利手段来行通

  (1)出重定向

  在Linux中, 一个程都有三个特殊的文件描述指(standard input,文件描述指针为0)(standard output,文件描述指针为1)错误输(standard error,文件描述指针为2)三个特殊的文件描述指使程在一般情况下接收端的入,同端来出,Linux也向使 用者提供可以使用普通的文件或管道来取代设备。在shell中,使用者可以利用“>”“<”出重定向。如:

  command>file:将命令的果重定向到一个文件。

  command>&file:将命令的错误输出一起重定向到一个文件。

  command>>file:将出的果追加到文件中。

  command>>&file:将出和错误输出的构都追加到文件中。

  command

  (2)管道pipe

  pipe可以在出和错误输做代替工作,这样一来,可以将某一个程序的出送到另一个程序的入,其法如下:

  command1| command2[| command3...]

  也可以错误输出一起送入管道:

  command1| &command2[|&command3...]

  (3)前台和后台

  在shell下面,一个新生的程可以通用命令后面的符号“&”来分以前台和后台的方式来行,法如下:

  command

  生一个前台的程,下一个命令命令运行束后才能入。

  command &

  生一个后台的程,此程在后台运行的同,可以入其他的命令。

  2shell程序的量和参数

  像高程序设计语言一shell也提供明和使用量的功能。shell,所有量的取都是一个字符串,shell程序采用$var的形式来引用名var量的

  Shell有以下几基本型的量:

  (1)shell

  shell就已了一些和系的工作境有量,量用户还可以重新定,常用的shell量有:

  HOME:用于保存注册目的完全路径名。

  PATH:用于保存用冒号分隔的目路径名,shell将按PATH量中出的序搜索些目,找到的第一个与命令名称一致的可行文件将被行。

  TERM端的型。

  UID:当前用标识符,取是由数字构成的字符串。

  PWD:当前工作目绝对路径名,该变量的取cd命令的使用而化。

  PS1:主提示符,在特下,缺省的主提示符是“#”,在普通用下,缺省的主提示符是“$”

  PS2:在shell接收用户输入命令的程中,如果用入行的末尾“/”然后回,或者当用按回车键时shell判断出用户输入的命令没有助提示符,提示用户继续输入命令的其余部分,缺省的助提示符是“>”

  (2)

  用可以按照下面的规则自己的量:

  量名=

  要注意的一点是,在定义变量名前不加符号“$”,在引用量的内容时则应量名前加“$”;在给变赋值时,等号两一定不能留空格,若量中本身就包含了空格,整个字符串都要用双引号括起来。

  在shell程序了使量名和命令名相区,建所有的量名都用大写字母来表示。

  有想要在明一个量并一个特定后就不在改它的可以用下面的命令来保一个量的只性:

  readly 量名

  在任何候,建立的量都只是当前shell的局部量,所以不能被shell运行的其他命令或shell程序所利用,export命令可以将一局部量提供shell行的其他命令使用,其格式

  export 量名

  也可以在给变赋值的同使用export命令:

  export 量名=

  使用export明的量,在shell以后运行的所有命令或程序中都可以访问到。

  (3)位置参数

  位置参数是一shell程序的命令行中按照各自的位置决定的量,是在程序名之后入的参数。位置参数之用空格分隔,shell取第 一个位置参数替程序文件中的$1,第二个替$2,依次推。$0是一个特殊的量,它的内容是当前shell程序的文件名,所以,$0不是一个位 置参数,在示当前所有的位置参数是不包括$0的。

  (4)义变

  义变量和量相似,也是在shell就定了的量,所不同的是,用只能根据shell的定来使用量,而不能重定它。所有义变量都是由$符和另一个符号成的,常用的shell义变量有:

  $#:位置参数的数量

  $*:所有位置参数的内容

  $?:命令行后返回的状

  $$:当前程的程号

  $!:后台运行的最后一个程号

  $0:当前行的程名

  其中,“$?”用于检查上一个命令行是否正确(Linux中,命令退出状态为0表示命令正确行,任何非0表示命令出)

  “$$”量最常的用途是用作临时文件的名字以保证临时文件不会重

  (5)参数置

  shell提供了参数置能力以便用可以根据不同的条件来给变不同的。参数置量有四量通常与某一个位置参数相系,根据指定的位置参数是否已经设决定量的取,它法和功能分如下。

  a. =${参数-word}:如果置了参数,用参数的换变量的,否word。即这种变量的等于某一个参数的,如果参数没有置,则变量就等于word

  b. =${参数=word}:如果置了参数,用参数的换变量的,否置成word然后再用word参数的。注意,位置参数不能用于这种方式,因shell程序中不能位置参数赋值

  c. =${参数?word}:如果置了参数,用参数的换变量的,否word并从shell中退出,如果省略了word则显准信 息。这种变量要求一定等于某一个参数的,如果参数没有置,就示一个信息,然后退出,因此这种方式常用于出指示。

  d. =${参数+word}:如果置了参数,word换变量,否行置

  所有形式中的参数既可以是位置参数,也可以是另一个量,只是用位置参数的情况比多。

接下来以bash例向大家介shell程序设计的高部分:shell程的流程控制、调试方法及shell程序的运行方法,便也向大家介一下bash的内部命令。

  四、shell程序设计的流程控制

  和其他高程序设计语言一shell提供了用来控制程序行流程的命令,包括条件分支和循环结构,用可以用些命令建立非常复杂的程序。

  与传统言不同的是,shell用于指定条件的不是布表达式而是命令和字符串。

  1.test测试命令

  test命令用于检查某个条件是否成立,它可以行数、字符和文件三个方面的测试,其测试符和相的功能分如下:

  (1)值测试

  -eq:等于则为

  -ne:不等于则为

  -gt:大于则为

  -ge:大于等于则为

  -lt:小于则为

  -le:小于等于则为

  (2)字符串测试

  =:等于则为

  !=:不相等则为

  -z字符串:字符串伪则为

  -n字符串:字符串度不伪则为

  (3)文件测试

  -e文件名:如果文件存在则为

  -r文件名:如果文件存在且可读则为

  -w文件名:如果文件存在且可写则为

  -x文件名:如果文件存在且可则为

  -s文件名:如果文件存在且至少有一个字符则为

  -d文件名:如果文件存在且录则为

  -f文件名:如果文件存在且普通文件则为

  -c文件名:如果文件存在且字符型特殊文件则为

  -b文件名:如果文件存在且为块特殊文件则为

  另外,Linux提供了与(“”)、或(“-o)、非(“-a”)三个逻辑操作符用于将测试条件接起来,其级为最高,“-a”次之,“-o”最低。

  同bash也能完成简单的算运算,格式如下:

  $[expression]

  例如:var1=2

  var2=$[var1*10+1]

  var2值为21

  2.if条件

  shell程序中的条件分支是通if条件句来实现的,其一般格式

  if条件命令串

  then

  条件的命令串

  else

  条件的命令串

  fi

  3.for

  for环对一个量的可能的行一个命令序列。赋给变量的几个数既可以在程序内以数列表的形式提供,也可以在程序以外以位置参数的形式提供。for的一般格式

  for量名

  [in列表]

  do

  若干个命令行

  done

  量名可以是用户选择的任何字符串,如果量名是varin之后出的数序替命令列表中的$var。如果省略了in则变var的取将是位置参数。对变量的一个可能的赋值都将dodone的命令列表。

  4.whileuntil

  whileuntil命令都是用命令的返回状态值来控制循的。While的一般格式

  while

  若干个命令行1

  do

  若干个命令行2

  done

  只要while若干个命令行1”中最后一个命令的返回状态为真,while继续执do...done若干个命令行2”

  until命令是另一环结构,它和while命令相似,其格式如下:

  until

  若干个命令行1

  do

  若干个命令行2

  done

  untilwhile的区在于:while在条件时继续执行循,而until是在条件时继续执行循

  Shell提供了truefalse两条命令用于建立无限循环结构的需要,它的返回状总为0总为0

  5.case条件选择

  if条件句用于在两个选项定一,而case条件选择为提供了根据字符串或量的从多个选项选择的方法,其格式如下:

  case string in

  exp-1)

  若干个命令行1

  ;;

  exp-2)

  若干个命令行2

  ;;

  ……

  *)

  其他命令行

  esac

  shell过计算字符串string,将其果依次和表达式exp-1exp-2行比,直到找到一个匹配的表达式止,如果找到了匹配项则执行它下面的命令直到遇到一分号(;;)止。

  在case表达式中也可以使用shell的通配符(“*”“[ ]”)。通常用“*”case命令的最后表达式以便使在前面找不到任何相的匹配项时执其他命令行的命令。

  6.无条件控制breakcontinue

  break用于立即止当前循行,而contiune用于不行循中后面的句而立即始下一个循行。两个句只有放在dodone才有效。

  7.函数定

  在shell可以定函数。函数实际上也是由若干条shell命令成的,因此它与shell程序形式上是相似的,不同的是它不是一个独的程,而是shell程序的一部分。函数定的基本格式

  functionname

  {

  若干命令行

  }

  用函数的格式

  functionname param1 param2……

  shell函数可以完成某些例行的工作,而且可以有自己的退出状,因此函数也可以作ifwhile等控制构的条件。

  在函数定义时不用参数明,但在用函数可以有参数,此shell将把些参数分别赋予相的位置参数$1$2...$*

  8.命令分

  在shell中有两命令分的方法:“()”“{}”,前者当shell()中的命令将再建一个新的子程,然后个子程去括弧中的命令。当用行某个命令不想命令运行时对集合(如位置参数、量、当前工作目)的改影响到下面句的,就应该 些命令放在括弧中,这样就能保所有的改生影响,而父程不受任何干{}用于将行的命令的果用于另一个命令的(管道 方式)。当我要真正使用括弧和花括弧(算表达式的)需要在其前面加上转义(/)以便shell知道它不是用于命令行的控制所 用。

  9.信号

  trap命令用于在shell程序中捕捉到信号,之后可以有三方式:

  (1)行一段程序来一信号

  (2)接受信号的默操作

  (3)视这一信号

  trap上面三方式提供了三基本形式:

  第一形式的trap命令在shell接收到signal list中数相同的信号,将行双引号中的命令串。

  trap 'commands' signal-list

  trap "commands"signal-list

  了恢信号的默操作,使用第二形式的trap命令:

  trap signal-list

  第三形式的trap命令允信号:

  trap " " signal-list

  注意:

  (1)信号11()不能捕捉,因shell本身需要捕捉信号去行内存的转储

  (2)trap中可以定义对信号0(实际上没有个信号)shell程序在其(exit)时发信号。

  (3)在捕捉到signal-list中指定的信号并行完相的命令之后,如果些命令没有将shell程序止的shell程序将继续执行收到信号行的命令后面的命令,这样将很容易shell程序无法止。

  另外,在trap句中,引号和双引号是不同的,当shell程序第一次碰到trap,将把commands中的命令描一遍。此 commands是用引号括起来的,那shell不会commands中的量和命令行替,否commands中的量和命令将用当具体 的来替

  五、运行shell程序的方法

  用可以用任何编辑程序来shell程序。因shell程序是解释执行的,所以不需要编译装配成目程序,按照shell程的例,以 bash例,程序的第一行一般“#/bin/bash”,其中#表示行是注shell运行号之后的命令并用文件的其余部分作为输入,也就是运行/bin/bash/bin/bashshell程序的内容。

  shell程序的方法有三

  (1)sh shell程序文件名

  这种方法的命令格式

  bash shell程序文件名

  这实际上是用一个新的bash命令解程序,而把shell程序文件名作参数传递给它。新启shell将去指定的文件,行文件中列出的命令,当所有的命令都行完束。方法的点是可以利用shell调试功能。

  (2)sh

  格式

  bash

  这种方式就是利用入重定向,使shell命令解程序的入取自指定的程序文件。

  (3)chmod命令使shell程序成行的

  一个文件能否运行取决于文件的内容本身可行且文件具有shell程序,当用编辑器生成一个文件,系统赋予的限都是644(rw-r-r--),因此,当用需要运行个文件,只需要直接入文件名即可。

  在运行shell程序的方法中,最好按下面的方式选择:当建立一个shell程序,它的正确性没有把握当使用第一方式调试。当一个shell程序已经调试使用第三方式把它固定下来,以后只要入相的文件名即可,并可被另一个程序所用。

六、bash程序的调试

  在程中免会出,有的候,调试程序比写程序花时间还要多,shell程序同如此。

  shell程序的调试主要是利用bash命令解程序的选择项bash的形式是:

  bash -选择项shell程序文件名

  几个常用的选择项是:

  -e:如果一个命令失就立即退出

  -n入命令但是不行它

  -u:置换时把未置的量看作出

  -v:当shell入行把它们显示出来

  -x行命令把命令和它的参数示出来

  上面的所有选项也可以在shell程序内部用“set -选择项的形式引用,而“set +选择项将禁止该选择项起作用。如果只想程序的某一部分使用某些选择项时可以将部分用上面两个句包起来。

  1.未置量退出和立即退出

  未置量退出特性允户对所有检查,如果引用了一个未赋值量就shell程序 的行。shell通常允未置量的使用,在这种情况下,量的值为空。如果置了未置量退出选择项一旦使用了未置量就错误信息,并止程 序的运行。未置量退出选择项为“-u”

  当shell运行,若遇到不存在或不可行的命令、重定向失或命令非正常束等情况,如果 未重新定向,信息会打印在端屏幕上,而shell程序仍将继续执行。要想在错误发迫使shell程序立即束,可以使用“-e”选项 shell程序的行立即止。

  2.shell程序的跟踪

  调试shell程序的主要方法是利用shell命令解程序的“-v”“-x”选项来跟踪程序 的行。“-v”选择项使shell行程序的程中,把它入的一个命令行都示出来,而“-x”选择项使shell行程序的程中把它行的 一个命令在行首用一个“+”加上命令名示出来。并把一个量和该变量所取的示出来,因此,它的主要区在于:在行命令行之前无“-v” 打印出命令行的原始内容,而有“-v”打印出经过后的命令行的内容。

  除了使用shell“-v”“-x”选择项以外,可以在shell程序内部采取一些 的措施。例如,可以在shell程序的一些关键地方使用echo命令把必要的信息示出来,它的作用相当于C言中的printf句,这样就可以知道 程序运行到什地方及程序目前的状

  七、bash的内部命令

  bash命令解程序包含了一些内部命令。内部命令在目列表是看不的,它shell本身提供。常用的内部命令有:echoevalexecexportreadonlyreadshiftwait和点(.)。下面简单其命令格式和功能。

  1.echo

  命令格式:echo arg

  功能:在屏幕上打印出由arg指定的字符串。

  2.eval

  命令格式:eval args

  功能:当shell程序行到evalshell入参数args,并将它们组合成一个新的命令,然后行。

  3.exec

  命令格式:exec命令命令参数

  功能:当shell行到exec,不会去建新的子程,而是行指定的命令,当指定的命令行完该进程,也就是最初的shell止了,所以shell程序中exec后面的句将不再被行。

  4.export

  命令格式:export量名或:export量名=

  功能:shell可以用export把它的量向下入子shell从而承父程中的量。但子shell不能用export把它的量向上入父shell

  注意:不任何量名的export句将示出当前所有的export量。

  5.readonly

  命令格式:readonly量名

  功能:将一个用shell标识为不可的。不任何参数的readonly命令将示出所有只shell量。

  6.read

  命令格式:

  read量名表

  功能:从设备读入一行,分解成若干字,赋值给shell程序内部定量。

  7.shift

  功能:shift句按如下方式重新命名所有的位置参数量:$2$1$3$2……在程序中使用一次shift句,都使所有的位置参数依次向左移一个位置,并使位置参数“$#”减一,直到减到0

  8.wait

  功能:是shell等待在后台启的所有子束。Wait的返回值总是真。

  9.exit

  功能:退出shell程序。exit之后可有选择地指定一个数字作返回状

  10.“.”()

  命令格式:. Shell程序文件名

  功能:使shell入指定的shell程序文件并依次行文件中的所有句。