热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

LINUX系统管理员的终极武器---shell详解

文章标题:LINUX系统管理员的终极武器---shell详解。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  在DOS 中,你可能会从事一些例行的重覆性工作,此时你会将这些重覆性的命令写 成批次档,只要执行这个批次档就等於执行这些命令。大家会问在UNIX中是否有批次处 理这个东东,答案是有的。在UNIX中不只有如DOS 的批次处理,它的功能比起DOS 更强 大,相对地也较复杂,已经和一般的高阶语言不相上下。在UNIX中大家都不叫做批次档 ,而叫做Shell Script。
  
  一般而言,Shell Script的地位和其它的可执行档(或命令)是完全相同的,只不 过Shell Script是以文字档的方式储存,而非二进位档。而执行Shell Script时,必须 有一个程式将其内容转成一道道的命令执行,而这个程式其实就是Shell ,这也就是为 什麽我们叫做Shell Script的原因(往後我们称为Script)。不同Shell 的Script基本 上会有一些差异,所以我们不能将写给A shell 的Script用B shell 执行。而在UNIX中 大家最常使用Bourne Shell以及C Shell ,所以这堂课就介绍这两种Script的写法。
  
  将文字档设为可执行的Shell Script
  
  如果我们已经写好Script,如何将其设成可执行档呢?因为Script其实是一个可执 行档,所以必须将其存取权设定成可执行。我们可以使用下列命令更改存取权:
  
  chmod u+x filename 只有自己可以执行,其它人不能执行
  
  chmod ug+x filename 只有自己以及同一群可以执行,其它人不能执行
  
  chmod +x filename 所有人都可以执行
  
  而我们如何指定使用那一个Shell 来解释所写的Script呢?几种基本的指定方式如 下所述:
  
  1. 如果Script的第一个非空白字元不是"#",则它会使用Bourne Shell。
  
  2. 如果Script的第一个非空白字元是"#"时,但不以"#!"开头时,则它会使用C Shell。
  
  3. 如果Script以"#!"开头,则"#!"後面所写的就是所使用的Shell,而且要将整个路径 名称指出来。这里建议使用第三种方式指定Shell ,以确保所执行的就是所要的。Bourne Shell的路 径名称为/bin/sh ,而C Shell 则为/bin/csh。
  
  除了在Script内指定所使用的Shell 外,你也可以在命令列中强制指定。比如你要 用C Shell 执行某个Script,你可以下这个命令:
  
  csh filename
  
  此时的Script的存取权就不一定要为可执行档,其内部所指定的Shell 也会无效,详细 的情形後面会讨论。
  
  Script的基本结构及观念 Script是以行为单位,我们所写的Script会被分解成一行一行来执行。而每一行可 以是命令、注解、或是流程控制指令等。如果某一行尚未完成,可以在行末加上"" , 这个时候下一行的内容就会接到这一行的後面,成为同一行,如下
  
  echo the message is
  
  too long so we have
  
  to split it into
  
  several lines.
  
  当Script中出现"#" 时,再它後面的同一行文字即为注解,Shell 不会对其翻译。
  
  在Script中要执行一个命令的方法和在命令列中一样,你可以前景或背景执行,执 行命令时也会需要设定一些环境变数。
  
  Script的流程控制和一般高阶语言的流程控制没有什麽两样,也和高阶语言一样有 副程式。这些使得Script的功能更加强大。
  
  为了达到与高阶语言相同的效果,我们也可以在Script中设定变数,如此使Script 成为一个名付其实的高阶语言。
  
  Bourne Shell
  
  一、变数
  Bourne Shell的变数型态只有字串变数,所以要使用数值运算则必须靠外部命令达 成目的。而其变数种类有下列几种:
  
  1. 使用者变数 这是最常使用的变数,我们可以任何不包含空白字元的字串来当做变数名称。 设定变数值时则用下列方式:
  
  var=string 取用变数时则在变数名称前加上一"$" 号。
  
  name=Tom
  
  echo name
  
  echo $name
  
  结果如下:
  
  name
  
  Tom
  
  2. 系统变数(环境变数)
  
  和使用者变数相似,只不过此种变数会将其值传给其所执行的命令。要将一使 用者变数设定为系统变数,只要加上:
  
  export var
  
  name=Tom
  
  export name
  
  以下是使用者一进入系统之後就已设定好的系统变数:
  
  $HOME 使用者自己的目录
  
  $PATH 执行命令时所搜寻的目录
  
  $TZ 时区
  
  $MAILCHECK 每隔多少秒检查是否有新的信件
  
  $PS1 在命令列时的提示号
  
  $PS2 当命令尚未打完时,Shell 要求再输入时的提示号
  
  $MANPATH man 指令的搜寻路径
  
  3. 唯读的使用者变数
  
  和使用者变数相似,只不过这些变数不能被改变。要将使用者变数设成唯读的 ,只要加上:
  
  readonly var 而若只打readonly则会列出所有唯读的变数.还有一点,系统变数不可以设定 成唯读的。
  
  name=Tom
  
  readonly name
  
  echo $name
  
  name=John
  
  readonly
  
  结果如下: Tom name: is read only readonly name readonly ......
  
  4. 特殊变数
  
  有些变数是一开始执行Script时就会设定,并且不以加以修改,但我们不叫它 唯读的系统变数,而叫它特殊变数(有些书会叫它唯读的系统变数),因为这 些变数是一执行程式时就有了,况且使用者无法将一般的系统变数设定成唯读 的。以下是一些等殊变数:
  
  $0 这个程式的执行名字
  
  $n 这个程式的第n个参数值,n=1..9 $* 这个程式的所有参数
  
  $# 这个程式的参数个数
  
  $$ 这个程式的PID $! 执行上一个背景指令的PID
  
  $? 执行上一个指令的返回值
  
  当你执行这个程式时的参数数目超过9 个时,我们可以使用shift 命令将参数 往前移一格,如此即可使用第10个以後的参数。除此之外,吾人可以用set 命 令改变$n及$*,方法如下:
  
  set string 如此$*的值即为string,而分解後则会放入$n。如果set 命令後面没有参数, 则会列出所有已经设定的变数以及其值。
  
  档名:ex1 参数:this is a test
  
  echo Filename: $0
  
  echo Arguments: $*
  
  echo No. of args.: $#
  
  echo 2nd arg.: $2
  
  shift
  
  echo No. of args.: $#
  
  echo 2nd arg.: $2
  
  set hello, everyone
  
  echo Arguments: $*
  
  echo 2nd arg.: $2
  
  结果如下:
  
  Filename: ex1
  
  Arguments: this is a test No. of args.: 4
  
  2nd arg.: is
  
  No. of args.: 3
  
  2nd arg.: a
  
  Arguments: hello, everyone
  
  2nd arg.: everyone
  
  值得一提的是,当你想从键盘输入一变数值时,你可以使用下面的命令:
  
  read var1 var2..... 这时read会将一个字分给一个变数。如果输入的字比变数还多,最後一个变数会将 剩下的字当成其值。如果输入的字比变数还少,则後面的变数会设成空字串。 如果需要处理数值运算,我们可以使用expr命令。其参数及输出列於附录A。
  
  二、执行命令
  在Bourne Shell中有五种方法执行一个命令,而这五种方式所产生的果有些许的不 同。
  
  1. 直接下命令 这个方式和在命令列中直接下命令的效果一样。
  
  2. 使用sh命令 sh command 这个档案必须是Bourne Shell的Script,但这个档案并不一定要设成可执行。 除此之外和直接下命令的方式一样。
  
  3. 使用"."命令 . command 这时和使用sh命令相似,只不过它不像sh一般会产生新的process ,相反地, 它会在原有的process 下完成工作。
  
  4. 使用exec命令 exec command 此时这个Script将会被所执行的命令所取代。当这个命令执行完毕之後,这个 Script也会随之结束。
  
  5. 使用命令替换 这是一个相当有用的方法。如果想要使某个命令的输出成为另一个命令的参数 时,就一定要使用这个方法。我们将命令列於两个"`" 号之间,而Shell 会以 这个命令执行後的输出结果代替这个命令以及两个"`" 符号。
  
  str='Current directory is '`pwd` echo $str
  
  结果如下:
  
  Current directory is /users/cc/mgtsai
  
  这个意思是pwd 这个命令输出"/users/cc/mgtsai",而後整个字串代替原 来的`pwd` 设定str 变数,所以str 变数的内容则会有pwd 命令的输出。
  
  number=`expr $number + 1` 这就是先前所提要作数值运算的方法,基本上expr命令只将运算式解,而 後输出到标准输出上。如果要将某变数设定成其值,非得靠命令替换的方 式不可。这个例子是将number变数的值加1 後再存回number变数。
  
  三、流程控制
   在介绍流程控制之前,我们先来看看test命令。test命令的参数是条件判断式,当 条件为真时则传回非零值,而条件为伪时则传回零。在所有的流程控制都必须用到 test命令来判断真伪。而test命令的使用方法则列於附录B。
  
  test $# = 0 如果执行这个程式没有参数时,会传回非零值代表"$# = 0"这个条件成立。反 之则会传回零。
  
  以下介绍各种流程控制:
  
  1. if then 语法以及流程图如下 语法以及流程图如下
  
  if(condition)
