简述使用shell编程的三步骤(shell编程) 您所在的位置:网站首页 如何使用shell编程 简述使用shell编程的三步骤(shell编程)

简述使用shell编程的三步骤(shell编程)

2023-03-25 09:41| 来源: 网络整理| 查看: 265

本文目录shell编程如何使用Linux shell编程来进行系统管理和网络管理如何编写一个shell脚本三个简单Linux的shell脚本程序编写shell编程,求高手帮助,小弟感激不尽!!!小弟分不多,只能给这么多先SHELL编程 求大神指教shell脚本编程shell编程linux 怎么进入shell编程模式Shell的简单编程shell编程

先得遍历目录,然后根据每一个获取的文件或目录来进行判断,从而进行不同的代码块就ok了。1.得到文件后:判断文件读写熟悉,然后进一步操作2.判断文件可执行并且有权限执行,则直接去执行就行了(考虑参数)。……差不多就是这个思路了

如何使用Linux shell编程来进行系统管理和网络管理

从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作。在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用。深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一。Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种 就足够了。在本文中,我们关注的重点是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用;同时,Bash也是大多数Linux系统默认的Shell。在一般情况下,人们并不区分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我们可以看到#!/bin/sh,它同样也可以改为#!/bin/bash。利用vi等文本器编写Shell脚本的格式是固定的,如下:#!/bin/sh#commentsYour commands go here首行中的符号#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程 序。如果首行没有这句话,在执行脚本文件的时候,将会出现错误。后续的部分就是主程序,Shell脚本像高级语言一样,也有变量赋值,也有控制语句。除第 一行外,以#开头的行就是注释行,直到此行的结束。如果一行未完成,可以在行尾加上“,这个符号表明下一行与此行会合并为同一行。完毕,将脚本存盘为filename.sh,文件名后缀sh表明这是一个Bash脚本文件。执行脚本的时候,要先将脚本文件的属性改为可执行的:chmod +x filename.sh执行脚本的方法是:./filename.sh下面我们从经典的“hello world”入手,看一看最简单的Shell脚本的模样。#!/bin/sh#print hello world in the console windowa = “hello world“echo $aShell Script是一种弱类型语言,使用变量的时候无需首先声明其类型。新的变量会在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量。这些变量与环境变量不同,环境变量被存储在另一内存区,叫做用户环境区,这块内存中的变量可以被子进程访问。变量赋值的方式是:variable_name = variable_value如果对一个已经有值的变量赋值,新值将取代旧值。取值的时候要在变量名前加$,$variable_name可以在引号中使用,这一点和其他高级语言是明显不同的。如果出现混淆的情况,可以使用花括号来区分,例如:echo “Hi, $as“就不会输出“Hi, hello worlds”,而是输出“Hi,”。这是因为Shell把$as当成一个变量,而$as未被赋值,其值为空。正确的方法是:echo “Hi, ${a}s“单引号中的变量不会进行变量替换操作。 关于变量,还需要知道几个与其相关的Linux命令。env用于显示用户环境区中的变量及其取值;set用于显示本地数据区和用户环境区中的变量及其取值;unset用于删除指定变量当前的取值,该值将被指定为NULL;export命令用于将本地数据区中的变量转移到用户环境区。下面我们来看一个更复杂的例子,结合这个例子,我们来讲述Shell Script的语法。 1 #!/bin/bash 2 # we have less than 3 arguments. Print the help text: 3 if ; then 4 cat《《HELP 5 ren -- renames a number of files using sed regular expressions 6 7 USAGE: ren ’regexp’ ’replacement’ files 8 EXAMPLE: rename all *.HTM files in *.html: 9 ren ’HTM$’ ’html’ *.HTM10 11 HELP12 exit 013 fi14 OLD=“$1“15 NEW=“$2“16 # The shift command removes one argument from the list of17 # command line arguments.18 shift19 shift20 # $* contains now all the files:21 for file in $*; do22 if ; then23 newfile=`echo “$file“ | sed “s/${OLD}/${NEW}/g“`24 if ; then25 echo “ERROR: $newfile exists already“26 else27 echo “renaming $file to $newfile “28 mv “$file“ “$newfile“29 fi30 fi31 done我们从头来看,前面两行上一个例子中已经解释过了,从第三行开始,有新的内容。if语句和其他编程语言相似,都是流程控制语句。它的语法是:if …; then…elif …; then…else…fi与其他语言不同,Shell Script中if语句的条件部分要以分号来分隔。第三行中的表示条件测试,常用的条件测试有下面几种: 判断$file是否是一个文件 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于 判断$file是否存在且有可执行权限,同样-r测试文件可读性 判断变量$a是否有值,测试空串用-z 判断$a和$b的取值是否相等 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。$#表示包括$0在内的命令行参数的个数。在Shell中,脚本名称本身是$0,剩下的依次是$0、$1、$2…、${10}、${11},等等。$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。现在我们明白第三行的含义是如果脚本文件的参数少于三个,则执行if和fi语句之间 的内容。然后,从第四行到第十一行之间的内容在Shell Script编程中被称为Here文档,Here文档用于将多行文本传递给某一命令。Here文档的格式是以《《开始,后跟一个字符串,在 Here文档结束的时候,这个字符串同样也要出现,表示文档结束。在本例中,Here文档被输出给cat命令,也即将文档内容打印在屏幕上,起到显示帮助 信息的作用。第十二行的exit是Linux的命令,表示退出当前进程。在Shell脚本中可以使用所有的Linux命令,利用上面的cat和exit,从一方面来说,熟练使用Linux命令也可以大大减少Shell脚本的长度。十四、十五两句是赋值语句,分别将第一和第二参数赋值给变量OLD和NEW。紧接下来的两句是注释,注释下面的两条shift的作用是将参数列表中的第一个和第二个参数删除,后面的参数依次变为新的第一和第二参数,注意参数列表原本也不包括$0。然后,自二十一行到三十一行是一个循环语句。Shell Script中的循环有下面几种格式:while …; do…donefor var in …; do…donefor (( cond1; cond2; cond3 )) do…doneuntil …; do…done在上面这些循环中,也可以使用类似C语言中的break和continue语句中断 当前的循环操作。第二十一行的循环是将参数列表中的参数一个一个地放入变量file中。然后进入循环,判断file是否为一个文件,如果是文件的话,则用 sed命令搜索和生成新的文件名。sed基本上可以看成一个查找替换程序,从标准输入,例如管道读入文本,并将结果输出到标准输出,sed使用正则表达式 进行搜索。在第二十三行中,backtick(`)的作用是取出两个backtick之间的命令输出结果,在这里,也就是将结果取出赋给变量 newfile。此后,判断newfile是否已经存在,否则就把file改成newfile。这样我们就明白这个脚本的作用了,Shell Script编写的其他脚本与此相似,只不过是语法和用法稍有不同而已。通过这个例子我们明白了Shell Script的编写规则,但还有几件事情需要讲述一下。第一个,除了if语句之外,Shell Script中也有类似C语言中多分支结构的case语句,它的语法是:case var inpattern 1 )… ;;pattern 2 )… ;;*)… ;;esac我们再就下面一个例子,看看case语句的用法。while getopts vc: OPTIONdocase $OPTION inc) COPIES=$OPTARG ehco “$COPIES“;;v) echo “suyang“;;\?) exit 1;;esacdone上面的getopts类似于C语言提供的函数getopts,在Shell Script中,getopts经常和while语句联合起来使用。getopts的语法如下:getopts option_string variableoption_string中包含一串单字符选项,若getopts在命令行参数中 发现了连字符,那么它会将连字符之后的字符与option_string进行比较,若匹配成功,则把变量variable的值设为该选项,若无匹配,则把 变量的值设为?。有时候,选项还会带一个值,例如-c5等,这时要在option_string中该选项字母后面加上一个冒号,getopts发现冒号 后,会读取该值,然后将该值放入特殊变量OPTARG中。这个命令比较复杂,如有需要,读者可以详细参阅Shell编写的相关资料。上面这个循环的作用就是依次取出脚本名称后面的选项,进行处理,如果输入了非法选项,则进入“?指定的部分,退出脚本程序。第二个,Bash提供了一种用于交互式应用的扩展select,用户可以从一组不同的值中进行选择。其语法如下:select var in …; dobreak;done例如,下面这段程序的输出是:#!/bin/bashecho “Your choice?“select var in “a“ “b“ “c“; dobreakdoneecho $var----------------------------Your choice?1) a2) b3) c第三,Shell Script中也可以使用自定义的函数,其语法形式如下:functionname(){…}例如我们可以把上面第二个例子中第四到第十二行放入一个名为help函数体内,以后每次调用的时候直接写help即可。函数中处理函数调用参数的方法是,直接用上面讲过的$1、$2来分别表示第一、第二个参数,用$*表示参数列表。第四,我们也可以在Shell下调试Shell Script脚本,当然最简单的方法就是用echo输出查看变量取值了。Bash也提供了真正的调试方法,就是执行脚本的时候用-x参数。sh ?x filename.sh这会执行脚本并显示脚本中所有变量的取值,也可以使用参数-n,它并不执行脚本,只是返回所有的语法错误。

