您的位置:首页 > 运维架构 > Shell

Linux的shell基础教学

2010-08-29 01:18 351 查看
Linux的shell好比DOS的COMMAND.COM,在用户和系统之间架起一座桥梁,让用户方便地操作系统。由于Linux是一个完全开放的平台,有许多人都为它编写了Shell程序。其中的BASH(Baurne Again SHell)容纳了其他Shell程序的许多特征,功能十分全面,所以我们以它为例来讲解Shell的一些用法。

  在开始讲解Linux的一些用法之前,我们将先介绍一些命令,以便读者在以后的文中做参考。
  1.ls命令
  格式:ls [选项] [文件列表]
  选项:无,显示当前目录的文件,类似DOS下的dir/w命令;
  -l,显示文件的详细内容,有文件类型、文件权限、链接或目录计数、所有者、所有组、文件大小、文件日期和文件名。
  -R,从指定目录开始列出所有向下的目录中的文件,类似DOS下的dir/s命令。
  2.who命令
  格式:who
  选项:无,显示当前都有哪些用户在使用Linux。
  3.cat命令
  格式:cat [文件列表]
  作用:显示文件列表中文件的内容。
  4.passwd命令
  格式:passwd
  作用:设定用户口令。
  5.pwd命令
  格式:pwd
  作用:显示当前路径。类似DOS下无参数的cd命令。
  6.cd命令
  格式:cd [路径名]
  作用:改变当前路径,同DOS下的cd命令。
  7.rm命令
  格式:rm [文件列表]
  作用:删除文件列表中的文件。同DOS下的del命令。
  8.wc命令
  格式:wc [选项] [文件名]
  选项:无,显示文件的行数、词数、字符数。
  -w,只显示文件的词数。
  下面我们将开始讲述Linux Shell的一些用法。

  一、命令行编辑

  在Linux下,当我们输入一行命令但没有按Enter键时发现输入有误,我们应该怎么办?Linux为我们提供了两个特殊符号@和#。
  @号的作用是将整行废除。例如:
  $wwho @
  who
  root tty1 Dec 3 10:22
  cl tty2 Dec 3 11:57
  cxp tty3 Dec 3 13:54
  在这个例子中,命令的头一个字符有误,用@废除这一行,然后重新输入who命令。
  #号的作用是将前一个字符废除。例如:
  $ww#hho##o
  root tty1 Dec 3 10:22
  cl tty2 Dec 3 11:57
  cxp tty3 Dec 3 13:54
  在这个例子中,第一个#用于废除多写的那个w,第二个#把o删除,第三个#把多写h的删除,再补上o,就是who命令。
  这样看来Linux的操作十分麻烦,其实这两项功能多用于那些老的键盘上。在现在的键盘上自然要方便的多了。你可以通过左右键、Del键、退格键来编辑命令行,就像在文本文件中编辑一行文本一样轻松,这可比DOS还要方便。

  二、命令补全

  当用户输入一个命令的一部分后,按Tab键,Shell将试图补全这个命令。例如:
  $pass< Tab>
  Bash知道这是一个命令,并查找以pass开头的命令,当查到只有passwd符合条件时,Bash将把命令补全。如果查找到多个以输入字符串开头的命令,则会发出警告声,在按一下Tab键,将显示出以此字符串开头的命令。例如:
  $pas< Tab>< Tab>
  passwd paste
  此时在原输入字符串的基础上增加字符避免多义性后,再用Tab键即可补全命令。
  Bash不仅能补全命令,还能补全做命令参数的文件名,如:
  $ls -l /home/public/c< Tab>< Tab>
  clfile cxpfile
  $ls -l /home/public/cl< Tab>
  -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
  在这个例子中,按第一个Tab键,会有警告声,第二个Tab键用于显示在/home/public目录下同以c开头的文件的名称,然后添加字符l,在按Tab键,Bash将补全文件名,即clfile。

  三、历史表(history list)

  因为用户很有可能用到过去用过的命令,所以Bash将每次输入的命令都记录在历史表中以便将来使用。历史表可以容纳下500条命令。这么大的容量足够我们使用的了。在退出登录时,Bash将历史表的内容保存到.bash_history文件中,在登录时,又将.bash_history的内容写入历史表中,这样一来就好像接着上一次登录一样,我们可以使用history命令来显示历史表中的记录。例如:
  $history
  210 who
  211 passwd
  212 cd public
  213 cp /home/file/clfile .
  214 cp /home/file/cxpfile .
  215 ls -l /home/pubic
  从例子中可以看出,每一个命令占一行,被称为一个事件(event),每一个事件的前一部分的数字被称为事件号,后一部分则是命令。
  如果我们想要执行历史表中的命令,我们可以用历史代替操作符(!)加上事件号来实现。例如:
  $!210
  who
  root tty1 Dec 3 10:22
  cl tty2 Dec 3 11:57
  cxp tty3 Dec 3 13:54
  在例子中,我们执行了历史表中事件号为210的who命令。
  如果想要执行最近一次的命令,可以如下输入:
  $!!
  who
  root tty1 Dec 3 10:22
  cl tty2 Dec 3 11:57
  cxp tty3 Dec 3 13:54
  我们也可以用!和命令连用,来重复过去执行过的命令。这样的优点是不必写出命令的参数。如:
  $!ls
  ls -l /home/pubic
  -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
  -rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
  还有一种方法是在命令的任何位置查找与指定输入部分相同的命令。具体做法是用一对?把要查找的字符串括起来,例如:
  $!?-l?
  ls -l /home/pubic
  -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
  -rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
  在这条命令中,Bash在每个事件中搜索有无-l这个字符串,当搜索到有-l字符串的ls -l /home/pubic命令时,就执行它。
  如果第二个问号后面再没有其他的东西,则可省略第二个问号,因此上面的例子也可以写成:
  $!?-l
  如果要重复命令,但又要做些改动,可以用s/old/new来实现,它的作用是将old部分的字符串换成new部分的字符串。例如:
  $!?-l?:s/public/cl
  ls -l /home/cl
  drwxrw-r-- 1 cl user 1067 Apr 19 23:35mp
  -rw-r--r-- 2 cl user 21 Dec 3 13:41clfile
  这个例子是将ls -l /home/public命令中的public换成cl,然后执行。即执行ls -l /home/cl。
  其实,上面这些命令还有一个很简单的实现方法,即按向上键,在提示符后就会出现前一次的命令。因此,我们可以通过按上键在历史表中从尾部向前查找命令。当找到要执行的命令后,可以直接按Enter键执行,也可以用前面介绍的命令行编辑方法修改命令。而向下键的作用正好与向上键相反,是从前向后查找历史表。大家可以在实际运用中体会它们的用法。

  四、路径名扩展

  我想大家对DOS中的*和?不陌生吧。在Linux下它们的用途完全相同。
  *代表任意一个字符串,例如:
  $ls -l /home/public/c*
  -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
  -rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
  在这个例子中,Bash将*扩展后使c*变为clfile、cxpfile。
  ?代表任意一个字符,例如:
  $cat /home/public/c?file
  User name is CaoLei.
  在这条命令中,Bash将?扩展后得到clfile,即执行cat /home/public/clfile命令。
  同DOS一样,Linux允许在一行中重复使用*和?,如:
  $ls c*f*
  clfile cxpfile
  $ls c?pf?le
  cxpfile
  在Linux中,比DOS还多一种路径名扩展方式,即用[]把要匹配的字符括起来,如:
  $rm dirfle[12346789]
  这行命令的作用是删除名为dirfile1、dirfile2、…、dirfile4、dirfile6、…、dirfile9的这些文件。我们也可以用一种 比较简单的写法来表示上面的命令:
  $rm dirfile[1-46-9]
  不仅可以用数字,还可以使用字母:
  $rm dirfile[abcdefghijklmnopqrstuvwxyz]
  $rm dirfile[a-z]
  这两条命令是同一个意思,它们都是把名为dirfilea、…、dirfilez的这些文件删除。

  五、输入/输出重新定向

  Linux命令一般从标准输出设备获得信息,经过命令程序处理后,再将结果送到标准输出设备上。键盘既是Linux的标准输出设备,显示器既是Linux的标准输入设备。
  有时,要从文件中获得信息,或是将结果送到文件中。因为每个命令不一定都带有相应的参数,所以Bash提供了将命令的标准输出和标准输入重新定向的功能,这些功能可以通过相应的符号表示。
  1.>和>>
  >的功能是将命令的输出送入文件中。如果文件不存在,则创建这个文件;如果文件存在,则覆盖这个文件,如:
  $ls -l > dirfile
  $cat dirfile
  -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
  -rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
  这个例子中,第一个命令前半部分是列出一个目录的文件清单,在一般情况下文件清单显示到屏幕上。但后半部分有>号,Bash将标准输出定义为名为dirfilr的文件,将显示结果保存到了这个文件中。第二个命令用于察看dirfile文件的内容,它的内容和直接使用ls -l的结果一样。
  >>的功能同>相似,不同的是:如果文件存在,它并不是覆盖文件,而是将结果添加的文件的后面。例如:
  $ls -l >> dirfile
  $cat dirfile
  -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
  -rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
  -rw-r--r-- 2 cl user 21 Dec 3 12:37clfile
  -rw-rw-r-- 2 cxp user 27 Dec 3 12:33cxpfile
  2.2>、2>>和&>
  在Linux中标准输出和错误输出是不同的。在一般情况下,它们都把结果送到显示器上,但当输出重定向时,我们就可以看出它们是不同的了。
  $ls mp > lserr
  ls:mp: No such file or directory.
  $cat lserr
  $
  在上面的命令中,没有mp文件或目录,所以出现错误信息,但错误信息并未保存到lserr文件中,由此可见标准输出和错误输出是不同的。如果我们想把错误信息保存到文件中,可以使用2>。
  $ls mp 2> lserr
  $cat lserr
  ls:mp: No such file or directory.
  2>>是将错误信息添加到文件尾部。但如果我们想把标准输出和错误输出都保存到一个文件时,该怎么办?我们可以使用&>。
  3.<
  它的作用正好与>相反,即把文件中的内容送入命令中。如:
  $wc < /etc/passwd
  18 20 608 /etc/passwd
  输入/输出重新定向是一种十分有用的功能,它可以是许多命令的功能增强,办到一些这些命令原本办不到的事。

  六、管道

  我相信各位在DOS中可以都用过这个功能,用竖杠字符|来将多个命令连结起来。用|前面的命令的输出做|后面的命令的输入,组合出十分有用的命令。这就是管道。通过下面的例子我们能了解它的用法。
  $ls /bin | wc -w
  87

  七、作业(job)

  Bash把每次执行的命令当做一个作业,并为它们分配了作业号,如果有管道,则将这些命令认为是一个作业。Bash可以用作业号来控制作业的运行、挂起、结束。需注意的是作业不等于进程。有关作业控制的符号和命令如下:
  1.&
  它用在命令行的最后,作用是将命令放到后台继续运行,立即返回Bash的提示符。
  $ls -lR / &> lsfile &
  [1]204
  $
  这行命令是将把/以下的所有目录中的文件送到lsfile,因为权限问题所以会产生错误信息,故用&>。在最后添加了&,所以不等这条命令结束就返回提示符。其中[]中的内容是作业号,后面的数字是进程号。
  如果没有在命令后面加&,要想在命令执行中使用提示符,可以用Ctrl+z先将命令挂起,等以后执行,如:
  $cat > text
  < Ctrl+z>
  $
  2.jobs命令
  这个命令是用于显示系统中所有的作业,如:
  $cat > text
  < Ctrl+z>
  $jobs
  [1]+ stopped cat > text
  这个例子中,第一条命令是从键盘上读取字符输入到text文件中。接着按Ctrl+z将它挂起,再用jobs命令察看作业。
  3.fg、bg和kill命令
  fg是将作业送到前台运行。如:
  $cat > text
  < Ctrl+z>
  $jobs
  [1]+ stopped cat > text
  $fg
  cat > text
  User name is Caolei.
  < Ctrl+d>
  $
  在这个例子中,先用Ctrl+z将cat > text命令挂起,接着用jobs命令察看作业,因为作业号右边有+号,所以它是缺省作业,可以直接用fg命令把它送到前台执行。然后,我们输入了 User name is Caolei.做text的内容,用Ctrl+d结束cat > text命令。
  bg命令的作用是将作业送到后台,用法同fg一样。
  kill命令是将作业立即结束,用法是kill %作业号。例如:
  $cat > text
  < Ctrl+z>
  $jobs
  [1]+ stopped cat > text
  $bg
  $jobs
  [1]+ stopped(tty input) cat > text
  $kill %1
  上面的例子中,bg将作业1发送到后台执行(不是挂起),但因为cat > text需要从键盘上获得输入,放到后台无法运行,故被自动挂起。
  到此为止,我们总共介绍了Bash的七大功能。很好的利用它们,可以使我们更好地操作各种命令来完成我们的工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: