shell的预备知识

Linux下的Shell编程

(1)什么是 Shell

当一个用户登录 Linux 系统之后,系统初始化程序 init 就为每一个用户运行一个称为shell 的程序。它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 shell 来启动、挂起、停止甚至是编写一些程序。确切一点说,shell 就是一个命令行解释器,运行在用户态下。

(2)几种流行的 Shell

目前流行的 Shell 有 ash、bash、ksh、csh、zsh 等,用户可以用下面的命令来查看自己的 shell 类型。

$ echo $SHELL 

$ shell-name来转换到别的 shell,这里 shell-name 是你想要尝试使用的 shell 的名称,如输入$ ash 等。这个命令为用户又启动了一个 shell,这个 shell 在最初登录的那个 shell 之后,称为下级的 shell或子 shell。使用命令:$ exit 可以退出这个子 shell。

1)ash

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

 2)bash

bash 是 Linux 系统默认使用的 shell,内部命令一共有 40 个。Linux 使用它作为默认的 shell 是因为它有诸如以下的特色:
(1)可以使用类似 DOS 下面的 doskey 的功能,用方向键查阅和快速输入并修
改命令。
(2)自动通过查找匹配的方式给出以某字符串开头的命令。
(3)包含了自身的帮助功能,只要在提示符下面键入 help 就可以得到相关的帮助。

3)ksh 

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

4)csh

csh 是 Linux 比较大的 shell,它由以 William Joy 为代表的共计 47 位作者编成,共有 52个内部命令。该 shell 其实是指向/bin/tcsh 这样的一个 shell,也就是说,csh 其实就是 tcsh。

5)zch

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

Shell 功能与变量参数

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

(1)shell 基本功能

shell 的基本功能主要就是如何输入命令运行程序以及如何在程序之间通过 shell 的一些参数提供便利手段来进行通讯。

1. 输入输出重定向
在Linux中,每一个进程都有三个特殊的文件描述指针:标准输入(文件指针描述为0),标准输出(文件指针为1),标准错误输出(文件描述指针为2)。在三个特殊的文件描述指针使进程在一般情况下接受标准输入终端的输入,同时由标准终端输出,Linux 同时也向使用者提供可以使用普通的文件或管道

来取代这些标准输入输出设备。在 shell 中,使用者可以利用>和<来进行输入输出重定向。 如:

$ command>file:将命令的输出结果重定向到一个文件。
$ command>&file:将命令的标准错误输出一起重定向到一个文件。
$ command>>file:将标准输出的结果追加到文件中。
$ command>>&file:将标准输出和标准错误输出的结构都追加到文件中。
2. shell管道

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

command1| command2 [| command3...]

也可以连同标准错误输出一起送入管道:

command1| &command2 [|& command3...] 
3. 前台和后台

shell 下面,一个新产生的进程可以通过用命令后面的符号;和&来分别以前台和后台的方式来执行,语法如下:

$ command ; 产生一个前台的进程,下一个命令须等该命令运行结束后才能输入。
$ command & 产生一个后台的进程,此进程在后台运行的同时,可以输入其他的命令。

(2)shell 程序的变量和参数

对 shell 来讲,所有变量的取值都是一个字符串,shell 程序采用$var 的形式来引用名为var 的变量的值。
Shell 有以下几种基本类型的变量:

1)shell 定义的环境变量

shell 在开始执行时就已经定义了一些和系统的工作环境有关的变量,这些变量用户还可以重新定义,常用的 shell 环境变量有:

HOME:用于保存注册目录的完全路径名。
PATH:用于保存用冒号分隔的目录路径名,shell 将按 PATH 变量中给出的顺序搜索这
些目录,找到的第一个与命令名称一致的可执行文件将被执行。
TERM:终端的类型。
UID:当前用户的标识符,取值是由数字构成的字符串。
PWD:当前工作目录的绝对路径名,该变量的取值随 cd 命令的使用而变化。
PS1:主提示符,在特权用户下,缺省的主提示符是#,在普通用户下,缺省的主提示
符是$。
PS2:在 shell 接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后回车,或者当用户按回车键时 shell 判断出用户输入的命令没有结束时,显示这个辅助提示符,提示用户继续输入命令的其余部分,缺省的辅助提示符是>
2)用户定义的变量

用户可以按照下面的语法规则定义自己的变量:

变量名=变量值

要注意的一点是,在定义变量时,变量名前不应加符号 $***,在***引用变量的内容时则应在变量名前加 $***;在给***变量赋值时,等号两边一定不能留空格,若变量中本身就包含了空格,则整个字符串都要用双引号括起来
在编写 shell 程序时,为了使变量名和命令名相区别,建议所有的变量名都用大写字母来表示
在任何时候,建立的变量都只是当前 shell 的局部变量,所以不能被 shell 运行的其他命令或 shell 程序所利用,export 命令可以将一局部变量提供给 shell 执行的其他命令使用,其格式为:

export 变量名

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

export 变量名=变量值

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

3)位置参数

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

4)内部命令