如何编写一个shell脚本

如何编写一个shell脚本本文结合大量实例阐述如何编写一个shell脚本。  为什么要进行shell编程  在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。  下面,让我们一起来看看shell是如何工作的:  建立一个脚本  Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash的大姐,bourne shell中运行)。  如同其他语言一样,通过我们使用任意一种文字器,比如nedit、kedit、emacs、vi  等来编写我们的shell程序。  程序必须以下面的行开始(必须方在文件的第一行):  #!/bin/sh  符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。  当好脚本时,如果要执行该脚本,还必须使其可执行。  要使脚本可执行:  chmod +x filename   然后,您可以通过输入: ./filename 来执行您的脚本。  注释  在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。  变量  在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:   变量名=值  取出变量值可以加一个美元符号($)在变量前面:   #!/bin/sh  #对变量赋值:  a=“hello world“  # 现在打印变量a的内容:  echo “A is:“  echo $a  在您的器中输入以上内容,然后将其保存为一个文件first。之后执行chmod +x first   使其可执行,最后输入./first执行该脚本。  这个脚本将会输出:  A is:  hello world  有时候变量名很容易与其他文字混淆,比如:  num=2  echo “this is the $numnd“  这并不会打印出“this is the 2nd“,而仅仅打印“this is the “,因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:   num=2  echo “this is the ${num}nd“  这将打印: this is the 2nd   有许多变量是系统自动设定的,这将在后面使用这些变量时进行讨论。  如果您需要处理数学表达式,那么您需要使用诸如expr等程序(见下面)。  除了一般的仅在程序内有效的shell变量以外,还有环境变量。由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。   Shell命令和流程控制  在shell脚本中可以使用三类命令:  1)Unix 命令:  虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。  常用命令语法及功能  echo “some text“: 将文字内容打印在屏幕上  ls: 文件列表  wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数  cp sourcefile destfile: 文件拷贝  mv oldname newname : 重命名文件或移动文件  rm file: 删除文件  grep ’pattern’ file: 在文件内搜索字符串比如:grep ’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: 进行数学运算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 : 打印文本文件末尾几行  sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus 替换为 LinuxFocus :cat text.file | sed ’s/linuxfocus/LinuxFocus/’ 》 newtext.file  awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, ’{print $1 “,“ $3 }’这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: 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命令的输入。当然您可以使用多个命令。  重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。  》 写入文件并覆盖旧文件  》》 加到文件的尾部,保留旧文件内容。  反短斜线  使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。  命令:   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`  3) 流程控制  “if“ 表达式 如果条件为真则执行then后面的部分:   if ....; then    ....  elif ....; then    ....  else    ....  fi  大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…  通常用“ “来表示条件测试。注意这里的空格很重要。要确保方括号的空格。    :判断是否是一个文件   :判断/bin/ls是否存在并有可执行权限   :判断$var变量是否有值   :判断$a和$b是否相等  执行man test可以查看所有测试表达式可以比较和判断的类型。  直接执行以下脚本:   #!/bin/sh  if ; 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语言的朋友可能会很喜欢下面的表达式:   && echo “This computer uses shadow passwors“  这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)在shell编程中也是可用的。这里有个例子: #!/bin/shmailfolder=/var/spool/mail/james’ ’{ echo “Can not read $mailfolder“ ; exit 1; }echo “$mailfolder has mail from:“grep “^From “ $mailfolder  该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的“From“ 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令: -打印错误信息-退出程序   我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。  不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。  case表达式可以用来匹配一个给定的字符串,而不是数字。 case ... in...) do something here ;;esac  让我们看一个例子。 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/shftype=`file “$1“`case “$ftype“ in“$1: Zip archive“*)  unzip “$1“ ;;“$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.zip   select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。 select var in ... ; do breakdone.... now $var can be used ....下面是一个例子:#!/bin/shecho “What is your favourite OS?“select var in “Linux“ “Gnu Hurd“ “Free BSD“ “Other“; do    breakdoneecho “You have selected $var“下面是该脚本运行的结果: What is your favourite OS?1) Linux2) Gnu Hurd3) Free BSD4) Other#? 1You have selected Linux您也可以在shell中使用如下的loop表达式:while ...; do....donewhile-loop 将运行直到表达式测试为真。will run while the expression that we test for is true. 关键字“break“ 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量: for var in ....; do ....done在下面的例子中,将分别打印ABC到屏幕上: #!/bin/shfor var in A B C ; do echo “var is $var“done下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:#!/bin/sh# list a content summary of a number of RPM packages# USAGE: showrpm rpmfile1 rpmfile2 ...# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpmfor rpmpackage in $*; do if ;then  echo “=============== $rpmpackage ==============“  rpm -qi -p $rpmpackage else  echo “ERROR: cannot read file $rpmpackage“ fidone这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm 此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm. 引号在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg 和tux.jpg。#!/bin/shecho *.jpg这将打印出“mail.jpg tux.jpg“的结果。引号 (单引号和双引号) 将防止这种通配符扩展: #!/bin/shecho “*.jpg“echo ’*.jpg’这将打印“*.jpg“ 两次。 单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。 #!/bin/shecho $SHELLecho “$SHELL“echo ’$SHELL’运行结果为: /bin/bash/bin/bash$SHELL最后,还有一种防止这种扩展的方法,那就是使用转义字符——反斜杆: echo *.jpgecho $SHELL这将输出:*.jpg$SHELLHere documents当要将几行文字传递给一个命令时,here documents(译者注:目前还没有见到过对该词适合的翻译)一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个here documents就不必用echo函数一行行输出。 一个 “Here document“ 以 《《 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助: #!/bin/sh# we have less than 3 arguments. Print the help text:if ; thencat 《《HELPren -- renames a number of files using sed regular expressionsUSAGE: ren ’regexp’ ’replacement’ files...EXAMPLE: rename all *.HTM files in *.html: ren ’HTM$’ ’html’ *.HTMHELP exit 0fiOLD=“$1“NEW=“$2“# The shift command removes one argument from the list of# command line arguments.shiftshift# $* contains now all the files:for file in $*; do  if ; then   newfile=`echo “$file“ | sed “s/${OLD}/${NEW}/g“`   if ; then    echo “ERROR: $newfile exists already“   else    echo “renaming $file to $newfile ...“    mv “$file“ “$newfile“   fi  fidone这是一个复杂一些的例子。让我们详细讨论一下。第一个if表达式判断输入命令行参数是否小于3个 (特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。 如果输入参数等于或大于3个,我们就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用shift命令将第一个和第二个参数从参数列表中删除,这样原来的第三个参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。接着我们判断该文件是否存在,如果存在则通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了我们的目的:得到了旧文件名和新文件名。然后使用mv命令进行重命名。函数如果您写了一些稍微复杂一些的程序,您就会发现在程序中可能在几个地方使用了相同的代码,并且您也会发现,如果我们使用了函数,会方便很多。一个函数是这个样子的: functionname(){# inside the body $1 is the first argument given to the function# $2 the second ...body}您需要在每个程序的开始对函数进行声明。下面是一个叫做xtitlebar的脚本,使用这个脚本您可以改变终端窗口的名称。这里使用了一个叫做help的函数。正如您可以看到的那样,这个定义的函数被使用了两次。 #!/bin/sh# vim: set sw=4 ts=4 et:help(){  cat 《《HELPxtitlebar -- change the name of an xterm, gnome-terminal or kde konsoleUSAGE: xtitlebar “string_for_titelbar“OPTIONS: -h help textEXAMPLE: xtitlebar “cvs“HELP  exit 0}# in case of error or if -h is given we call the function help: && help && help# send the escape sequence to change the xterm titelbar:echo -e “33]0;$107“ #  在脚本中提供帮助是一种很好的编程习惯,这样方便其他用户(和您)使用和理解脚本。  命令行参数  我们已经见过$* 和 $1, $2 ... $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。   有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无遗是一个不错的方法。 #!/bin/shhelp(){ cat 《《HELPThis is a generic command line parser demo.USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2HELP exit 0}while ; docase $1 in  -h) help;shift 1;; # function help is called  -f) opt_f=1;shift 1;; # variable opt_f is set  -l) opt_l=$2;shift 2;; # -l takes an argument -》 shift by 2  --) shift;break;; # end of options  -*) echo “error: no such option $1. -h for help“;exit 1;;  *) break;;esacdoneecho “opt_f is $opt_f“echo “opt_l is $opt_l“echo “first arg is $1“echo “2nd arg is $2“您可以这样运行该脚本:cmdparser -l hello -f -- -somefile1 somefile2返回的结果是:opt_f is 1opt_l is hellofirst arg is -somefile12nd arg is somefile2  这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数。   实例  一般编程步骤  现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令: cp framework.sh myscript然后再插入自己的函数。  让我们再看两个例子:   二进制到十进制的转换  脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子: #!/bin/sh# vim: set sw=4 ts=4 et:help(){ cat 《《HELPb2h -- convert binary to decimalUSAGE: b2h binarynumOPTIONS: -h help textEXAMPLE: b2h 111010will return 58HELP exit 0}error(){  # print an error and exit  echo “$1“  exit 1}lastchar(){  # return the last character of a string in $rval  if ; then    # empty string    rval=““    return  fi  # wc puts some space behind the output this is why we need sed:  numofchar=`echo -n “$1“ | wc -c | sed ’s/ //g’ `  # now cut out the last char  rval=`echo -n “$1“ | cut -b $numofchar`}chop(){  # remove the last character in string and return it in $rval  if ; then    # empty string    rval=““    return  fi  # wc puts some space behind the output this is why we need sed:  numofchar=`echo -n “$1“ | wc -c | sed ’s/ //g’ `  if ; then    # only one char in string    rval=““    return  fi  numofcharminus1=`expr $numofchar “-“ 1`  # now cut all but the last char:  rval=`echo -n “$1“ | cut -b 0-${numofcharminus1}`}while ; docase $1 in  -h) help;shift 1;; # function help is called  --) shift;break;; # end of options  -*) error “error: no such option $1. -h for help“;;  *) break;;esacdone# The main programsum=0weight=1# one arg must be given: && helpbinnum=“$1“binnumorig=“$1“while ; do  lastchar “$binnum“  if ; then    sum=`expr “$weight“ “+“ “$sum“`  fi  # remove the last position in $binnum  chop “$binnum“  binnum=“$rval“  weight=`expr “$weight“ “*“ 2`doneecho “binary $binnumorig is decimal $sum“#  该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制“10“可以这样转换成十进制:   0 * 1 + 1 * 2 = 2   为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。  文件循环程序  或许您是想将所有发出的邮件保存到一个文件中的人们中的一员,但是在过了几个月以后,这个文件可能会变得很大以至于使对该文件的访问速度变慢。下面的脚本rotatefile 可以解决这个问题。这个脚本可以重命名邮件保存文件(假设为outmail)为outmail.1,而对于outmail.1就变成了outmail.2 等等等等... #!/bin/sh# vim: set sw=4 ts=4 et:ver=“0.1“help(){  cat 《《HELProtatefile -- rotate the file nameUSAGE: rotatefile filenameOPTIONS: -h help textEXAMPLE: rotatefile outThis will e.g rename out.2 to out.3, out.1 to out.2, out to out.1and create an empty out-fileThe max number is 10version $verHELP  exit 0}error(){  echo “$1“  exit 1}while ; docase $1 in  -h) help;shift 1;;  --) break;;  -*) echo “error: no such option $1. -h for help“;exit 1;;  *) break;;esacdone# input check:if ; thenerror “ERROR: you must specify a file, use -h for help“fifilen=“$1“# rename any .1 , .2 etc file:for n in 9 8 7 6 5 4 3 2 1; do  if ; then    p=`expr $n + 1`    echo “mv $filen.$n $filen.$p“    mv $filen.$n $filen.$p  fidone# rename the original file:if ; then  echo “mv $filen $filen.1“  mv $filen $filen.1fiecho touch $filentouch $filen  这个脚本是如何工作的呢?在检测用户提供了一个文件名以后,我们进行一个9到1的循环。文件9被命名为10,文件8重命名为9等等。循环完成之后,我们将原始文件命名为文件1同时建立一个与原始文件同名的空文件。   调试  最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费80%的时间来调试程序的原因。Shell程序的好处在于不需要重新编译,插入一个echo命令也不需要多少时间。  shell也有一个真实的调试模式。如果在脚本“strangescript“ 中有错误,您可以这样来进行调试:   sh -x strangescript  这将执行该脚本并显示所有变量的值。  shell还有一个不需要执行脚本只是检查语法的模式。可以这样使用:   sh -n your_script  这将返回所有语法错误。

