Shell 简明讲义.doc

上传人:da****u 文档编号:1181636 上传时间:2018-12-17 格式:DOC 页数:23 大小:117.50KB
下载 相关 举报
Shell 简明讲义.doc_第1页
第1页 / 共23页
Shell 简明讲义.doc_第2页
第2页 / 共23页
Shell 简明讲义.doc_第3页
第3页 / 共23页
Shell 简明讲义.doc_第4页
第4页 / 共23页
Shell 简明讲义.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、 Shell 简明讲义一、Shell 基础Shell 是什么呢?确切一点说,Shell 就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向 Linux 发送请求以便运行程序的接口系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。Shell 本身是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。作为命令语言,它互动式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。它虽然不是 Li

2、nux 系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。因此,对于用户来说,Shell 是最重要的实用程序,深入了解和熟练掌握 Shell 的特性极其使用方法,是用好 Linux 系统的关键。可以说,Shell 使用的熟练程度反映了用户对 Linux 使用的熟练程度。Linux 中的 shell 有多种类型,其中最常用的几种是 Bourne shell(sh) 、C shell(csh)和 Korn shell(ksh) 。三种 shell 各有优缺点。Bourne shell 是 UNIX 最初使用的 shell,并且在每种 UNIX 上

3、都可以使用。Bourne shell 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种 shell。Linux 操作系统缺省的 shell 是 Bourne Again shell,它是 Bourne shell 的扩展,简称 Bash,与 Bourne shell 完全向后兼容,并且在 Bourne shell 的基础上增加、增强了很多特性。Bash 放在/bin/bash 中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多 C shell和 Korn shell 中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。shell

4、提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应) ,或者以 shell script(非交互)方式执行。shell script 是放在文件中的一串 shell 和操作系统命令,它们可以被 重复使用。本质上,shell script 是命令行命令简单的组合到一个文件里面。 Linux 提供了像 Microsoft Windows 那样的可视的命令输入界面-X Window 的图形用户界面(GUI ) 。它提供了很多窗口管理器,其操作就象 Windows 一样,有窗口、图标和菜单,所有的管理都是通过鼠标控制。现在比较流行的窗口管理器是 KDE 和 GN

5、OME。每个 Linux 系统的用户可以拥有他自己的用户界面或 Shell,用以满足他们自己专门的 Shell 需要。同 Linux 本身一样,Shell 也有多种不同的版本。目前主要有下列版本的 Shell: Bourne Shell:是贝尔实验室开发的。BASH :是 GNU 的 Bourne Again Shell,是 GNU 操作系统上默认的 shell。Korn Shell:是对 Bourne SHell 的发展,在大部分内容上与 Bourne Shell 兼容。 C Shell:是 SUN 公司 Shell 的 BSD 版本。如同其他语言一样,通过我们使用任意一种文字编辑器,比如n

6、edit、kedit、emacs 、vi .二、程序基础:1.程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序。要使脚本可执行: chmod +x filename 然后,您可以通过输入: ./filename 来执行您的脚本。注释 在进行 shell 编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。变量 在其他编程语言中您必须使用变量。在 shell 编程中,所有的变量都由字符串组成

7、,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:变量名=值取出变量值可以加一个美元符号($)在变量前面2.HelloWorld#!/bin/sh #对变量赋值:a=“hello world“ # 现在打印变量 a 的内容:echo “A is:“ echo $a在编辑器中输入以上内容,然后将其保存为一个文件 HelloWorld。之后执行chmod +x HelloWorld使其可执行,最后输入./ HelloWorld 执行该脚本。这个脚本将会输出: A is: hello world有时候变量名很容易与其他文字混淆,比如: num=2 echo “this is the $n

8、umnd“ 这并不会打印出“this is the 2nd“,而仅仅打印“this is the “,因为 shell 会去搜索变量 numnd 的值,但是这个变量时没有值的。可以使用花括号来告诉 shell 我们要打印的是 num 变量: num=2 echo “this is the $numnd“ 这将打印: this is the 2nd几个需要记住的特殊参数:$0 = shell 名称或 shel 脚本名称$1 = 第一个(1)shell 参数. $9 = 第九个(9)shell 参数 $# = 位置参数的个数3.Shell 命令和流程控制在 shell 脚本中可以使用三类命令: 1

9、)Linux 命令: 虽然在 shell 脚本中可以使用任意的 Linux 命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。 常用命令语法及功能 echo “some text“: 将文字内容打印在屏幕上 echo 除了 -n options 之外,常用選項還有:-e :啟用反斜線控制字符的轉換( 參考下表)-E:關閉反斜線控制字符的轉換(預設如此)-n :取消行末之換行符號 (與 -e 選項下的 c 字符同意)echo 命令所支援的反斜線控制字符如下表:a:ALERT / BELL ( 從系統喇叭送出鈴聲)b:BACKSPACE ,也就是向左刪除鍵c:取消行末之

10、換行符號E:ESCAPE ,跳脫鍵f:FORMFEED,換頁字符n:NEWLINE,換行字符r:RETURN,回車鍵t:TAB,表格跳位鍵v:VERTICAL TAB,垂直表格跳位鍵n:ASCII 八進位編碼(以 x 開首為十六進位):反斜線本身ls: 文件列表 wc l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数 cp sourcefile destfile: 文件拷贝 mv oldname newname : 重命名文件或移动文件 rm file: 删除文件 grep pattern file: 在文件内搜索字符串比如: grep

11、searchstring file.txt cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第 5 个到第 9 个字符 cut -b5-9 file.txt 千万不要和 cat 命令混淆,这是两个完全不同的命令 cat file.txt: 输出文件内容到标准输出设备(屏幕)上 file somefile: 得到文件类型 read var: 提示用户输入,并将输入赋值给变量 sort file.txt: 对 file.txt 文件中的行进行排序 uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq expr

12、: 进行数学运算 Example: add 2 and 3expr 2 “+“ 3 find: 搜索文件比如:根据文件名搜索 find . -name filename -print tee: 将数据输出到标准输出设备(屏幕) 和文件比如: somecommand | tee outfile basename file: 返回不包含路径的文件名比如: basename /bin/tux 将返回 tux dirname file: 返回文件所在路径比如:dirname /bin/tux 将返回 /bin head file: 打印文本文件开头几行 tail file : 打印文本文件末尾几行 s

13、ed: Sed 是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕) 。该命令采用正则表达式(见参考)进行搜索。 不要和 shell 中的通配符相混淆。比如:将 linuxfocus 替换为 LinuxFocus : cat text.file | sed s/linuxfocus/LinuxFocus/ newtext.file awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F 指定其他分割符。cat file.txt | awk -F, print $1 “,“ $3 这里我们使用,作为字段分割符,同时打印第一个

14、和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA 命令输出结果为: Adam Bor, IndiaKerry Miller, USA 2) 概念: 管道, 重定向和 backtick 这些不是系统命令,但是他们真的很重要。 管道 (|) 将一个命令的输出作为另外一个命令的输入。 grep “hello“ file.txt | wc -l 在 file.txt 中搜索包含有” hello”的行并计算其行数。 在这里 grep 命令的输出作为 wc 命令的输入。当然您可以使用多个命令。 重定向:将命令的结果输出到文件,而不是标准输

15、出(屏幕) 。 写入文件并覆盖旧文件 加到文件的尾部,保留旧文件内容。 反短斜线 使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。 命令: find . -mtime -1 -type f -print 用来查找过去 24 小时(-mtime 2 则表示过去 48 小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本: #!/bin/sh # The ticks are backticks () not normal quotes (): tar -zcvf lastmod.tar.gz find . -mtime -1 -type f -print

16、把 find . -mtime -1 -type f print 找到的结果 压缩到 lastmod.tar.gz 中3) 流程控制 “if“ 表达式 如果条件为真则执行 then 后面的部分: if .; then . elif .; then . else . fi 大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等 通常用“ “来表示条件测试。注意这里的空格很重要。要确保方括号的空格。 -f “somefile“ :判断是否是一个文件 -x “/bin/ls“ :判断/bin/ls 是否存在并有可执行权限 -n “$var“ :判断$var

