Linux之Shell脚本编程(二)

时间:2022-07-13 15:35:58

上节回顾

  上一篇博文中,主要介绍了Shell脚本编程的背景,怎样创建人生中第一个Shell脚本以及Shell变量等内容。接下来将接着介绍介绍Shell编程,主要是围绕着Shell运算、流程控制语句、自定义函数以及脚本调试等方面展开。

 

 

运算符

  例:

  num1=11

  num2=22

  sum=$num1+$num2

  echo $sum

 

  格式 :expr m + n 或$((m+n)) 注意expr运算符间要有空格

  expr命令:对整数型变量进行算术运算   (注意:运算符前后必须要有空格) 

    expr 3 + 5   
    expr 3 – 5

    echo `expr 10 / 3`            

    10/3的结果为3,因为是取整
    expr  3 \* 10     # \ 是转义符

  

  例:计算(2 +3 )×4 的值

  1 .分步计算
         S=`expr 2 + 3`
         expr $S \* 4

  2.一步完成计算

         expr `expr 2 + 3` \* 4

         S=`expr \`expr 2 + 3\`  \* 4`

         echo $S

         或

          echo $(((2 + 3) * 4))

  $()与${}的区别

  $( )的用途和反引号``一样,用来表示优先执行的命令

    eg:echo $(ls a.txt)

  ${ } 就是取变量了  eg:echo ${PATH}

  $((运算内容)) 适用于数值运算

    eg: echo $((3+1*4))

 

内置test命令

  内置test命令常用操作符号[]表示,将表达式写在[]中,如下:

    [ expression ] 

  或者:

    test expression

  注意:expression首尾都有个空格

    eg: [  ] ;echo $?

  测试范围:整数、字符串、文件

  表达式的结果为真,则test的返回值为0,否则为非0。当表达式的结果为真时,则变量$?的值就为0,否则为非0

 

字符串测试:

  test  str1 == str2       测试字符串是否相等 

  test  str1 != str2      测试字符串是否不相等

  test  str1                 测试字符串是否不为空,不为空,true,false

  test  -n str1          测试字符串是否不为空

  test  -z  str1         测试字符串是否为空

    eg:

      name=linzhiling

      [ “$name” ] && echo ok

      ; 命令连接符号

      && 逻辑与 条件满足,才执行后面的语句

      [ -z “$name” ] && echo  invalid  || echo ok

      ||  逻辑或,条件不满足,才执行后面的语句

      test “$name” == ”yangmi” && echo ok  || echo  invalid

 

整数测试:

  test   int1 -eq  int2    测试整数是否相等 equals
  test   int1 -ge  int2    测试int1是否>=int2
  test   int1 -gt  int2    测试int1是否>int2
  test   int1 -le  int2    测试int1是否<=int2
  test   int1 -lt  int2    测试int1是否<int2
  test   int1 -ne  int2    测试整数是否不相等

    eg:

      test 100 –gt 100

      test 100 –ge 100

  如下示例两个变量值的大小比较:

Linux之Shell脚本编程(二)

  -gt表示greater than大于的意思,-le表示less equal表示小于等于。

 

文件测试:

  test  -d  file      指定文件是否目录

  test  –e  file     文件是否存在 exists

  test  -f  file     指定文件是否常规文件

  test –L File     文件存在并且是一个符号链接 

  test  -r  file    指定文件是否可读

  test  -w  file    指定文件是否可写

  test  -x  file    指定文件是否可执行

 

    eg:

      test -d  install.log

      test –r install.log

      test –f xx.log ; echo $?

      [ -L service.soft  ] && echo “is a link”

      test -L /bin/sh ;echo $?

      [ -f /root ] && echo “yes” || echo “no”

 

多重条件测试:

  条件1 –a 条件2 逻辑与  两个都成立,则为真

  条件1 –o 条件2 逻辑或 只要有一个为真,则为真

  ! 条件                逻辑非    取反

  eg:

    num=520

    [ -n “$num” –a “$num” –ge 520 ] && echo “marry you” || echo “go on”

    age=20

    pathname=outlog

    [ ! -d“$ pathname”] &&  echo usable || echo  used

 

 