三个简单Linux的shell脚本程序编写

shell脚本和windows平台上的bat批处理是一样的,简化用户处理重复动作的操作,shell脚本由shell命令组成。工具/原料vimubuntu方法/步骤新建一个文件shell脚本一般用×.sh作为后缀当然勇气他的也可以。打开终端输入touchfirst.sh新建一个名为first的shell脚本。编写一个简单的linuxshell脚本使用vimfirst.sh也可以用其他的文本器,推荐使用vim使用命令vimfirst.sh打开,输入i进入模式。编写一个简单的linuxshell脚本我们写入一个简单的shell脚本,注意第一行的代码解释器的指定,这里使用的是/bin/bash/解释器也可用其他的根据个人情况自己选择。脚本解释:echo//显示一串字符并自动换行readNAME//从屏幕获取一段字符,并赋予NAME$NAME//取NAME变量的值#//只用一个#表示注释文本编写一个简单的linuxshell脚本文件写完后按下esc键退出插入模式,接着输入:wq保存文本并退出文本。编写一个简单的linuxshell脚本输入sh+脚本名称运行脚本,或给文件可运行权限chmod+x然后输入./first.sh运行脚本。

shell编程,求高手帮助,小弟感激不尽!!!小弟分不多,只能给这么多先

#!/bin/bashfor((i=1;i《=80;i++))do if then a=“少年“ elif then a=“青年“ elif then a=“中年“ elif then a=“老年“ fidonefor((;;))do read -p “请输入年龄:“ age# 输入end结束程序 if then break fi awk ’BEGINif(’$age’ in a)exit 0;else exit 1;}’ if then echo $ else echo “输入年龄错误,必须为1-80整数“ fidone已经过测试,结果如下请输入年龄:1少年请输入年龄:2少年请输入年龄:21青年请输入年龄:31中年请输入年龄:51老年请输入年龄:80老年请输入年龄:81输入年龄错误,必须为1-80整数请输入年龄:2.1输入年龄错误,必须为1-80整数请输入年龄:q输入年龄错误,必须为1-80整数请输入年龄:0输入年龄错误,必须为1-80整数请输入年龄:end