推荐阅读
  • 我必须执行一个python脚本;问题是我以前从未使用过它importurlibimporturlib2data{username:xyz,secret:12312}e ... [详细]
  • 在使用如新浪微博和腾讯微博等平台的Python API时,发现了一种将字典转换为函数参数的有效方法,即通过在字典前添加双星号(*)来实现动态变量的传递。这种方法不仅提高了代码的灵活性,也简化了API调用过程。 ... [详细]
  • ArcGIS技巧:为相邻地块创建指定宽度的隔离带
    在地理信息系统(GIS)的数据处理中,为了满足特定项目的质量检查标准,需要在相邻地块之间创建一定宽度的隔离带。本文将探讨如何使用ArcGIS工具解决这一问题,确保不同地块图斑间保持规定的最小距离。 ... [详细]
  • 深度兴趣网络在点击率预测中的应用研究
    本文探讨了一种名为深度兴趣网络(Deep Interest Network, DIN)的新方法,该方法通过捕捉用户的历史行为和当前上下文之间的交互来提高点击率预测的准确性。DIN模型不仅考虑了用户的静态偏好,还动态地调整了对不同商品的兴趣权重,从而实现了更加个性化的推荐。 ... [详细]
  • 本文探讨了一个项目中遇到的挑战,即如何通过技术手段解决不同菜单项触发时,跨域IFrame页面的高度自适应问题。通过创建中介页面和利用JavaScript与Cookie机制,实现无缝的用户体验。 ... [详细]
  • 在 PHP 4, PHP 5 和 PHP 7 中,fstat 函数用于获取已打开文件指针的文件统计信息。此函数与 stat() 类似,但其操作对象为已打开的文件指针而非文件名称。 ... [详细]
  • 本文探讨了在PHP中处理特定类型编码字符串的方法,特别是如何将HTML实体编码的字符串转换为普通文本。 ... [详细]
  • Java 动态代理详解与示例
    本文详细介绍了Java中的动态代理机制,包括如何定义接口、实现类和代理处理器,并通过具体示例演示了动态代理的创建和使用过程。 ... [详细]
  • LeetCode 6057: 计算与子树平均值相等的节点数量——深度优先搜索
    本题要求在给定的二叉树中找到所有符合条件的节点数量,即节点的值等于其所有后代节点(包括自身)值的平均值。这里的平均值是通过将所有后代节点值之和除以后代节点的数量,并向下取整得到。 ... [详细]
  • CSGO
    CSGOTimeLimit:40002000MS(JavaOthers)MemoryLimit:524288524288K(JavaOthers)ProblemDescriptio ... [详细]
  • 本文介绍了如何通过自定义View中的declare-styleable属性创建枚举类型,并在代码中访问这些枚举值的方法。 ... [详细]
  • 本文汇集了使用C#中不同HTTP客户端向Web API上传文件的实例,旨在为开发者提供实用的技术指南。 ... [详细]
  • 本文详细介绍了在PHP中如何创建新文件以及如何使自定义函数在整个项目中全局可用的方法,包括最新的实践技巧。 ... [详细]
  • 解决Android开发中的TextView难题
    探讨了在Android开发过程中遇到的关于TextView组件的常见问题,特别是如何实现多行文字的跑马灯效果,并提供了初步的解决方案和参考资料。 ... [详细]
  • Only2 Labs 是一家专注于视觉设计的工作室,如果您对当前的设计感到不满,或者急需寻找一个可靠的设计合作伙伴,甚至是您的团队项目需要专业指导,Only2 Labs 都将竭诚为您提供帮助。 ... [详细]
author-avatar
卡哇伊--欣欣_749
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有