为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

Linux主要B shell与C shell命令详解

2017-09-27 44页 doc 85KB 85阅读

用户头像

is_196623

暂无简介

举报
Linux主要B shell与C shell命令详解Linux主要B shell与C shell命令详解 Linux主要shell命令详解 shell是用户和Linux操作系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性。 什么是shell Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。 shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,she...
Linux主要B shell与C shell命令详解
Linux主要B shell与C shell命令详解 Linux主要shell命令详解 shell是用户和Linux操作系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性。 什么是shell Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序语言的统称。 shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。 shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。 有一些命令,比如改变工作目录命令cd,是包含在shell内部的。还有一些命令,例如拷贝命令cp和移动命令rm,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。 shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs)。然后shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。 shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。 当普通用户成功登录,系统将执行一个称为shell的程序。正是shell进程提供了命令行提示符。作为默认值(TurboLinux系统默认的shell是BASH),对普通用户用“$”作提示符,对超级用户(root)用“#”作提示符。 一旦出现了shell提示符,就可以键入命令名称及命令所需要的参数。shell将执行这些命令。如果一条命令花费了很长的时间来运行,或者在屏幕上产生了大量的输出,可以从键盘上按ctrl+c发出中断信号来中断它(在正常结束之前,中止它的执行)。 当用户准备结束登录对话进程时,可以键入logout命令、exit命令或文件结束符(EOF)(按ctrl+d实现),结束登录。 我们来实习一下shell是如何工作的。 $ make work make:***No rule to make target „work?. Stop. $ 注释:make是系统中一个命令的名字,后面跟着命令参数。在接收到这个命令后,shell便执行它。本例中,由于输入的命令参数不正确,系统返回信息后停止该命令的执行。 在例子中,shell会寻找名为make的程序,并以work为参数执行它。make是一个经常被用来编译大程序的程序,它以参数作为目标来进行编译。在 “make work”中,make编译的目标是work。因为make找不到以work为名字的目标,它便给出错误信息表示运行失败,用户又回到系统提示符下。 另外,用户键入有关命令行后,如果shell找不到以其中的命令名为名字的程序,就会给出错误信息。例如,如果用户键入: $ myprog bash:myprog:command not found $ 可以看到,用户得到了一个没有找到该命令的错误信息。用户敲错命令后,系统一般会给出这样的错误信息。 shell的种类 Linux中的shell有多种类型,其中最常用的几种是Bourne shell(sh)、C shell(csh)和Korn shell(ksh)。三种shell各有优缺点。Bourne shell是UNIX最初使用的shell,并且在每种UNIX上都可以使用。Bourne shell在shell编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。Linux操作系统缺省的shell是Bourne Again shell,它是Bourne shell的扩展,简称Bash,与Bourne shell完全向后兼容,并且在Bourne shell的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令 补全、命令编辑和命令历史表等功能,它还包含了很多C shell和Korn shell中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。 C shell是一种比Bourne shell更适于编程的shell,它的语法与C语言很相似。 Linux为喜欢使用C shell的人提供了Tcsh。Tcsh是C shell的一个扩展版本。Tcsh包括命令行编辑、可编程单词补全、拼写校正、历史命令替换、作业控制和类似C语言的语法,它不仅和Bash shell是提示符兼容,而且还提供比Bash shell更多的提示符参数。 Korn shell集合了C shell和Bourne shell的优点并且和Bourne shell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持任务控制,可以在命令行上挂起、后台执行、唤醒或终止程序。 Linux并没有冷落其他shell用户,还包括了一些流行的shell如ash、zsh等。每个shell都有它的用途,有些shell是有专利的,有些能从Internet网上或其他来源获得。要决定使用哪个shell,只需读一下各种shell的联机帮助,并试用一下。 用户在登录到Linux时由/etc/passwd文件来决定要使用哪个shell。例如: # fgrep lisa /etc/passwd lisa:x:500:500:TurboLinux User:/home/lisa:/bin/bash shell被列每行的末尾(/bin/bash)。 由于Bash是Linux上缺省的shell,本章主要介绍Bash及其相关知识。 shell命令 命令行c 用户登录到Linux系统时,可以看到一个shell提示符,标识了命令行的开始。用户可以在提示符后面输入任何命令及参数。例如: $ date 二 11 23 01:34:58 CST 1999 $ 用户登录时,实际进入了shell,它遵循一定的语法将输入的命令加以解释并传给系统。命令行中输入的第一个字必须是一个命令的名字,第二个字是命令的选项或参数,命令行中的每个字必须由空格或TAB隔开,格式如下: $ Command Option Arguments 1. 选项和参数 选项是包括一个或多个字母的代码,它前面有一个减号(减号是必要的,Linux用它来区别选项和参数),选项可用于改变命令执行的动作的类型。例如: $ ls motd passwd $ 这是没有选项的ls命令,可列出当前目录中所有文件,只列出各个文件的名字,而不显示其他更多的信息。 $ ls -l total 2 -rw-r--r-- 2 wzh book 22 Apr 20 20:37 motd -rw-r--r-- 2 wzh book 796 Apr 20 20:37 passwd $ 加入-l选项,将会为每个文件列出一行信息,诸如数据大小和数据最后被修改的时间。 大多数命令都被设计为可以接纳参数。参数是在命令行中的选项之后键入的一个或多个单词,例如: $ ls -l text -rw-r--r-- 2 wzh book 22 Apr 20 20:37 motd -rw-r--r-- 2 wzh book 796 Apr 20 20:37 passwd $ 将显示text目录下的所有文件及其信息。 有些命令,如ls可以带参数,而有一些命令可能需要一些最小数目的参数。例如,cp命令至少需要两个参数,如果参数的数目与命令要求不符,shell将会给出出错信息。例如: $ cp -i mydata newdata 注意:命令行中选项先于参数输入。 2. 命令行特征 命令行实际上是可以编辑的一个文本缓冲区,在按回车之前,可以对输入的文本进行编辑。比如利用BACKSPACE键可以删除刚键入的字符,可以进行整行删除,还可以插入字符,使得用户在输入命令,尤其是复杂命令时,若出现键入错误,无须重新输入整个命令,只要利用编辑操作,即可改正错误。 利用上箭头可以重新显示刚执行的命令,利用这一功能可以重复执行以前执行过的命令,而无须重新键入该命令。 bash保存着以前键入过的命令的列表,这一列表被称为命令历史表。按动上箭头,便可以在命令行上逐次显示各条命令。同样,按动下箭头可以在命令列表中向下移动,这样可以将以前的各条命令显示在命令行上,用户可以修改并执行这些命令。这一特征将在10.4节中进行详细的论述。 在一个命令行中还可以置入多个命令,用分号将各个命令隔开。例如: $ ls -F;cp -i mydata newdata 也可以在几个命令行中输入一个命令,用反斜杠将一个命令行持续到下一行。 $ cp –i mydata newdata 上面的cp命令是在三行中输入的,开始的两行以反斜杠结束,把三行作为一个命令行。 shell中的特殊字符 shell中除使用普通字符外,还可以使用一些具有特殊含义和功能的特殊字符。在使用它们时应注意其特殊的含义和作用范围。下面分别对这些特殊字符加以介绍。 1. 通配符 通配符用于模式匹配,如文件名匹配、路经名搜索、字符串查找等。常用的通配符有*、?和括在方括号, ,中的字符序列。用户可以在作为命令参数的文件名中包含这些通配符,构成一个所谓的“模式串”,在执行过程中进行模式匹配。 * 代表任何字符串(长度可以不等),例如:“f*”匹配以f打头的任意字符串。但应注意,文件名前的圆点(.)和路经名中的斜线(/)必须显式匹配。例如“*”不能匹配.file,而“.*”才可以匹配.file。 ? 代表任何单个字符。 ,, 代表指定的一个字符范围,只要文件名中,,位置处的字符在,,中指定的范围之内,那么这个文件名就与这个模式串匹配。方括号中的字符范围可以由直接给出的字符组成,也可以由表示限定范围的起始字符、终止字符及中间的连字符(-)组成。例如,f ,a- d, 与f ,abcd,的作用相同。Shell将把与命令行中指定的模式串相匹配的所有文件名都作为命令的参数,形成最终的命令,然后再执行这个命令。 下面我们给出表10-1说明这些通配符的具体含义。 表10-1 通配符含义举例 模式串 意 义 * 当前目录下所有文件的名称。 *Text* 当前目录下所有文件名中包含有Text的文件的名称。 ,ab-dm,* 当前目录下所有以a、b、c、d、m开头的文件的名称。 ,ab-dm,? 当前目录下所有以a、b、c、d、m开头且后面只跟有一个字符的文件的名称。 /usr/bin/?? 目录/usr/bin下所有名称为两个字符的文件的名称。 特别需要注意的是,连字符“-”仅在方括号内有效,表示字符范围,如在方括号外面就成为普通字符了。而*和?只在方括号外面是通配符,若出现在方括号之内,它们也失去通配符的能力,成为普通字符了。例如,模式“- a,*?,abc”中只有一对方括号是通配符,*和?均为普通字符,因此,它匹配的字符串只能是- a*abc和- a?abc。 最后说明一下使用通配符时需要注意的一些问题。由于*、?和,,对于shell来说具有比较特殊的意义,因此在正常的文件名中不应出现这些字符。特别是在目录名中不要出现它们,否则Shell匹配起来可能会无穷的递归下去。另外要注意的一点是:如果目录中没有与指定的模式串相匹配的文件名,那么Shell 将使用此模式串本身作为参数传给有关命令。这可能就是命令中出现特殊字符的原因所在。 2. 引号 在shell中引号分为三种:单引号,双引号和反引号。 * 单引号 „ 由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释。例如: $ string=?$PATH? $ echo $string $PATH $ 可见$保持了其本身的含义,作为普通字符出现。 * 双引号 “ 由双引号括起来的字符,除$、、?、和”这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待。对于$来说,就是用其后指定的变量的值来代替这个变量和$;对于而言,是转义字符,它告诉shell不要对其后面的那个字符进行特殊处理,只当作普通字符即可。可以想见,在双引号中需要在前面加上的只有四个字符$,,?和”本身。而对”号,若其前面没有加,则Shell会将它同前一个”号匹配。 例如,我们假定PATH的值为.:/usr/bin:/bin,输入如下命令: $ TestString,”$PATH”$PATH” $ echo $TestString .:/usr/bin:/ bin”$PATH $ 读者可以自己试一下在第二个双引号之前不加会产生什么结果。 * 反引号 ` 反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(?)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。例如: $ pwd /home/xyz $ string=”current directory is `pwd`” $ echo $string current directour is /home/xyz $ shell执行echo命令时,首先执行`pwd`中的命令pwd,并将输出结果/home/xyz取代`pwd`这部分,最后输出替换后的整个结果。 利用反引号的这种功能可以进行命令置换,即把反引号括起来的执行结果赋值给指定变量。例如: $ today=`date` $ echo Today is $today Today is Mon Apr 15 16:20:13 CST 1999 $ 反引号还可以嵌套使用。但需注意,嵌套使用时内层的反引号必须用反斜线()将其转义。例如: $ abc=`echo The number of users is `who| wc-l`` $ echo $abc The number of users is 5 $ 在反引号之间的命令行中也可以使用shell的特殊字符。Shell为得到``中命令的结果,它实际上要去执行``中指定的命令。执行时,命令中的特殊字符,如$,”,?等又将具有特殊含义,并且``所包含的可以是任何一个合法的Shell命令,如: $ ls note readme.txt Notice Unix.dir $ TestString,”`echo $HOME ` ` ls ,nN,*`” $ echo $TestString /home/yxz note Notice $ 其他情况,读者可自行试之。 1. 注释符 在shell编程中经常要对某些正文行进行注释,以增加程序的可读性。在Shell中以字符“#”开头的正文行表示注释行。 此外还有一些特殊字符如:用于输入/输出重定向与管道的<、>、<<、> >和|;执行后台命令的&;命令执行操作符&&和||及表示命令组的{}将在下面各小节中加以介绍。 标准输入/输出和重定向 1. 标准输入与输出 我们知道,执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。 我们以cat命令为例,cat命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。若使用如下命令: $ cat config 将会把文件config的内容依次显示到屏幕上。但是,如果cat的命令行中没有参数,它就会从标准输入中读取数据,并将其送到标准输出。例如: $ cat Hello world Hello world Bye Bye <ctrl+d> $ 用户输入的每一行都立刻被cat命令输出到屏幕上。 另一个例子,命令sort按行读入文件正文(当命令行中没有给出文件名时,表示从标准输入读入),将其排序,并将结果送到标准输出。下面的例子是从标准输入读入一个采购单,并将其排序。 $ sort bananas carrots apples <ctrl+d> apples bananas carrots $ 这时我们在屏幕上得到了已排序的采购单。 直接使用标准输入/输出文件存在以下问题: 输入数据从终端输入时,用户费了半天劲输入的数据只能用一次。下次再想用这些数据时就得重新输入。而且在终端上输入时,若输入有误修改起来不是很方便。 输出到终端屏幕上的信息只能看不能动。我们无法对此输出作更多处理,如将输出作为另一命令的输入进行进一步的处理等。 为了解决上述问题,Linux系统为输入、输出的传送引入了另外两种机制,即输入/输出重定向和管道。 2. 输入重定向 输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。所以说,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。 例如,命令wc统计指定文件包含的行数、单词数和字符数。如果仅在命令行上键入: $ wc wc将等待用户告诉它统计什么,这时shell就好象死了一样,从键盘键入的所有文本都出现在屏幕上,但并没有什么结果,直至按下,ctrl+d,,wc才将命令结果写在屏幕上。 如果给出一个文件名作为wc命令的参数,如下例所示,wc将返回该文件所包含的行数、单词数和字符数。 $ wc /etc/passwd 20 23 726 /etc/passwd $ 另一种把/etc/passwd文件内容传给wc命令的方法是重定向wc的输入。输入重定向的一般形式为:命令<文件名。可以用下面的命令把wc命令的输入重定向为/etc/passwd文件: $ wc < /etc/passwd 20 23 726 $ 另一种输入重定向称为here文档,它告诉shell当前命令的标准输入来自命令行。here文档的重定向操作符使用<<。它将一对分隔符(本例中用delim表示)之间的正文重定向输入给命令。下例将一对分隔符delim之间的正文作为wc命令的输入,统计出正文的行数、单词数和字符数。 $ wc<<delim >this text forms the content >of the here document,which >continues until the end of >text delimter >delim 4 17 98 在<<操作符后面,任何字符都可以作为正文开始前的分隔符,本例中使用delim作为分隔符。here文档的正文一直延续到遇见另一个分隔符为止。第二个分隔符应出现在新行的开头。这时here文档的正文(不包括开始和结束的分隔符)将重新定向送给命令wc作为它的标准输入。 由于大多数命令都以参数的形式在命令行上指定输入文件的文件名,所以输入重定向并不经常使用。尽管如此,当要使用一个不接受文件名作为输入参数的命令,而需要的输入内容又存在一个文件里时,就能用输入重定向解决问题。 1. 输出重定向 输出重定向是指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。 输出重定向比输入重定向更常用,很多情况下都可以使用这种功能。例如,如果某个命令的输出很多,在屏幕上不能完全显示,那么将输出重定向到一个文件中,然后再用文本编辑器打开这个文件,就可以查看输出信息;如果想保存一个命令的输出,也可以使用这种方法。还有,输出重定向可以用于把一个命令的输出当作另一个命令的输入(还有一种更简单的方法,就是使用管道,将在下面介绍)。 输出重定向的一般形式为:命令>文件名。例如: $ ls > directory.out $ cat directory.out ch1.doc ch2.doc ch3.doc chimp config mail/ test/ $ 将ls命令的输出保存为一个名为directory.out的文件。 注:如果>符号后边的文件已存在,那么这个文件将被重写。 为避免输出重定向中指定文件只能存放当前命令的输出重定向的内容,shell提供了输出重定向的一种追加手段。输出追加重定向与输出重定向的功能非常相似,区别仅在于输出追加重定向的功能是把命令(或可执行程序)的输出结果追加到指定文件的最后,而该文件原有内容不被破坏。 如果要将一条命令的输出结果追加到指定文件的后面,可以使用追加重定向操作符>>。形式为:命令>>文件名。例如: $ ls *.doc>>directory.out $ cat directory.out ch1.doc ch2.doc ch3.doc chimp config mail/ test/ ch1.doc ch2.doc ch3.doc $ 和程序的标准输出重定向一样,程序的错误输出也可以重新定向。使用符号2>(或追加符号2>>)表示对错误输出设备重定向。例如下面的命令: $ ls /usr/tmp 2> err.file 可在屏幕上看到程序的正常输出结果,但又将程序的任何错误信息送到文件err.file中,以备将来检查用。 还可以使用另一个输出重定向操作符(&>)将标准输出和错误输出同时送到同一文件中。例如: $ ls /usr/tmp &> output.file 利用重定向将命令组合在一起,可实现系统单个命令不能提供的新功能。例如使用下面的命令序列: $ ls /usr/bin > /tmp/dir $ wc –w < /tmp/dir 459 统计了/usr/bin目录下的文件个数。 管 道 将一个程序或命令的输出作为另一个程序或命令的输入,有两种方法,一种是通过一个临时文件将两个命令或程序结合在一起,例如上个例子中的/tmp/dir文件将ls和wc命令联在一起;另一种是Linux所提供的管道功能。这种方法比前一种方法更好。 管道可以把一系列命令连接起来,这意味着第一个命令的输出会作为第二个命令的输入通过管道传给第二个命令,第二个命令的输出又会作为第三个命令的输入,以此类推。显示在屏幕上的是管道行中最后一个命令的输出(如果命令行中未使用输出重定向)。 通过使用管道符“|”来建立一个管道行。用管道重写上面的例子: $ ls /usr/bin|wc -w 1789 再如: $ cat sample.txt|grep "High"|wc -l 管道将cat命令(列出一个文件的内容)的输出送给grep命令。grep命令在输入里查找单词High,grep命令的输出则是所有包含单词High的行,这个输出又被送给wc命令,wc命令统计出输入中的行数。假设sample.txt文件的内容如下: Things to do today: Low:Go grocery shopping High:Return movie High:Clear level 3 in Alien vs. Predator Medium:Pick up clothes from dry cleaner 那么该管道行的结果是2。 命令替换 命令替换和重定向有些相似,但区别在于命令替换是将一个命令的输出作为另外一个命令的参数。常用命令格式为: command1 `command2` 其中,command2的输出将作为command1的参数。需要注意的是这里的`符号,被它括起来的内容将作为命令执行,执行后的结果作为command1的参数。例如: $ cd `pwd` 该命令将pwd命令列出的目录作为cd命令的参数,结果仍然是停留在当前目录下 C shell 命令描述 C shell 提供以下内置命令: alias [Name [WordList]] 如果不指定任何参数,则显示所有别名。否则,命令显示所指定 Name 的别名。如果指定 WordList,则此命令将 WordList 的值指定给别名 Name。指定的别名 Name 不能是 alias 或 unalias。 bg [%Job ...] 将当前作业或 Job 指定的作业置于后台,如果它停止则继续此作业。 break 在最近圈起的 foreach 或 while 命令的 end 后,继续运行。 breaksw 从 switch 命令中断;在 endsw 命令后继续。 case Label: 在 switch 命令中定义 Label。 cd[Name] 等价于 chdir 命令(请参阅以下描述)。 chdir [Name] 家当前目录更改到 Name 变量指定的那个目录。如果不指定 Name,则命令更改为您的主目录。如果 Name 变量的值不是当前目录的子目录,并且不以 /、./、或 ../ 开始,则 shell 检查 cdpath shell 变量的每个组件以查看它是否具有匹配 Name 变量的子目录。如果 Name 变量是含以 / 开始的值的 shell 变量,则 shell 尝试此操作以查看它是否是目录。chdir 命令等价于 cd 命令。 continue 在最近圈起的 while 或 foreach 命令的 end 处,继续运行。 default: 标注 switch 语句中的 default 情况。default 应在所有其它 case 标号后出现。 dirs 显示目录堆栈。 echo 将字符串写入 shell 的标准输出。 else 运行 if (Expression) then ...else if (Expression2) then ... else ... endif 命令序列中第二个 else 后的命令。 end 继续将 Name 变量设置为由 List 变量指定的每个成员,并运行 foreach 与匹配的 end 语句之间的 Commands 序列。foreach 和 end 语句必须单独出现在独立的行上。 使用 continue 语句继续循环,使用 break 语句提前结束循环。当 foreach 命令从终端读取时,C shell 使用 ? 提示以允许输入 Commands。循环中的命令(由 ? 提示)不放入历史列表。 endif 如果 Expression 变量为真,则运行跟随第一个 then 语句的 Commands。如果 else if Expression2 为真,则运行跟随第二个 then 语句的 Commands。如果 else if Expression2 为假,则运行跟随 else 的 Commands。任何 else if 的对数都是可能的。只需要一个 endif 语句。else 段是可选的。字 else 和 endif 只能在输入行的开始使用。if 段必须单独出现在其输入行上或在 else 命令后。 endsw 继续将每个 case 标号与 string 变量的值匹配。string 是首先展开的命令和文件名。在 case 标号中使用模式匹配字符 *、? 和 [ . . . ],它们是变量扩展的。如果在 default 标号前没有找到标号匹配,则执行在 default 标记后开始。case 标号和 default 标号必须出现在行的开始。breaksw 命令导致执行在 endsw 命令后继续。否则,控制可能对 case 和 default 标号无效,如在 C 编程语言中一样。如果没有标号匹配,并且没有 default,则在 endsw 命令后执行继续。 eval Parameter . . . 在输入至 shell 时读 Parameter 变量的值,并在当前 shell 的上下文中运行结果命令。使用此命令以运行作为命令或变量替换的结果生成的命令,因为语法分析在这些替换前发生。 C shell学习笔记(一)综合 1 #!/bin/csh 2 可用set与env命令查看环境变量与当前值 3 @、set xxx=xxx 设置局部数值变量/变量;setenv 设置全局变量 eg. set name 赋空值 set name = (John Doe) setenv name “John Doe” 4 命令替换 eg. set command = `pwd` echo “The … is : $command” 显示:The … is : /…/… 5 所有UNIX命令在执行成功时传回一个退出状态0,在失败时传回非0。一个命令传回的状态值被保存在只读环境变量$?中,可以由调用进程检查。 6 从标准输入读 set xxx=$< 或者set xxx=`head –l` eg. #!/bin/csh echo –n “Enter input:” set line=`head –l` echo “You entered: $line” exit 0 7 unset xxx unsetenv xxx 8 向脚本传递参数 eg: #!/bin/csh echo “The command name is : $0” echo “The number of command line arguments are $#argv” echo –n “The value of the command line arguments are:” echo “$argv[1] $argv[2] …” echo “Another way to display value of all of the arguments : $argv[*]” exit 0 9-1 if (…) then … else if (…) then … else if (…) then … else … endif 9-2 foreach variable (argument list) command list end 9-3 while (expression) …(真时) end(假时) 9-4 switch (“$string”) case “yangfeng”: … breaksw case “panye”: … breaksw default: … breaksw endsw 10 数值变量 eg. @ a=10 @ b=15 @ difference = ( $a - $b ) sum = ( $a + $b ) @ a++ @ a+=1 @ area = $a*$b 11 数组 set xxx = (…………………………) $#xxx元素个数 $?xxx是否初始化(返回1表示已初始化) $xxx $xxx[i] 用set命令对任何shell变量赋以多个值,将会使其成为一个数组 12 连接多个字符串eg.set thisfile=”$directory”/”$file[$index]” C Shell Programming Introduction Shell:命令行解释器,在Unix系统中一般用来做为调用其他程序的媒介。 Commands: 命令,一般由命令名+参数构成。 输出到文件:命令一般地从终端接受输入和输出结果,使用重定向符>可以将输出写入文件。例如data > now,将输出写入now中。 从文件输入:使用<可以从文件读入作为命令的输入。例如 sort < data 将data文件内容排序。 [ ]中的任通配符:*能匹配任何字符串; ,能匹配一个任意字符; [a....b]将匹配意一个字符;[a-b]将匹配从a到b之间的任意一个字符。(注意:上面的通配符不能匹配'.'及'!') ~表示当前用户的主目录。 转义字符:\将使其后的字符成为普通字符。 chsh命令:改变使用的shell类型 终止当前执行任务: ^ C:中断信号; ^ D:End of file信号; ^ Z:将当前任务挂起, fg可继续执行挂起的命令。 !$ 表示上一条命令的最后一个参数 ! 重复执行上一条指令 !c 重复执行上一条以c开头的指令 alias 起别名,可以给一个经常使用的很长的命令起一个别名,以免重复输入很长的命令。可以加到shell的启动配置文件中.bashrc/.cshrc。 command >& file 将诊断输出和标准输出到文件file command >> file 将输出追加到已存在的file尾部 如果在命令的最后加上&号则将在后台运行该命令 在后台执行的任务不会受到键盘上任意输入信号如^C等的影响。 可以使用stop % num命令挂起当前在后台运行的程序。num为要终止的后台程序的编号。 可以使用^Z挂起当前前台运行程序然后使用bg命令恢复并改为后台执行。 Shell控制结构与Shell脚本 1、变量替换 $?name:当name有值时该表达式的值为1,否则为0 $#name: 值为name中的元素个数 $n:n为一个整数表示$argv[n],argv的第n个参数。区别:使用$argv[n]时如果n的值越界会产生错误,而$n不会。 $*:表示$argv $$:表示当前shell的进程号 $<:会被shell标准输入中输入的下一行取代(不是从脚本文件中) 2、表达式 在shell脚本中C语言中所有的算术运算都可以使用,如==,!=等。另外还有=~,!~跟==与!=意义类似,不过=~、!~右边的表达式可以有通配符,检测左边的字符串是否是右边字符串的模式。 -?filename: 文件查询。例如-e filename意思是filename是否存在。 使用{}把command括起来可以知道该command是否正常执行结束(返回1或者 0) 3、控制结构 if(expression)then command .... endif 注意,以下两种表示是无效的 if(expression) then command .... endif 及if(expression)then command endif 另外,if(expression)command也可以写成 if(expression) \ command command不能包含'|','&',';',也不能是其他的控制语句。 :修饰符用来从一个文件名中分出文件名主体和扩展名。例如,假设i的值为 /mnt/foo.bar,那么 % echo $i $i:r $i:e /mnt/foo.bar /mnt/foo bar #号为注释符 其他的控制结构: while(expression) commands end switch(word) case str1: commands breaksw ... case strn: commands breaksw default: commands breaksw endsw loop: commands goto loop shell学习1 chmod命令 chmod [mode] file 改变文件权限 u:文件属主 g:同组成员 o:其他成员 a:所有用户 4:可读 2:可写 1:可执行 d:目录 l:符号链接 s:套接字文件 b:块设备文件 c:字符设备文件 p:命名管道文件 -:普通文件 suid和guid 某个用户对属于自己的shell脚本设置了这种权限,那么其他用户在执行这一脚本时也会具有其属主的相应权限。 设置suid,在原有权限位前面加上一个4,如chmod 4755 file。 设置guid,在原有权限位前面加上一个2,如chmod 2755 file。 chown和chgrp 改变文件所属的用户 chmod owner file umask 设定文件创建时的缺省模式。对于文件,权限位最大为6。对于目录,权限位最大为7。 umask值+当前权限值=最大权限位 ln命令 ln [-s] source_path target_path find命令 -name 根据名字查找 -perm 根据权限查找 -mtime 根据日期查找(-5:5天以内 +10:10天以前) -prune 忽略某个目录 -newer 比某个文件更新(-newer file1 ! -newer file2 日期在file1和file2之间) -exec或ok 找到后执行命令(find . -type f -exec ls -l {} \ ;) xargs:通过管道获取find到的文件,执行命令。 find . -name "*.log" | xargs rm find . -name "*.c" | xargs grep "main" shell学习2 cron 系统调度进程,在无人工干预的情况下执行任务。 crontab文件格式: 分 时 日 月 星期 需执行的命令 每个域可以用","和"-"号来表示多个值,如1-5或1,2,4。 crontab命令格式: crontab [-u user] -l -e -r file -l:列出当前job -e:编辑当前crontab文件 -r:删除当前crontab文件 如何提交一个crontab文件, 1. 在当前用户$HOME目录下的.profile文件中,加入: EDITOR=vi; export=EDITOR 2. 新建一个cron,如tlhcron,加入如以下内容: 0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console 3. 用crontab tlhcron提交给cron守护进程。 at命令 向cron守护进程提交任务,保留当前所有环境变量。 基本格式: at [-f script] [-l -m -r] [time] [date] -m:完成后给用户发邮件 直接用at+时间,可进入命令行模式,提交多个任务,按CTRL+D结束。 & 让命令运行在后台 nohup 让命令在用户退出后仍运行 [...] 匹配[]中的任一字符 [!...] 匹配[]中非!之后的字符 echo - Linux下需要使用-n选项使输出不换行 - 选项-e使转义字符生效 - 用字符'\'实现转义。如 echo " \"hello world!"\" read read var1 var2 如read name surname 键入:leehom tan 查看:echo $name和echo $surname,分别为leehom和tan。 cat cat file1 file2 > file 管道| 命令1 | 命令2 命令1的输出是命令2的输入。 tee 将输出分为两支,一支输出给标准输出,另外一支拷贝给相应的文件。 如: make | tee make.log -a 选项追加至文件。 重定向 标准输入:0 标准输出:1 标准错误:2 command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中 command < filename >filename2 把command命令以filename1文件作为标准输入,以filename2文件作为标准输出 command <&m 把文件描述符m作为标准输入 command >&m 把标准输出重定向到文件描述符m中 command <&- 关闭标准输入 exec 在一个新的子shell中执行命令,所有环境被清除。 &&和|| 命令1 && 命令2 命令1为真,才执行命令2 命令1 || 命令2 如果命令1失败,才执行命令2 ()和{} 执行一系列命令,不同的是{}是在子shell中作为一个整体执行。 shell学习3 正则表达式 元字符: ^:匹配行首 例如:^d可以匹配目录文件。 $:匹配行尾 例如:^$可以匹配所有空行。 *:匹配一个或多个字符 []:匹配[]内的单个字符或字符序列,可以使用"-"序列范围 例如:[A-Za-z]匹配任意字母。 .:匹配任意单个字符 例如:...x..x..x可以匹配ls -l的输出的文件权限 \:屏蔽元字符 例如:\*\.txt匹配以*.txt结尾的文件。 pattern\{n\}:匹配pattern出现次数n次 例如:A\{2\}B匹配字母A两次,并以B结尾的串。 pattern\{n, \}:匹配pattern出现次数最少n次 例如:A\{4,\}B匹配字母A至少出现四次,并以B结尾的串。 pattern\{n, m\}:匹配pattern出现次数n至m次 例如:A\{2,4\}B匹配字母A出现两次至四次,并以B结尾的串。 grep命令 grep [选项] 正则表达式 文件 查找的字符串最好用双引号" "括起来,如果是正则表达式,最好用单引号' '括起来。 例如:grep -n '9{,\}3' myfile 在myfile中查找字符9至少出现4次的,且后面是字符3的串。 常用选项: -v:显示不匹配的所有行 -n:显示行数 -i:不区分大小写 -c:只输出行数 -r:递归查找子目录 -E:扩展匹配,等价于Egrep,Egrep接受所有正则表达式 例如:who | egrep '^(leehom_tan|tlh)' 匹配系统上不是leehom_tan和tlh的用户。 用^()可以排除字符串,用或模式"|"匹配leehom_tan或tlh。 4 shell学习 awk命令 三种运行方法: 1. awk [-F 分隔符] '命令行' 输入文件。 若未设置分隔符,默认以空格为分隔符。 2. 将awk命令写入文件,并使此文件可执行。 3. 将awk命令插入文件中,用awk -f 此脚本文件 输入文件。 任何awk语句都由模式和动作组成。 模式包括两个特殊字段BEGIN和END,BEGIN语句使用在任何文本浏览动作之前;END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志。 动作需要在大括号{ }内指明。 由分隔符间隔开的域可用$ 1,$ 2,$ 3..$n来表示,称为域标识。 • 确保整个awk命令用单引号括起来 • 确保命令内所有引号成对出现 • 确保用花括号括起动作语句,用圆括号括起条件语句 awk的元字符 除了上一章讲的元字符,还有: + 匹配一个或多个字符 , 匹配模式出现频率 awk的条件操作符 < 小于 <= 小于等于 == 等于 != 不等于 >= 大于等于 ~ 匹配正则表达式,要匹配的串需要用斜线/ /括起来。例如:awk '{ if($ 1 ~/wlan/) print }' !~ 不匹配正则表达式 && 与操作,语句两边必须同时匹配为真 || 或操作,语句两边同时或其中一边匹配为真 ! 非操作,求逆 awk的内置变量 ARGC 命令行参数个数 ARGV 命令行参数排列 ENVIRON 支持队列中系统环境变量的使用 FILENAME awk浏览的文件名 FNR 浏览文件的记录数 FS 设置输入域分隔符,等价于命令行- F选项 NF 浏览记录的域个数 NR 已读的记录数 OFS 输出域分隔符 ORS 输出记录分隔符 RS 控制记录分隔符 可以用变量表示域值。 可以修改域的值,但只改变副本,原文件不变。 可以创建新的域。 awk的内置函数 gsub(r,s) 在整个$ 0中用s替代r gsub(r,s,t) 在整个t中用s替代r 例如: awk 'gsub(/main/, "mmm") {print $ 0}' 1.c 替换模式用:/目标 串/, "替换串" index(s,t) 返回s中字符串t的第一位置 例如:awk 'BEGIN {print index("Banny", "ny")}' /dev/null 输出4 length(s) 返回s长度 例如:awk 'BEGIN {print length("myname")}' match(s,r) 测试s是否包含匹配r的字符串,返回所在位置 例如:awk 'BEGIN {print match("ABCD", /D/)}' 输出4 split(s,a,fs) 在fs上将s分成序列a,返回划分后数组的下标数 例如:awk 'BEGIN {record="123#456#789"; split(record, myarray, "#")} END {for (i in myarray) {print myarray[i]}}' /dev/null 输出: 123 456 789 循环读取用 for( i in myarray),split函数返回3,即myarray的下标。 sprint(fmt,exp) 返回经fmt格式化后的exp sub(r,s) 用$ 0中最左边最长的子串代替s,发现并替换第一次出现的位置 例如:awk ' sub(/main/, "mmm", $ 0)' 1.c substr(s, p) 返回字符串s中从p开始的后缀部分 substr(s, p, n) 返回字符串s中从p开始长度为n的后缀部分 例如:awk 'BEGIN {print substr("main", 3, 2)}' /dev/null 输出in。 printf修辞符 ) 格式:printf ([格式控制符], 参数 例如:echo 65| awk '{printf "%c\n", $ 0}' 输出A awk文件 向awk文件传值,格式:awk script_file var=value input_file 例如: #!/bin/awk -f #check on how many fields in a file #name: fieldcheck.awk #to call: filedcheck MAX=n FS= filename # NF!=MAX { print("line " NR " does not have " MAX " fields")} 输入:fieldcheck.awk MAX=7 FS=":" /etc/passwd 第一行#!/bin/awk -f必须自包含脚本。 shell学习5 sed命令 调用方式与awk相似。 n 选项:不打印输出到标准输出 f 选项:调用sed脚本使用此选项 示例文本test.txt: The honeysuckle band played all night long for only . It wsa an evening of splendid music and company. Too bad the disco floor fell through at 23:10. The local nurse Miss P.Neave was in attendance. 匹配模式: x x为一行号 ,如2,5表示从第2行到第5行 x,y 表示行号范围从x到y x,y! 查询不包含指定行号x和y的行 /pattern/ 查询包含模式的行 /pattern/pattern/ 查询包含两个模式的行 pattern/,x 在给定行号上查询包含模式的行 x,/pattern/ 通过行号和模式查询匹配行 编辑命令: p 打印匹配行 例如:sed -n '2p' test.txt 打印第二行 输出:It wsa an evening of splendid music and company. = 显示文件行号 例如:sed -n '/music/=' test.txt 查找匹配music的行,并输出行数 输出:2 d 删除定位行 例如:sed '1,3d' test.txt 删除1至3行,输出其他行 输出:The local nurse Miss P.Neave was in attendance. a\ 在定位行号后附加新文本信息 i\ 在定位行号后插入新文本信息 c\ 用新文本替换定位文本 下面用一个sed脚本来说明上述操作,建立mix.sed,并chmod u+x mix.sed设置执行权限。 #!/bin/sed -f #name: mix.sed #append, insert, replace /company/ a\ it's add op!\ add 2nd /evening/ i\ it's insert op!\ insert 2nd 3 c\ it's replace op! #replace 3rd line 执行后输出: The honeysuckle band played all night long for only . it's insert op! insert 2nd It wsa an evening of splendid music and company. it's add op! add 2nd it's replace op! The local nurse Miss P.Neave was in attendance. s 使用替换模式替换相应模式 w 写文本到一个文件 替换模式为:s/查找模式/替换模式/[g p w n] 例如:sed 's/night/NIGHT/' test.txt g选项:全部替换。否则只替换第一次 p和n选项:打印或不打印至标准输出 w选项:将结果写入文本 & 将替换模式字符串放在查找模式字符串的前面或后面 例如: echo $PWD | sed 's/^\//PWD &/g' 输出:PWD /root/Desktop/_temp echo $PWD | sed 's/^\//& PWD /g' 输出:/ PWDroot/Desktop/_temp r 从另一个文件中读文本 例如:sed '/company/.r another.txt' test.txt 将another.txt的内容放在匹配company的地方后面 q 第一个模式匹配完成后退出或立即退出 例如:sed '/.a.*/q' test.txt l 显示与八进制ASCII代码等价的控制字符 例如:sed -n '1, $l' test.txt {} 在定位行执行的命令组 c shell 学习笔记 C Shell 1.display shell variables echo $USER 2.three C shell configuration files .cshrc .login .logout Command aliases, variable settings, and shell options are defined in .cshrc file. The .login file is used to set up and configure the interactive envionment. The .logout file does not hava a standard use, and can be omitted. It is usually used to clear th e screen. 3.文件夹的权限 w允许用户在文件夹下建立文件,删除文件等 x允许用户cd到该目录下 4.crontab命令 crontab -e Edits the current cron table. crontab -l Displays the current cron table on the screen. crontab -r Deletes the current cron table. 5.at命令 atq 列出所有任务 atrm 9 cancel job 9 建一个job at noon tomorrow at> rm /tmp/* at>ctrl+D 由at.allow 和 at.deny来控制是否可以使用at命令 6.grep命令 执行grep后,使用echo $? 显示命令的返回值 0 找到pattern 1 没有找到Pattern 2 文件不存在 ps-ef | grep root 找所有root的进程 7. sed Options p print d delete s substitute n suppresses the default behavior of sed e enables you to make multiple edits 8. command history set history=n set savehist=n accross logins !-n 执行第n号历史的命令 !! 执行最近的一条命令 ^str1^str2 修改刚刚输入的命令,将str1改成str2 9. File Testing Operators -w Tests if the current user can write to a file -r Tests if the current user can read a file -x Tests if the current user can execute a file -e Tests if a file exists -o Tests if the current user owns a file -z Tests if a file length is zero -d Tests if a file is a directory -f Tests if a file is a plain file example: if (-e file) then echo "file exists" endif 10. if if (condition) then command.. else command.. endif 11. switch switch (variable) case constant: command breaksw endsw #!/bin/csh echo "Which color do you like ?" set color=$< switch ("$color") case bl*: echo "The sky is $color" breaksw case red: case yellow: echo "The sun is $color" breaksw case green: echo "The grass is $color" breaksw default: echo "$color is not found in one of the categories" endsw 12. foreach foreach variable (item list) commands end example 1 #!/bin/csh foreach user (fhowe jlewis sward kburton cturner) mail $user < meeting_notes end example 2 #!/bin/csh foreach arg ($*) if (-e $arg) then echo "File/Directory $arg exists" else echo "File/Directory $arg does not exist" endif end 13. while #!/bin/csh set num=0 while ($num < 4) echo $num @ num++ end 14. repeat #!/bin/csh repeat 3 echo "Hello there" 15 #!/bin/csh while ($#argv ) echo $argv echo $#argv shift end 输出: # ./temp.csh a b c d e a b c d e 5 b c d e 4 c d e 3 d e 2 e 1 16. #!/bin/csh while(1) echo "First loop" loop 1 while (1) echo "Second loop" loop 2 while (1) echo "Third loop" loop 3 repeat 3 break 跳出三重loop,所以直接跳到最后的echo end end end echo "Out of loops" 17 parameter ./parameter_script hello there $0=./patameter_script $1=hello $2=there $*=hello there $#=2 $argv[0]= $argv[1]=hello $argv[2]=there $argv[*]=hello there $#argv=2 $argv=hello there 18. onintr #!/bin/csh onintr cleanup mkdir ~/data touch ~/data/SalesQ1 touch ~/data/SalesQ2 touch ~/data/SalesQ3 touch ~/data/SalesQ4 grep -e "Q1" database > ~/data/SalesQ1 grep -e "Q1" database > ~/data/SalesQ2 grep -e "Q1" database > ~/data/SalesQ3 grep -e "Q1" database > ~/data/SalesQ4 exit cleanup: onintr - #disable further interrupts, CTRL + C 将不起作用 echo "Cleaning up" rm ~/data/Sales* rmdir ~/data 19.debug csh -x debug_script display each line in the script debug_script after variable substitution and before execution csh -v debug_script displays each line of the debug_script debug before execution csh -n debug_script displays each line of the script debug_script but does execute commands 也可以在脚本的前面直接用-v -x 选项 #!/bin/csh -xv 20 set 可以在脚本内的任意位置使用set命令帮助调试 set echo 命令displays each line of script after variable substitution and before execution set verbose displays each line of script before execution.
/
本文档为【Linux主要B shell与C shell命令详解】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索