流程控制语句

if/else命令

  1, 单分支if条件语句

  if [ 条件判断式 ]

    then

      程序

  fi   

  或者

  if [ 条件判断式 ] ; then 

     程序

  fi

 

  eg:#!/bin/sh

  if  [ -x  /etc/rc.d/init.d/httpd ]

      then

      /etc/rc.d/init.d/httpd restart

  fi

 

  单分支条件语句需要注意几个点:

  if语句使用fi结尾,和一般语言使用大括号结尾不同。

  [ 条件判断式 ] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格

  then后面跟符号条件之后执行的程序,可以放在[]之后,用“;”分割,也可以换行写入,就不需要";"了。

  2,多分支if条件语句

  if [ 条件判断式1 ]

      then

          当条件判断式1成立时,执行程序1

  elif  [ 条件判断式2 ] 

      then      

          当条件判断式2成立时,执行程序2

  ...省略更多条件

  else

      当所有条件都不成立时,最后执行此程序

  fi

  示例:

  read -p "please input your name: " NAME

  eg:

  #!/bin/bash

  read -p "please input your name:"  NAME

  #echo  $NAME

  if [ “$NAME” == root ]

          then

                  echo "hello ${NAME},  welcome !"

          elif [ $NAME == tom ]

                  then

                          echo "hello ${NAME},  welcome !"

          else

                  echo "SB, get out here !"

  fi

 

case命令

  case命令是一个多分支的if/else命令,case变量的值用来匹配value1,value2,value3等等。匹配到后则执行跟在后面的命令直到遇到双分号为止(;;)case命令以esac作为终止符。

  格式

         CMD=$1

  case $CMD in

  start)

         echo "starting"

         ;;

  Stop)

         echo "stoping"

         ;;

  *)

         echo "Usage: {start|stop} “

  esac

 

for循环

  for循环命令用来在一个列表条目中执行有限次数的命令。比如,你可能会在一个姓名列表或文件列表中循环执行同个命令。for命令后紧跟一个自定义变量、一个关键字in和一个字符串列表(可以是变量)。第一次执行for循环时,字符串列表中的第一个字符串会赋值给自定义变量,然后执行循环命令,直到遇到done语句;第二次执行for循环时,会右推字符串列表中的第二个字符串给自定义变量,依次类推,直到字符串列表遍历完。

  第一种:

    for N in 1 2 3

    do

    echo $N

    done

  或

    for N in 1 2 3; do echo $N; done

  或

    for N in {1..3}; do echo $N; done

  第二种:

    for ((i = 0; i <= 5; i++))

    do

    echo "welcome $i times"

    done

  或

    for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done

 

while循环

  while命令根据紧跟其后的命令(command)来判断是否执行while循环,当command执行后的返回值(exit status)为0时,则执行while循环语句块,直到遇到done语句,然后再返回到while命令,判断command的返回值,当得打返回值为非0时,则终止while循环。

  第一种

    while expression

    do

    command

    …

    done

  练习:求1-10 各个数的平方和

Linux之Shell脚本编程(二)

  第二种:

Linux之Shell脚本编程(二)

 

自定义函数

  函数代表着一个或一组命令的集合,表示一个功能模块,常用于模块化编程。

  以下是关于函数的一些重要说明:                                 

    在shell中,函数必须先定义,再调用

    使用return value来获取函数的返回值

    函数在当前shell中执行,可以使用脚本中的变量。

  函数的格式如下:

    函数名()

    {

    命令1…..

    命令2….

    return 返回值变量

    }

 

    [ function ] funname [()]

    {

        action;

        [return int;]

    }

    function start()  / function start  / start()

   eg.

Linux之Shell脚本编程(二)

  注意:

  如果函数名后没有(),在函数名和{ 之间,必须要有空格以示区分。函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回值,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

 

 

 

脚本调试

 

  sh -x script  

  这将执行该脚本并显示所有变量的值。

 

  在shell脚本里添加  

  set -x  对部分脚本调试

  sh -n script

  不执行脚本只是检查语法的模式,将返回所有语法错误。

 

  sh –v script

  执行并显示脚本内容。