bash 命令解释程序包含了一些内部命令。内部命令在目录列表时是看不见的,它们由shell 本身提供。常用的内部命令有:echo、eval、exec、export、readonly、read、shift、wait和点(.)。

echo 

命令格式:echo arg
功能:echo 语句在屏幕上打印出由 arg 指定的字符串。

eval 

命令格式:eval args
功能:当 shell 程序执行到 eval 语句时,shell 读入参数 args,并将它们组合成一个新的命令,然后执行。

exec 

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

export 

命令格式:export 变量名 或:export 变量名=变量值
功能:shell 可以用 export 把它的变量向下带入子 shell 从而让子进程继承父进程中的环境变量。但子 shell 不能用 export 把它的变量向上带入父 shell。
注意:不带任何变量名的 export 语句将显示出当前所有的 export 变量。

readonly 

命令格式:readonly 变量名
功能:将一个用户定义的 shell 变量标识为不可变的。不带任何参数的readonly 命令将显示出所有只读的 shell 变量。

read 

命令格式:read 变量名表
功能:从标准输入设备读入一行,分解成若干字,赋值给 shell 程序内部定义的变量。

shift 语句

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

wait 

功能:是 shell 等待在后台启动的所有子进程结束。wait 的返回值总是真。

exit 

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

 ⑩ “.”() 

命令格式:. Shell 程序文件名
功能:使 shell 读入指定的 shell 程序文件并依次执行文件中的所有语句

5)预定义变量

所有预定义变量都是由$符和另一个符号组成的,常用的 shell 预定义变量有:

$#:位置参数的数量
$*:所有位置参数的内容
$?:命令执行后返回的状态
$ $:当前进程的进程号
$!:后台运行的最后一个进程号
$0:当前执行的进程名
其中, 

$ ?用于检查上一个命令执行是否正确(在 Linux 中,命令退出状态为 0 表示该命令正确执行,任何非 0 值表示命令出错)。 $ $变量最常见的用途是用作临时文件的名字以保证临时文件不会重复

6)参数置换的变量
Shell 提供了参数置换能力以便用户可以根据不同的条件来给变量赋不同的值。参数置换的变量有四种,这些变量通常与某一个位置参数相联系,根据指定的位置参数是否已经设置来决定变量的取值,它们的语法和功能分别如下。

① 变量= $ {参数-word}:如果设置了参数,则用参数的值置换变量的值,否则用 word置换。即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于 word 的 值。
② 变量= $ {参数=word}:如果设置了参数,则用参数的值置换变量的值,否则把变量设置成 word 然后再用 word 替换参数的值。注意,位置参数不能用于这种方式,因为在 shell程序中不能为位置参数赋值。 
③ 变量=$ {参数?word}:如果设置了参数,则用参数的值置换变量的值,否则就显示word 并从 shell 中退出,如果省略了 word,则显示标准信息。这种变量要求一定等于某一个参数的值,如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用出错指示。
④ 变量=${参数+word}:如果设置了参数,则用 word 置换变量,否则不进行置换。
所有

这四种形式中的“参数”既可以是位置参数,也可以是另一个变量,只是用位置参数
的情况比较多。

3.1.3 Shell 程序的流程控制
shell 用于指定条件值的不是布尔表达式而是命令和字符串
1.测试语句
test 测试可以进行数值、字符和文件三个方面的测试,其测试符和相应的功能分别如下:
(1)整数测试

[ n1 -eq n2 ]表示若 n1 等于 n2,则测试条件为真。
[ n1 -ne n2 ]表示若 n1 不等于 n2,则测试条件为真。
[ n1 –gt n2 ]表示若 n1 大于 n2,则测试条件为真。
[ n1 –ge n2 ]表示若 n1 大于等于 n2,则测试条件为真。
[ n1 –lt n2 ]表示若 n1 小于 n2,则测试条件为真。
[ n1 –le n2 ]表示若 n1 小于等于 n2,则测试条件为真。 
(2)

字符串测试

[ -z s1 ]表示若字符串 s1 长度为 0,则测试条件为真。
[ -n s1 ]表示若字符串 s1 长度>0,则测试条件为真。
[ s1 ]表示若字符串 s1 不为空,则测试条件为真。
[ s1=s2 ]表示若两个字符串相等,则测试条件为真。
[ s1!=s2 ]表示若两个字符串不相等,则测试条件为真。
[ s1<s2 ]表示若按字典顺序 s1 在 s2 之前,则测试条件为真。 

(3)文件测试

[ -e file ]表示若文件存在,则测试条件为真。
[ -r file ]表示若文件存在且为用户可读,则测试条件为真。
[ -w file ]表示若文件存在且为用户可写,则测试条件为真。
[ -x file ]表示若文件存在且为用户可执行,则测试条件为真。
[ -b file ]表示若文件存在且为块设备,则测试条件为真。
[ -c file ]表示若文件存在且为字符设备,则测试条件为真。
[ -d file ]表示若文件存在且为目录文件,则测试条件为真。
[ -f file ]表示若文件存在且为普通文件,则测试条件为真。
[ -p file ]表示若文件存在且为 FIFO 文件,则测试条件为真。
[ -s file ]表示若文件存在且文件长度>0,则测试条件为真。
[ -t file ]表示若文件描述符与终端相关,则测试条件为真。

2.条件语句
shell 程序中的条件判断是通过 if 条件语句来实现的,其一般格式为:

if 条件命令串 then 条件为真时的命令串 else 条件为假时的命令串 fi 

3.循环语句
循环语句分三种:for、while 和 until。根据测试条件执行相应命令。
for 循环的一般格式为:

for 变量名 [in 数值列表] do 若干个命令行 done 

while 和 until 命令都是用命令的返回状态值来控制循环的。while 循环的一般格式为:

while 若干个命令行 1 do 若干个命令行 2 done 

只要 while 的“若干个命令行 1”中最后一个命令的返回状态为真,while 循环就继续执行do…done 之间的“若干个命令行 2”。
until 循环的格式如下:

until 若干个命令行 1 do 若干个命令行 2 done

until 循环和 while 循环的区别在于:while 循环在条件为真时继续执行循环,而 until 则是在条件为假时继续执行循环。
Shell 还提供了 true 和 false 两条命令用于建立无限循环结构的需要,它们的返回状态分别是总为 0 或总为非 0
4.开关语句
case 条件选择为用户提供了根据字符串或变量的值从多个选项中选择一项的方法,其
格式如下:

case 字符串 in 
模式字符串 1) 
若干个命令行 1 
;;
模式字符串 2) 
若干个命令行 2 
;; 
…… 
其他命令行

esac
shell 通过计算字符串 string 的值,将其结果依次和各模式字符串匹配,直到找到一个匹配的表达式为止,如果找到了匹配项则执行它下面的命令直到遇到一对分号(;;)为止。 在 case 表达式中也可以使用 shell 的通配符(“”、“?”、“[ ]”)。通常用“”作为 case 命
令的最后表达式以便使在前面找不到任何相应的匹配项时执行“其他命令行”的命令。 5.退出控制语句
break 用于立即终止当前循环的执行,而 contiune 用于不执行循环中后面的语句而立即
开始下一个循环的执行。这两个语句只有放在 do 和 done 之间才有效。39

3.1.4 Shell 程序的运行与调试

1.shell 程序的运行方法

按照 shell 编程的惯例,以 bash 为例,程序的第一行一般为“#!/bin/bash”,其中#表示该行是注释,叹号!告诉 shell 运行叹号之后的命令并用文件的其余部分作为输入,也就是运行/bin/bash 并让/bin/bash 去执行 shell 程序的内容。
执行 shell 程序的方法有三种:

(1) sh shell 程序文件名

格式为:

bash shell 程序文件名

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

(2) sh<shell 程序文件名

格式为:

bash<shell 程序文件名

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

(3) 用 chmod 命令使 shell 脚本成为可执行的

一个文件能否运行取决于该文件的内容本身可执行且该文件具有执行权。对于 shell 程
序文件 script_name,当用编辑器生成一个文件时,系统赋予的许可权限都是644(rw-r-r–),意味着该文件没有可执行权限,因此,当用户需要运行这个文件时,需要首先为该文件赋予可执行权限,输入命令:$ chmod +x script_name,之后只需要直接键入文件名即可,$ ./script_name
在这三种运行 shell 程序的方法中,最好按下面的方式选择:当刚建立一个 shell 脚本程序,对它的正确性还没有把握时,应当使用第一种方式进行调试。当一个 shell 程序已经调试好时,应使用第三种方式把它固定下来,以后只要键入相应的文件名即可,并可被另一个程序所调用。

2.bash 程序的调试

在 shell 编程过程中难免会出错,有的时候,调试程序比编写程序花费的时间还要多。shell 程序的调试主要是利用 bash 命令解释程序的选择项。调用 bash 的形式是:

bash -选择项 shell 程序文件名几个常用的选择项是: -e:如果一个命令失败就立即退出
-n:读入命令但是不执行它们
-u:置换时把未设置的变量看作出错
-v:当读入 shell 输入行时把它们显示出来
-x:执行命令时把命令和它们的参数显示出来40
上面的

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

(1)未置变量退出和立即退出

未置变量退出特性允许用户对所有变量进行检查,如果引用了一个未赋值的变量就终止 shell 程序的执行。shell 通常允许未置变量的使用,在这种情况下,变量的值为空。如果设置了未置变量退出选择项,则一旦使用了未置变量就显示错误信息,并终止程序的运行。未置变量退出选择项为-u。 当 shell 运行时,若遇到不存在或不可执行的命令、重定向失败或命令非正常结束等情
况时,如果未经重新定向,该出错信息会打印在终端屏幕上,而 shell 程序仍将继续执行。要想在错误发生时迫使 shell 程序立即结束,可以使用-e 选项将 shell 程序的执行立即终止。

(2)shell 程序的跟踪

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值