1.19k likes | 1.48k Views
第 3 章 Shell 及其编程. 计算机学院 潘 薇 panwei117@qq.com. 本章要点. 3.1 Shell 概述 3.2 Shell 脚本 3.3 Shell 脚本变量 3.4 Shell 控制结构 3.5 Shell 函数. 3.1 Shell 概述. 3.1 Shell 概述. Shell 是用户和 Linux (或者更准确的说,是用户和 Linux 内核)之间的接口程序。你在提示符下输入的每个命令都由 Shell 先解释然后传给 Linux 内核。
E N D
第3章 Shell及其编程 计算机学院 潘 薇 panwei117@qq.com
本章要点 • 3.1 Shell概述 • 3.2 Shell脚本 • 3.3 Shell脚本变量 • 3.4 Shell控制结构 • 3.5 Shell函数
3.1 Shell概述 • Shell是用户和Linux(或者更准确的说,是用户和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由Shell先解释然后传给Linux内核。 • Shell 是一个命令语言解释器,拥有自己内建的Shell命令集。此外,Shell也能被系统中其他有效的Linux 实用程序和应用程序所调用。
3.1 Shell概述 Shell具有的主要功能有: • 命令解释功能:将用户可读的命令转换成计算机可理解的命令,并控制命令执行。 • 输入/输出重定向:操作系统将键盘作为标准输入、显示器作为标准输出。当这些定向不能满足用户需求时,用户可以在命令中用符号“>”或“<”重新定向。 • 管道处理:利用管道将一个命令的输出送入另一个命令,实现多个命令组合完成复杂命令的功能。 • 系统环境设置:用Shell命令设置环境变量,维护用户的工作环境。 • 程序设计语言:Shell命令本身可以作为程序设计语言,将多个Shell命令组合起来,编写能实现系统或用户所需功能的程序。
3.1 Shell概述 • Linux操作系统主要提供的几种Shell: • Bourne Shell • C Shell • Korn Shell • bash (Bourne Again Shell) • tcsh • zsh • bash是大部分Linux操作系统使用的默认Shell
3.1.1 Bourne Shell • Bourne Shell由Steve Bourne在贝尔实验室开发,是大多数UNIX操作系统默认的Shell,系统提示符为“$”,简称为B-Shell。 • 如果在用户管理文件/etc/passwd中将用户的Shell设置成sh,用户的默认Shell就是B-Shell,即用户登录进入的是B-Shell。 • 如果用户在C-Shell、K-Shell环境下输入命令sh也可以切换到B-Shell。从Shell退出则键入“exit”。
3.1.2 C Shell • C Shell由Bill Joy在Berkeley开发,因C Shell在程序语言结构上和C相似,故称为C Shell(或C-Shell),系统提示符为“%”。 • 如果在用户管理文件/etc/passwd中将用户的Shell设置成csh,用户的默认Shell就是C-Shell。在其他Shell环境下通过输入命令csh可以切换到C-Shell。 • 与其他Shell比较,C-Shell更适合交互式环境。C-Shell最突出的特征是有历史(history)命令。历史命令用于存储最近使用的命令。用户可以定义存储历史命令的数量、显示历史命令、编辑并重新使用编辑后的命令。
3.1.2 C Shell • 例 设置C Shell的history。 %set history=5 %cd %pwd /home/zhouxx %cd zhouxx %history 21 set history=5 22 cd 23 pwd 24 cd zhouxx %
3.1.2 C Shell • 输入! !则重复前一条命令: %!! history 21 set history=5 22 cd 23 pwd 24 cd zhouxx % • 输入!$ 则重复指定的命令。 %!23 pwd /home/zhouxx %
3.1.2 C Shell • 另外,C Shell还有一个特别的用途,就是可以将新的Shell命令归到默认Shell路径下。方法是只需在使用新命令之前先用命令:rehash。 • 例 现有新编Shell命令netsend。 %netsend netsend:Commans not found %rehash %netsend %
3.1.3 Korn Shell • Korn Shell(简称K-Shell)由贝尔实验室的David Korn开发。 • Korn Shell和Bourne Shell有许多兼容的地方,如系统提示符也是$,环境变量的设置格式完全相同。 • 不同的是Korn Shell有些内置功能可以从Shell直接定义。与C Shell相比,Korn Shell除了有历史命令之外,还有更好的命令编辑形式。 • 与C-Shell一样,K-Shell也有历史文件。
3种shell的比较 • Bourne Shell是大多数UNIX操作系统默认的Shell,系统提示符为“$”,简称为B-Shell。 • C Shell在程序语言结构上和C相似,故称为C Shell(或C-Shell),系统提示符为“%”,拥有命令历史、别名和作业控制等功能。 • Korn Shell(简称K-Shell)和Bourne Shell有许多兼容的地方,如系统提示符也是%,不同的只是Korn Shell有些内置功能可以从Shell直接定义。与C Shell相比,Korn Shell除了有历史命令之外,还有更好的命令编辑形式。
Linux默认的shell——Bash • Bash的主要优点: • 命令记忆功能history:用上下键就可以找到上一个和下一个输入的命令,默认可以记录1000个历史命令。 • 命令与文件名补全tab键:按一次可以补全命令或者文件名,按两次可查看满足条件的命令或者文件有几个。 • 命令别名设置alias:为常使用但又较长的命令设置较短的别名。可使用alias查看当前设置的别名。 • 通配符——*、?、[]、[-]、[^]
Bash的变量功能 • shell的变量,简答来说就是用一个特定的字符串来代表具有特定含义但是取值可变的内容。 • 影响shell环境操作的变量我们称之为环境变量。一般采用大写来表示环境变量。如:PATH、HOME等等。 • 也可以由用户自定义变量来保存一些信息,一般采用小写,变量不能以数字作为首字母。 • 想要显示单个变量可以使用echo命令,例: echo $PATH echo ${myname} • 其中,$表示取后面变量的值。
Bash的变量功能 • 变量取值的修改使用=,例: myname=lili • 如果想给变量增加内容,可以以如下方式实现: PATH=${PATH}:/home/abc • 若希望自定义的变量可以在新开的shell内执行,那么可以使用export把变量设置成环境变量。 export myname • 取消变量的命令是unset,例: unset myname
Bash的变量功能 • 查看当前shell的所有环境变量可以使用env命令。 • 查看当前shell的所有环境变量和自定义变量使用set命令。
3.2 Shell脚本 • Shell具有程序设计功能,如果在使用系统时需要用重复、复杂的命令完成某项工作,就可以利用Shell编程实现。 • 同一般的结构化程序不同,Shell程序是按行解释,不需要编译成目标程序,也不需要连接成可执行的目标码,只要Shell脚本是可执行程序就可以直接运行。 • 由Shell命令构成并由Shell执行的命令文件称为Shell脚本(Shell Script)。从广义上看,任何从键盘上键入的Shell命令都是Shell脚本。
3.2 Shell脚本 • 一般Shell脚本由编辑器vi创建。 • 为了使脚本便于理解,以#为注释符,#之后直到行末的字符串为注释。 • #!是说明 hello 这个文件的类型的,Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型 • 脚本中忽略Tab键和空格,内容过长超过一行时用反斜线\表示换行继续。 • 脚本文件属性必须是可执行的才可以运行,否则要通过命令chmod将脚本文件属性设置为可执行。
3.2 Shell脚本 • 例 shell脚本jobbegin及其运行。 $cat jobbegin #!/bin/bash # My job begin every day date cd /liuxim/project echo ‘my working directory is:’ pwd # script end $ 将该脚本文件属性设置为可执行后,就可以运行了。
3.2 Shell脚本 • 执行Shell脚本有三种方式: • 方式1:直接键入Shell脚本文件名,这种运行方式表示启动新的Shell执行该脚本。 • 方式2:sh Shell脚本文件名,这种运行方式表示启动新的Shell执行该脚本。 • 方式3:. Shell脚本文件名,这种运行方式表示在原Shell下执行该脚本。 • 注意 有时运行脚本文件时系统不能辨识当前路径,用户只有输入文件的全路径名或用./文件名的方式告诉Shell到当前目录下寻找文件名。
3.2 Shell脚本 • 用命令pwd确定当前的工作目录: $pwd /home/liuxim $ • 直接输入脚本名运行脚本文件: $jobbegin Fri Mar 28 17:09:31 TAIST 2003 my working directory is: /home/liuxim/project $
3.2 Shell脚本 • 运行完后再用pwd确认当前工作目录: $pwd /home/liuxim $ • 从脚本执行可见,脚本运行前的当前目录为/home/liuxim,脚本运行完后的当前目录仍然是/home/liuxim。而脚本中的内容却要求进入目录/home/liuxim/project,原因是脚本执行启动了一个新Shell进程,脚本执行完则立即结束该新Shell进程,又回到原来的主Shell,所以最后的pwd命令得到的仍然是原工作目录。
3.2 Shell脚本 • 用方式2运行:键入 sh脚本文件名。 $sh jobbegin Fri Mar 28 17:09:31 TAIST 2003 my working directory is: /home/liuxim/project $ $pwd /home/liuxim $ • 结果和方式1相同。
3.2 Shell脚本 • 用方式3运行:键入. 脚本文件名。 $. jobbegin Fri Mar 28 17:09:31 TAIST 2003 my working directory is: /home/liuxim/project $ $pwd /home/liuxim/project $ • 脚本执行结果与最后用pwd命令结果所显示的目录均是/home/liuxim/project。 • 之所以这样是因为脚本执行没有启动新Shell进程,整个都在原来的Shell下,shell进程只有一个,随脚本进入了目录/home/liuxim/project。
3.3 Shell脚本变量 • 同其他程序设计语言一样,在Shell脚本中也可以使用变量。 • 通常将Shell变量分为环境变量和临时变量。 • 临时变量的值随着Shell程序的结束会自然消失。 • 临时变量又可分为系统特殊变量和用户自定义变量。
3.3.1 环境变量 • 变量值保持不变,不随Shell程序的结束而消失的变量称为环境变量。 • 环境变量决定了用户的工作环境。环境变量在系统配置文件中设置,用大写字母表示。 • 常用的环境变量有PATH、TERM、HOME、PS1、PS2、LOGNAME。
3.3.1 环境变量 • PATH变量:用来设定指令搜索路径。当用户键入命令时,Shell会在PATH变量所设定的路径下从左至右寻找。PATH内含有一串Shell所要查找的路径名称,用冒号隔开。 • 例 $echo $PATH /usr/bin: /bin: /usr/ucb: /etc: $
3.3.1 环境变量 • TERM变量:用来设置用户使用的终端类型(系统主控台console不用设定)。如果用户通过网络登录到LINIX系统,则应将TERM值设置成与系统相应终端类型一致。 • 例 在Windows中用telnet登录到LINIX时需将终端配置成vt100。 #TERM=vt100 #export TERM #echo $TERM vt100 #
3.3.1 环境变量 • HOME变量:用来设定用户的默认目录(即用户根目录或家目录)。用户登录系统时默认进入该目录。 • 例 $echo $HOME /home/liuxim $
3.3.1 环境变量 • PS1变量:设置系统提示符,默认为#(超级用户)、$(B-shell和K-Shell)、%(C-Shell)。 • 例 $echo $PS1 $ $PS1=/home/liuxim; export PS1 /home/liuxim
3.3.1 环境变量 • PS1中可以设置一些特殊符号来定制内容。 • \d:显示“星期几月日”, 如“Mon Feb 2” • \h:主机名 • \t:显示时间“HH:MM:SS” • \u:目前用户的帐号 • \W:当前目录 • \w:当前目录的绝对路径 • \$:提示符,root为#,其他用户为$ • \#:执行的第几个命令
3.3.1 环境变量 • PS2变量:设置系统的次提示符,默认为“>”。部分Linux系统不支持该变量。 • 例 $bc >112 + 34 >146 >(345-11)*2 >668 >Ctrl-d $
3.3.1 环境变量 • 用命令env可以显示目前所有的环境变量。 $env _=/usr/bin/env LANG=en_US LOGIN=liuxim PATH=/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin …… USER=liuxim SHELL=/usr/bin/ksh HOME=/home/liuxim TERM=vt100 PWD=/home/liuxim $
3.3.2 特殊变量 • Shell定义了如下几个特殊变量用于执行Shell命令时存放命令及命令参数: • $0,$1,$2,$3,$4,$5,$6,$7,$8,$9 • 其中:$0存放命令名,$1、$2、$3、$4、$5、$6、$7、$8、$9从左至右分别存放命令参数。 • 命令shift用于移动位置参数,将$2中的内容移至$1,$3中的内容移至$2,$4中的内容移至$3,依次类推,但位置参数$0不参加移位。 • shift命令格式为:shift [n] • n表示向左移动参数的个数,默认值为1。
3.3.2 特殊变量 • 例:应用位置参数及shift命令。 $cat movelab1 ## this program show shift echo $0 echo $1,$2,$3,$4,$5,$6,$7,$8,$9;shift echo $1,$2,$3,$4,$5,$6,$7,$8,$9;shift echo $1,$2,$3,$4,$5,$6,$7,$8,$9;shift echo $1,$2,$3,$4,$5,$6,$7,$8,$9;shift echo $1,$2,$3,$4,$5,$6,$7,$8,$9;shift echo $1,$2,$3,$4,$5,$6,$7,$8,$9;shift echo $1,$2,$3,$4,$5,$6,$7,$8,$9;shift echo $1,$2,$3,$4,$5,$6,$7,$8,$9;shift echo $1,$2,$3,$4,$5,$6,$7,$8,$9
3.3.2 特殊变量 $movelab1 11 22 33 44 55 66 77 88 99 movelab1 11,22,33,44,55,66,77,88,99 22,33,44,55,66,77,88,99, 33,44,55,66,77,88,99,, 44,55,66,77,88,99,,, 55,66,77,88,99,,,, 66,77,88,99,,,,, 77,88,99,,,,,, 88,99,,,,,,, 99,,,,,,,, $
3.3.2 特殊变量 • 下面是一些与位置参数有关的特殊变量: • $#:能提供给脚本的位置参数个数。 • $$:当前Shell脚本的进程号。 • $!:上一个后台命令的进程号。 • $?:执行最后一条命令的退出状态。 • $*:位置参数字符串,所有位置参数字符串组成一个大的字符串。 • $@:位置参数字符串,每个位置参数字符串都是一个单独的字符串。
3.3.2 特殊变量 • 例 $cat exer echo $1,$2,$3,$4,$5,$6,$7,$8,$9 echo ‘$#=’$# echo ‘$$=’$$ echo ‘$!=’$! echo ‘$?=’$? echo ‘$*=’$* echo ‘$@=’$@
3.3.2 特殊变量 $exer 1 2 3 4 5 6 7 8 9 a bc 1,2,3,4,5,6,7,8,9 $#=11 $$=24056 $!=14361 $?=0 $*=1 2 3 4 5 6 7 8 9 a bc $@=1 2 3 4 5 6 7 8 9 a bc $
3.3.3 用户自定义变量 • 用户自定义变量是用户根据自己的需要在Shell中定义的临时变量。 • 用户定义变量除数字之外还可以是字母、下划线和其他文字,长度不限。用户定义变量要区分大小写。 • 用户自定义变量格式为: variable-name=value • 在定义等式中等号两端不允许有空格,执行时将右端的计算结果指定给左端。如果用户变量值中有空格,必须用引号将变量值括起来。 • 用户变量的使用与环境变量一样,要在变量名前加符号“$”,表示要使用该变量的值。用户定义变量非常灵活,需要改变时可以随时重新定义。
3.3.3 用户自定义变量 • 清除变量:如果所设置的变量不需要时可以清除。 • 格式为:unset variable-name • 例 先定义exer的值为/home/liuxim/exer,然后清除exer。 $exer=/home/liuxim/exer $echo $exer /home/liuxim/exer $unset exer $echo $exer $
3.3.3 用户自定义变量 • 可以将字符与变量、变量与变量组合在一起使用。 • 组合格式分别为char$variable,$var1$var2。 • 例: $d=day $echo “Sun$d, Mon$d, Tues$d, Wednes$d, Thurs$d, Fri$d, Satur$d” Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday $h=/home $me=/liuxim/exer $echo $h$me /home/liuxim/exer $
3.3.3 用户自定义变量 • 使用变量时如果不能确定该变量是否已经定义,可以用变量测试语句: {variable-name: -new-value} • 表示如果没有定义则用新值(new-value)定义;如果已经定义则维持原定义。
3.3.3 用户自定义变量 • 例 首先设置state的值为order,然后再引用。 $state=order $echo “Everything was in a state of ${state:-disorder}” Everything was in a state of order $unset state $echo “Everything was in a state of ${state:-disorder}” Everything was in a state of disorder $
3.3.3 用户自定义变量 • 命令替换是将一个Shell命令的输出作为另一个命令的参数,还可以赋予变量。为了区别一般字符串,用倒单引号括起命令。 • 例 $echo “Now my work directory is ˋpwdˊ” Now my work directory is /home/liuxim $time=ˋdateˊ $echo $time Sun Mar 30 09:39:28 TAIST 2003
3.3.3 用户自定义变量 • 双引号内的内容如果包含$和单引号则保留Shell中的定义,包含倒单引号则作命令替换 • 单引号内的内容完全为普通字符串,不作命令替换 • 倒单引号内的内容只能是命令 • 例: $echo ˋpwdˊ /home/liuxim/project $echo ‘ˋpwdˊ’ ˋpwdˊ $echo “ˋpwdˊ” /home/liuxim/project