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 #