17、 变量是否有值 “$a“ = “$b“ :判断$a 和$b 是否相等 例子直接执行以下脚本: #!/bin/sh if “$SHELL“ = “/bin/bash“ ; then echo “your login shell is the bash (bourne again shell)“ else echo “your login shell is not bash but $SHELL“ fi 变量$SHELL 包含了登录 shell 的名称,我们和/bin/bash 进行了比较。快捷操作符 熟悉 C 语言的朋友可能会很喜欢下面的表达式: -f “/etc/shadow“ ; Esac让

18、我们看一个例子。 file 命令可以辨别出一个给定文件的文件类型,比如: file lf.gz 这将返回: lf.gz: gzip compressed data, deflated, original filename, last modified: Mon Aug 27 23:09:18 2001, os: Unix我们利用这一点写了一个叫做 smartzip 的脚本,该脚本可以自动解压bzip2, gzip 和 zip 类型的压缩文件: #!/bin/sh ftype=file “$1“ case “$ftype“ in “$1: Zip archive“*) unzip “$1“ ;

19、“$1: gzip compressed“*) gunzip “$1“ ; “$1: bzip2 compressed“*) bunzip2 “$1“ ; *) error “File $1 can not be uncompressed with smartzip“; esac 您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。也就是说,当我们运行: smartzip articles.zip $1 就是字符串 articles.zipselect 表达式是一种 bash 的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。 select

20、 var in . ; do break done . now $var can be used . 下面是一个例子: #!/bin/sh echo “What is your favourite OS?“ select var in “Linux“ “Gnu Hurd“ “Free BSD“ “Other“; do break done echo “You have selected $var“ 下面是该脚本运行的结果: What is your favourite OS? 1) Linux 2) Gnu Hurd 3) Free BSD 4) Other #? 1 You have sel

21、ected Linux 您也可以在 shell 中使用如下的 loop 表达式: while .; do . done while-loop 将运行直到表达式测试为真。will run while the expression that we test for is true. 关键字“break“ 用来跳出循环。而关键字continue”用来不执行余下的部分而直接跳到下一个循环。 for-loop 表达式查看一个字符串列表 (字符串用空格分隔 ) 然后将其赋给一个变量: for var in .; do . done 在下面的例子中,将分别打印 ABC 到屏幕上: #!/bin/sh for

22、 var in A B C ; do echo “var is $var“ done# cyzShell.sh#!/bin/sh#“List the file with *.txt and print them into the file I want“if $# != 2 ; thenecho Please use the commander: echo sh *.sh DirectoryName SavefileNameecho DirectoryName is 0 means local.exitfiecho echo This is the *.txt file I finded in

23、 the directry echo -e “03340;34;1m The TXT files: 0330m“echo if $1 = 0 ; thenls *.txtfiif $1 != 0 ; thenls $1/*.txtfiecho echo The result is saved in the file $2echo echo Thank you!echo if $1 != 0 ; thenls $1/*.txt $2fiif $1 = 0 ; thenls *.txt $2fi(以下的例子有些难度,请自行选择)三、补充内容下面是一个更为有用的脚本 showrpm,其功能是打印一些

24、 RPM 包的统计信息: #!/bin/sh # list a content summary of a number of RPM packages # USAGE: showrpm rpmfile1 rpmfile2 . # EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm for rpmpackage in $*; do if -r “$rpmpackage“ ;then echo “= $rpmpackage =“ rpm -qi -p $rpmpackage else echo “ERROR: cannot read file $rpmpackage

25、“ fi done 这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。如果您运行 showrpm openssh.rpm w3m.rpm webgrep.rpm 此时 $* 包含了 3 个字符串,即 openssh.rpm, w3m.rpm and webgrep.rpm. 引号 在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量 值。为了防 止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个 jpg 文件, mail.jpg 和 tux.jpg。 #!/bin/sh echo *.jpg 这将打印出“mail.jpg tux.jpg“的结果。 引号 (单引号和双引号) 将防止这种通配符扩展: #!/bin/sh echo “*.jpg“ echo *.jpg 这将打印“*.jpg“ 两次。 单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。 #!/bin/sh echo $SHELL echo “$SHELL“ echo $SHELL 运行结果为: /bin/bash /bin/bash $SHELL 最后,还有一种防止这种扩展的方法,那就是使用转义字符反斜杆: echo *.jpg echo $SHELL

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 课件讲义

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。