SHELL编程 求大神指教

ls -l /homecat a.txtmore a.txtmkdir newdirls rmdir newdirlscd ../cd ~mkdir testchmod 777 testls -lchmod 644 testls -l这都是最基本的你一个个试试不就行了,想知道命令格式 比如chmodchmod --help看一下就是了

shell脚本编程

tput cup 12 4; echo “Add Another? (y)es or (q)quit: “ 当你输入 y 或 q 的时候,然后就执行下而的语句:tput cup 4 18; read phonenum 这句就将你输入的 y 或 q 赋给变量phonenum接下来的就是判断你输的是什么,要是 q 话就退出,这里的退出不是退出while循环,只是退出tput cup 12 4; echo “Add Another? (y)es or (q)quit: “ 这一步,即不再输其它的.如果要退出while循环的话要加break ,如果说是 y 的话,它仅仅是给phonenum 赋了个变量,什么也没有做,我看后面的也没有再提到phonenum这个变量,我想一定还有其它的代码吧!然后就接着执行下面的tput cup 5 18; read lnametput cup 6 18; read fnametput cup 7 18; read midinittput cup 8 18; read deptnotput cup 9 18; read jobtitletput cup 10 18; read datehired#Check to see if last name is not a blank before you write to diskif thenecho “$phonenum:$lname:$fname:$midinit:$deptno:$jobtitle:$datehired“ 》》 $phonefilefi还有下面的一段代码:tput cup 12 33; read looptestif thenclear; exitfi就你发表的这一些程序来看,这里根本不起作用,因为在while之前你就已定义了looptest=y 所以你在这再加上这一句是没有用的,因为looptest就等于y 永远不等于q 然后当你的while没有退出来的时候,它就会不停的循环下去,因为ooptest=y while do 这一句其实就等于 while : 永远为真,不停的循环下去!以上为鄙人愚见,鄙人也是名shell初学者,有错误之处还请指出,谅解!谢谢!

