linux bash脚本编程

bash脚本语言是一种解释性语言,执行时通过解释器执行,不需要编译。

一、变量

        本地变量:使用格式为varname=值,本地变量的声明周期为整个脚本进程

        局部变量:使用格式为local varname=值,局部变量的声明周期为整个脚本进程

        环境变量:使用格式为export varname=值,作用域为当前shell进程及子进程。命令脚本在执行时,会启动shell的子进程,命令行中启动的脚本会继承当前的shell环境变量,系统自动执行脚本(非命令行启动)就需要自我定义环境变量

        位置变量:$1,$2...表示引用的参数

        shift:踢出参数  shift n:表示踢出n个参数

        特殊变量:$?保存了上一个命令执行的状态返回值(程序执行可能有两类返回值,一种是执行的状态返回值,一种是执行命令的返回值),程序状态返回代码:(0-255), 0:表示执行正确,1-255:都是错误的

        撤销变量:unset 变量名称         eg:unset A

        查看当前shell中的变量:set

        查看当前shell中的环境变量:printenv,env,export

        在原来的值后面补加一个值:

      ANIMALS=pig

      ANIMALS=$ANIMALS:gost

      执行结果:pig:gost

 

二、算术运算

        使用let命令做运算:let C=$A+$B

  $[算数运算表达式]:C=$[$A+$B]

  $((运算表达式)):  C=$(($A+$B))

  expr算数运算表达式,表达式中各操作及运算符之间要有空格,而且要使用反引号将命令引用(输入法切换到英文,波浪号键即为反引号键):

        C=`expr $A + $B`

 

三、条件测试

        条件测试类型:

        整数测试,字符测试,文件测试

       3种测试命令:

                          test 表达式                   eg: if test $A -eq $B;then echo "deng"; else echo "budeng"; fi

                          [ 表达式 ]                      eg: if [ $A -eq $B ];then echo "deng"; else echo "budeng"; fi

                          [[ 表达式 ]]              eg: if [[ $A -eq $B ]];then echo "deng"; else echo "budeng"; fi

                          注意:后两种表达式前后必须有空格

        数值测试:

    -eq:是否相等

    -ne:是否不等

    -ge:是否大于等于

    -le:是否小于等于

    -gt:是否大于

    -lt:是否小于

  字符串测试:

    =或==:是否等于

    >:是否大于

    <:是否小于

    !=:是否不等于

    =~:左侧字符串是否能够被右侧PATTERN所匹配  [[  ]]中使用

    -z "STRING":测试字符串是否为空,空则为真

    -n "STRING":测试字符串是否非空,不空则为真

    注意:用于字符串比较时用到的操作数都应该使用引号括起来

  文件测试:

     存在性测试:

        -a FILE:同下

        -e FILE:文件存在性测试,存在为真,否则为假

     存在性及类别测试:

        -b FILE:是否存在且为块设备文件

        -c FILE:是否存在且为字符设备文件

        -d FILE:是否存在且为目录文件

        -f FILE:是否存在且为普通文件

        -h FILE 或-L FILE:是否存在且为符号链接文件 

        -p FILE:是否存在且为命名管道文件

        -S FILE:是否存在且为套接字文件

      文件权限测试:

        -r FILE:是否存在且可读

        -w FILE:是否存在且可写

        -x FILE:是否存在且可执行

      文件特殊权限测试:

        -g FILE:是否存在且拥有sgid权限

        -u FILE:是否存在且拥有suid权限

        -k FILE:是否存在且拥有sticky权限

      文件大小测试:

        -s FILE:是否存在且非空

      文件是否打开:

        -t  fd:fd表示文件描述符是否已经打开且与某终端相关

 

      其它:

        -N FILE:文件自从上一次被读取之后是否被修改过

        -O FILE:当前有效用户是否为文件属主

        -G FILE:当前有效用户是否为文件属组

 

      双目测试:

        FILE1 -ef FILE2:FILE1与FILE2是否指向同一个设备上的相同inode

        FILE1 -nt FILE2:FILE1是否新于FILE2

        FILE1 -ot FILE2:FILE1是否旧与FILE2

        组合条件测试:

    逻辑运算:

        [  ]中使用:

         EXPRESSION1 -a EXPRESSION2:2个条件同时为真,则结果为真

         EXPRESSION1 -o EXPRESSION2:2个条件中其中一个条件为真,则结果为真

         ! EXPRESSION:条件为假时,则结果为真

        [[  ]]或[  ] ** [  ]中使用:  注:**为&&或||

         &&: 左右两边条件或命令同时为真,则结果为真

         ||:左右两边条件或命令其中一个为真时,则结果为真

         !:条件或命令为假时,则结果为真

      注:[  ]中使用小括号需要转义即\(\),[[  ]]则无需转义

