Shell编程
shell是一个命令行解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止、,还可以用来编写一些程序;
几种常见的shell:
目前主要使用的shell有ash、bash、ksh、csh、zsh等,可以用 # echo $ SHELL 查看shell的类型;
$ SHELL是一个环境变量,它记录用户所使用的shell类型;可以用命令: # shell-name来转换到别的shell,这里shell-name是想要尝试使用的shell的名称,,如ash等;这个命令为用户又启动了一个shell,这个shell在最初登录的那个shell之后,称为下级的shell或子shell;
使用命令:$ exit可以退出这个子shell;
使用不同的shell的原因是因为它们各有不同的特点:
(1)、ash:ash shell是Linux中占用系统资源最少的一个小shell;它只包含24个内部命令,因而使用起来很不方便;
(2)、bash:bash是Linux系统默认使用的shell;内部命令一个有40个,Linux使用它作为默认的shell是因为它有以下特点:
●可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令;
●自动通过查找匹配的方式给出以某字符串开头的命令;
●包含了自身的帮助功能,只要在提示符下键入help就可以得到相关的帮助;
(3)、ksh:ksh有42条内部命令,该shell最大的优点是几乎和商业发行版的ksh完全兼容;
(4)、csh:csh是Linux比较的的内核,共有52个内部命令;该shell其实是指向 / bin / tcsh这样的一个shell;换句话说,csh就是tcsh;
(5)、zch:zch是Linux最大的shell之一,共有84个内部命令,如果只是一般都用途,就没有必要安装这样的shell;
Shell程序设计
Shell除了作为命令语言交互式地解释和执行用户输入的命令还可以用来进行程序设计,它提供了定义变量和参数的手段,以及丰富的程序控制结构;使用shell编程类似于DOS中的批处理文件,称为shell script,又叫作shell程序或shell命令文件;
Shell基本语法:
Shell的基本语法主要就是如何输入命令运行程序,以及如何在程序之间通过shell的一些参数提供便利手段来进行通信;
1、输入输出重定向
在Linux中,每一个进程都有三个特殊的文件描述指针:标准输入(文件描述指针为0)、标准输出(文件描述指针为1)、标准错误输出(文件描述指针为2);这三个特殊的文件描述指针使进程在一般情况下接收标准输入终端的输入,同时由标准终端来显示输出,Linux同时也向使用者提供可以使用普通的文件或管道来取代这些标准输入输出设备;在shell中,使用者可以利用“ > “或 ” < “来进行输入输出重定向;
Command >file:将命令的输出结果重定向到一个文件;
2、管道pipe
Pipe同样可以在标准输入输出和标准错误输出间做替代工作,这样可以将某一个程序的输出送到另一个程序的输入;语法如下:
Command 1 l command 2 [ l command 3 …… ]
也可以连同标准错误输出一起送入管道:
Command 1 l command 2 [ & command 3 ……
3、前台和后台
在shell下面,一个新产生的进程可以通过用命令后面的符号“ ; ” 和 “ &” 来分别以前台和后台的方式来执行,语法如下:
command
产生一个前台进程,下一个命令需等该命令运行结束后才能输入;
command &
产生一个后台的进程,此进程在后台运行的同时,可以输入其它命令;
Shell程序的变量和参数
对于shell来讲所有,所有变量的取值都是一个字符串,shell程序采用$var的形式来引用名为var的变量的值,shell有以下几种类型的基本变量:
(1)、shell定义的环境变量
常见的shell环境变量有:
● HOME:用于保存注册目录的完全路径名;
● PATH:用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜索这些目录,找到的第一个与目录名称一致的可执行文件将被执行;
● TERM:终端的类型;
● UID:当前用户的标识符,取值是由数字构成的字符串;
● PWD:当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化;
● PS1:主提示符,在特权用户下。默认的主提示符是 “ #”;在普通用户下,默认的主提示符是 “ $ “;
● PS2:在shell接收用户命令的过程中,如果用户在输入行的末尾输入“ \ “ 然后回车,或者当用户按回车键时shell判断出用户输入的命令没有结束时,显示这个辅助提示符,提示用户继续输入命令的其余部分,默认的辅助提示符是“ > ”;
(2)、用户定义的变量
用户可以按照下面语法规则定义自己的变量:
变量名=变量名
要注意的一点是,在定义变量时,变量名前不应加符号 “ $ “,在引用变量的内容时则应在变量名前加” $ “;在给变量赋值时,等号两边一定不能六空格,若变量中本身就留了空格,则整个字符串都要用双引号括起来;
在编写shell程序时,为了使变量名和命令名相区别,所有的变量名都应该用大写字母来表示;
在任何时候,建立的变量都只是当前shell的局部变量所以不能被shell运行的其它命令或shell程序所利用,export命令可以将一局部变量提供给shell执行的其他命令使用,其格式为:
export 变量名=变量名
使用export说明的变量,在shell以后运行的所有命令或程序中都可以使用到;
(3)、位置参数
位置参数是一种在调用shell程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数;位置参数之间用空格分隔,shell取第一个位置参数替换程序文件中的$1,第二个替换$2,依次类推;$0是一个特殊的变量,它的内部是当前这个shell程序的文件名,所有,$0不是一个位置参数,在显示当前所有位置参数时是不包括$0的;
(4)、预定义变量
预定义变量和环境变量相类似,也是在shell一开始时就定义的变量,不同的是,用户只能根据shell的定义来使用这些变量,而不能重定义它,所有预定义变量都是由$符号和另一个符号组成的,常用的shell预定义变量有:
● $ #:位置参数的数量
● $ *:所有位置参数的内容
● $ ?:命令执行后返回的状态
● $ $:当前进程的进程号
● $ !:后台运行的最后一个进程号
●$ 0:当前执行的进程命
其中,$ ?用于检查上一个命令的执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错); $ $变量最常见的用途是用作临时文件的名字以保证临时文件不会重复;
(5)、参数置换的变量
shell提供了参数置换的能力以便用户可以根据不同的条件来给变量赋不同的值;参数置换的变量有四种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经设置类决定变量的取值,它们的语法和功能如下:
● 变量=${参数-word }:如果设置了参数,则用参数的值置换变量的值,否则用word置换;即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于word的值;
● 变量=${参数=word }:如果设置了参数,则用参数的值置换变量的值,否则把变量设置乘word,然后用word替换参数的值;注意:位置参数不能用于这种方式,因为在shell程序中不能为位置参数赋值;
● 变量=${参数? Word }:如果设置了参数,则用参数的值替换变量的值,否则就显示word并从shell中退出;如果省略了word,则显示标准信息;这种变量要求一定等于某一个参数的值,如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示;
● 变量=${参数+word }:如果设置了参数,则用word置换变量,否则不进行置换;