shell编程

1,可以自己看很简单的。2,你输入 cd ~/,到你的默认目录cd /到根目录如果有 name文件 cd /na 按TAB实现自动补全alias clr=“clear“ clr 就实现清屏了4, cat -n filenam 实现行号显示

linux 怎么进入shell编程模式

linux 可以通过vi或vim命令进入shell编程模式,操作步骤如下:

1、首先在linux终端中创建一个shell脚本文件,例如shell.sh:

2、使用vi shell.sh命令进入文件模式即为shell编程模式,如图所示:

3、进入模式后在文本文件内输入#!/bin/bash  echo “Hello World!“ ,如下图:

4、输入完成后:wq保存内容,回到了终端。

5、在终端输入sh shell.sh就执行了脚本。

Shell的简单编程

$cat test.sh#!/bin/bashif ;then echo “$1是字符设备文件“else test -e $1 || echo “This file is not exist“fiif test -d $2;then echo “$2是目录文件“ for file in `ls $2/*.c` do ls -l $file doneelse test -e $2 || echo “This file is not exist“fi$./test.sh ddd.c testtest是目录文件-rw-rw-r--. 1 flycat flycat 0 1月 1 21:20 test/aaa.c-rw-rw-r--. 1 flycat flycat 0 1月 1 21:20 test/bbb.c-rw-rw-r--. 1 flycat flycat 0 1月 1 21:20 test/ccc.c



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有