shell的基本语法以及shell进度条的编写

来源:互联网 发布:梯形螺纹编程实例 编辑:程序博客网 时间:2024/06/03 01:41

一、shell提示符及其环境


提示符:$

环境:LinuxUnixDos等等

Shell其实就是一个解释执行命令的程序,所谓shell编程其实就是用一定的语法将各种基本的命令组合起来,让shell程序去解释执行。


#!/bin/bash   //bash脚本第一句都是这个,他会让系统指定以bash来解释这个脚本

            //shell脚本注释符号


二、shell语法


1、条件测试

命令 test 或 [ 可以测试一个条件是否成立。shell脚本中与C语言的逻辑刚好相反,0表示测试结果为真,1表示测试结果为假。

例如测试两个数的大小关系:


左方括号  [  是一个命令的名字,传给命令的各参数之间应该用空格隔开,如,$VAR、-gt、3、] 是 [ 命令的四个参数,它们之间必须用空格隔开。命令  test  或  [  的参数形式是相同的,只不过  test  命令不需要]参数。  -eq  (等于)  - ne  (不等于)  -lt  (小于)  -le  (小于等于)  -gt  (大于)  -ge  (大于等于)


①带与、或、非的测试命令

[ ! EXPR ] : EXPR可以是上表中的任意一种测试条件,!表示逻辑反
[ EXPR1 -a EXPR2 ] :EXPR1和EXPR2可以是上表中的任意一种测试条件, -a   表示逻辑  与 
[ EXPR1 -o EXPR2 ] :EXPR1和EXPR2可以是上表中的任意一种测试条件,  -o  表示逻辑  或

② if / then / elif / else / fi

在  Shell  中用  if、then、elif、else、fi  这几条命令实现分支控制。这种流程控制语句本质上也是由若干条  Shell  命令组成的 。如果两条命令写在同一行则需要用;号隔开,一行只写一条命令就不需要写;号了,另外,  then  后面有换行,但这条命令没写完,  Shell  会自动续行,把下一行接在  then  后面当作一条命令处理。和  [  命令一样,要注意命令和各参数之间必须用空格隔开。  if  命令的参数组成一条子命令,如果该子命令的  Exit Status  为0(表示真),则执行  then  后面的子命令,如果  Exit Status  为0(表示假),则执行  elif、else  或者  fi  后面的子命令。  if  后面的子命令通常是测试命令,但也可以是其它命令。  Shell  脚本没有  { }  括号,所以用  fi  表示  if  语句块的结束。


结构一:                                                                           结构二:

                                

例如:




③case  /  esac

case命令可类⽐比C语言的  switch / case  语句,  esac  表示  case  语句块的结束。C语言的  case  只能匹配整型或字符型常量表达式,而  Shell  脚本的  case  可以匹配字符串和  Wildcard  ,每个匹配分支可以有若干条命令,末尾必须以;;结束,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳 到  esac  之后,不需要像C语言一样用  break  跳出。

结构:                                                              例如:

                       

  read  命令的作用是等待用户输入一行字符串,将该字符串存到一个  Shell  变量中。

④And  和  Or

Shell  还提供了  &&  和  ||  语法,和C语言类似,具有Short-circuit特性,&&  相当于  “if...then...”,而  ||  相当于  “if not...then...”。  &&  和  ||  用于连接两个命令,而上面讲的  -a
  和  -o  仅用于在测试表达式中连接两个测试条件,两种写法等价,但是有区别!!

结构:

command1 && command2

command1 || command2


2、循环语句


for循环

写法①:                                                            写法②:

           


while循环


结构:                             示例:

       


until循环(类似C语言的do  while)

结构:                                示例:

              

从循环中退出: breakcontinue命令

  break 立即退出循环

  continue 忽略本循环中的其他命令,继续下一下循环

3、函数

和C语言类似,Shell中也有函数的概念,但是函数定义中没有返回值也没有参数列表。例如::注意函数体的左花括号  {  和后面的命令之间必须有空格或换行,如果将最后一条命令和右花括号  }  写在同一行,命令末尾必须有   ;号。


在定义  foo()  函数时并不执行函数体中的命令,就像定义变量一样,只是给  foo  这个名字一个定义,,到后面调用  foo  函数的时候(注意Shell中的函数调用不写括号)才执行函数体中的命令。Shell脚本中的函数必须先定义后调用,一般把函数定义都写在脚本的前面,把函数调用和其它命令写在脚本的最后(类似C语言中的  main  函数,这才是整个脚本实际开始执行命令的地方)。


Shell函数没有参数列表并不表示不能传参数,事实上,函数就像是迷你脚本,调用函数时可以传任意个参数,在函数内同样是用$0、$1、$2等变量来提取参数,函数中的位置参数相当于函数的局部变量,改变这些变量并不会影响函数外面的$0、$1、$2等变量。函数中可以用  return  命令返回,如果  return  后面跟一个数字则表示函数的Exit Status。


结构:                                                         示例:

                   


4、数组

          bash   支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
定义数组:
在Shell中,用括号来表示数组,数组元素用 “ 空格 ” 符号分割开。定义数组的一般形式为:       array_name=(value1 ... valuen)

示例:


还可以单独定义数组的各个分量:

示例:


可以不使用连续的下标,而且下标的范围没有限制。

读取数组
读取数组元素值的一般格式是:     ${array_name[index]}
使用  @   或  *   可以获取数组中的所有元素。

示例:


获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同。

示例:



5、shell程序的调试

 使用-x进行跟踪执行,执行并显示每一条指令。


6、比较运算符

 

 文件比较运算符

  -e filename        如果 filename 存在,则为真            [ -e /var/log/syslog ]

  -d filename       如果 filename 为目录,则为真       [ -d /tmp/mydir ]

  -f filename        如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]

  -L filename        如果 filename 为符号链接,则为真   [ -L /usr/bin/grep ]

  -r filename          如果 filename 可读,则为真              [ -r /var/log/syslog ]

  -w filename        如果 filename 可写,则为真            [ -w /var/mytmp.txt ]

  -x filename         如果 filename 可执行,则为真           [ -L /usr/bin/grep ]

 

  filename1 -nt filename2 如果 filename1  filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]

  filename1 -ot filename2 如果 filename1  filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

 

 字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

  -z string               如果 string 长度为零,则为真          [ -z "$myvar" ]

  -n string              如果 string 长度非零,则为真               [ -n "$myvar" ]

  string1 = string2 如果 string1  string2 相同,则为真 [ "$myvar" = "one two three" ]

  string1 != string2 如果 string1  string2 不同,则为真 [ "$myvar" != "one two three" ]


三、进度条的编写


代码:


运行图:





原创粉丝点击