四、条件判断控制结构

        单分支的if语句:

      if 判断条件; then

      statement1

      statement2

      fi

  双分支的if语句:

      if 判断条件; then

      statement1

      statement2

      else

      statement3

      statement4

      fi

  多分支的if语句

      if 判断条件;then

      statement1

      ...

      elif 判断条件;then

      statement2

      ...

      elif 判断条件;then

      statement3

      ...

      else

      statement4

      ...

      fi

 

五、case分支选择结构

        case $变量 in
        值1)命令 ;;
        ...
        值n)命令 ;;

        *)  默认命令;;
        esca

注意每个条件末尾都是两个分号。

        bash分支选择结构当中没有break,但是两个分号就代表break的含义。c语言中每个条件(case语句)后面不一定都要有break,如果没有break,则继续执行下面的条件的语句,即多个分支共用一组语句。如果你想在bash中像c语言那样多个条件共用一套语句,可以在分支末尾使用一个分号加一个and符号,eg:

                                   case $ans in

              y);&

              Y) echo "我也是";;

              n);&

              N) echo "sorry,跟你没什么好谈的";;

              esac

   除了 ;&结束语句以外,还有一种是 ;;& 来结束语句的用法。但是意义有所不同,;;&的用法是使得条件越来越精确

                                 eg:

                                     case $num in

               *)echo -n "中国";;&

                   03*)echo -n "河北省";;&

                        ??10)echo "邯郸市";;

                        ??11)echo "石家庄";;

                        ??17)echo "沧州市";;

                   07*)echo -n "江西省";;&

                        ??91)echo "南昌市";;

                        ??92)echo "九江市";;

                        ??97)echo "赣州市";;

               esac

 

六、循环控制结构

       for 变量 in 列表;do //形式1                     eg:for i in {1..20} ; do

              表达式                                                              echo $i

       done                                                                  done

 

       for ((expr1;expr2;expr3));do //形式2,近似于C语言

              表达式

       done

 

  while CONDTION;do

         表达式

  done

        进入循环,条件满足

        退出条件,条件不满足

       

  until CONDITION;do

         表达式

  done

        进入循环,条件不满足

        退出循环,条件满足

 

        在while,until , for循环结构中

      break:提前退出循环

      continue:提前进入下一轮循环

七、函数

        函数是实现结构化编程重要的思想,主要目的是实现代码重用

    定义一个函数:

      function FUNCNAME             //形式1

      {

              函数体

      }

 

      FUNCNAME()          //形式2,函数名紧跟小括号不能加空格

                        {

                    函数体

      }

 

      调用只需要使用函数名即可

      bash -x 脚本名 查看脚本执行的过程

    注意:函数的执行结果和函数的执行状态结果是不同的

      引用函数的执行结果:变量=`函数名`

      引用函数的状态结果:函数调用之后 echo $?

      脚本的执行状态结果取决于执行的最后一个命令

    自定义执行状态返回值 return #

 

你可能感兴趣的:(Linux)