天天看点

Shell Scripts基本知识

变量:    

    变量就是可变化的量,有名称的内存空间,shell 中把变量默认为 字符型

命名规则:

         1.只能包含字母、数字和下划线,并且不能以数字开头

         2.不能与关键字冲突

         3.尽量做到见名知义

引号:

     单引号:'        强引用

     双引号:"        弱引用 -- 可以实现变量替换      eg:  echo   $HOSTNAME "

     反引号: `        命令替换   <==>  $(command)    eg:  echo   " hello everone `ls  /tmp`"

变量引用:

    $VAR_NAME

    ${VAR_NAME}

    set VAR_NAME=value

    unset VAR_NAME

    变量事先声明:

  declare   [options]   VAR_NAME

       options:            -i : ×××                                  eg:  declare  -i   SUM=0

           -x :环境变量

           -a :数组

           -r :只读变量,值不能改变并且不能撤消

            命令行展开:

       ~:用户家目录

       ~USERNAME : 指定用户的家目录

     {}:类似多项式展开     eg:   #  mkdir  -p    /tmp/{lcok,date,kill/{fuck,this}}

      变量的种类:

    环境变量:  对当前shell及其子shell都有效   

            设定:    declaer   -x  VAR_NAME=value

                      expore   VAR_NAME=value

            取消:    unset  VAR-NAME

            显示环境变量:  export

                           printenv

    本地变量(局部变量):    作用域为当前shell(对父shell和子shell无效)

                              local NAME=....

    特殊变量:

          $? :引用上一条命令的执行状态返回值

               0 :成功

               1-255:失败,1 ,2,127 --&gt;系统预留

                                     readonly  :设定只读变量        eg: # readmonly  NAME=jerry

                        位置变量:   

       位置变量用于引用传递过来的参数: ${1} ,${2} ...${11}

bash如何实现命令展开:

      1.切片 :以space ,tab , enter分隔(词法分析)

      2.别名替换:命令行展开 ,$ ,{} ,()

      3. 可能需要重复进行1和2

      4. 实现重定向: &gt; ,&gt;&gt;  , <

      5. 执行命令

   阻止展开:

       转义符:\ 

       单引号:' '               

       ;:分号能实现语句的分割

      命令的逻辑关系:

    与关系 : 双目操作符

        & :位与      0011011    01010101

        && :逻辑与       [ $A  -eq  0 ]  &&  echo "Hello body !"

      或关系 :  | : 位或

                 || : 逻辑或

      非关系 :            !                          条件测试:

      test  expression                        

      [ expression ]            -->  expression前后有空格  

      ` expession `           -->;关键字

                      条件测试类型:

     整数比较:    [   ]

          双目操作: num1  操作符 num2

              -eq : =     eg:  [ 2 -eq 3 ]  ,` 2 -eq 3 `

              -gt : &gt;   大于

              -lt  : <    小于

              -ge : >=

              -le : <=

              -ne : !=

     字符串测试 :  [[   ]]     需要用 -->双中括号   eg: [[ string1 <  string2 ]]

                  >

                  <

                  >=

                  <=

                  !=

                  == 

       单目: 

             [ -z  "abc" ]  :测试string是否为空,为空则真,否则为假 

             [  -n string  ]:            为空则假,否则为真

    文件测试 : 

             -e  /path/to    : 测试文件是否存在         eg:    [ -e  /etc/inittab ]

             -f  /path/to   : 为普通文件

             -d  /path/to   :  测试目录是否存在

             -r             :读权限

             -w           :写权限

             -x            :可执行权限 算术运算:

        $(( expession ))

        $[expression]

     常用方法:

          1.赋值给变量

          2.使用echo 回显

                                                                      SUM=$(($A+$B))

let VAR_NAME=NUM1 OP NUM2

                                    echo VAR_NAME

                    expr num1 op num2         

                            + :

                            -

                            *

                            /

                            %

  连接两个条件:

        -a :与关系

        -o : 或关系

       !  : 非关系

      if :

       if   测试条件 ;then

             statement1;                    ...

             else    

              statement2;

                   ...

             fi

                           eg:     if  [ SUM  -eq  0 ] ; then                                                                      echo "hello  world !"

                                                     else     echo "No,sorry!"                                                      fi

循环执行: for

             for    变量  in  列表; do

                            statement1

                            statemetn2

                                ...

             done

         列表表示法:

                    { }   :eg -->{1..100}  --&gt; 1到100

                                   `seq 1 100`  :   --&gt;eg:偶数 `seq 2 2 100`  可以控制步进

                                   `COMMAND`   : 元素分割符是空格或换行符  eg: `ls /var`

               while

             while  条件 ; do

                           循环体

            done

                                    eg: while read LINE ;do     按行读取文件内容进行处理

                                            ...

                                        done < /etc/passwd

            until 

             until  条件 ; do

                        循环体

case 

            case  变量  in 

                        取值1)

                                        语句

                                        ;;

                        取值2) 

                             *)

           esac              break :停止循环

continue:提前结束当前循环,而后进入下一次循环

    RETVAL=$?

        位置变量:

            # ./name.sh     A   B   C   D

                 $0        $1    $2   $3 $4   如何与用户交互:

                read  VAR_NAME

                        -p  : " "                eg: read -p "Please input your name :"  NAME

                        -t    : bash命令的选项:

                -n :用于测试脚本的语法错误

                -x :调试执行,显示脚本调试执行过程中的详细过程

                -v  在运行 sccript 前,先将 scripts 的内容输出到屏幕上

                ++ :VAR++  ,++VAR

                        VAR++ : 先引用 ,后自加        eg:        let VAR++    &lt;-->    VAR=$[ $VAR+1 ]

                        ++VAR : 先自加,后引用

                -- :    VAR--  ,--VAR

                        +=  --&gt; eg:     let SUM+=$I  <-->  SUM=$(($SUM+$I))

                        -=

                        *=

                        /=

        指定退出脚本:

                状态返回值:0  1--&gt;255

            exit

        随机数:RANDOM

         输出菜单:  --&gt;cat

        #  cat &lt;&lt;EOF

        1.Please input your name:

        2.Please input your telephone number:

        3.Please input your address:

        4.Quit

        EOF     function 

               bash 中定义函数的两种方法:

                1. function  FUNC_NAME{

                        body

                        }

               2. FUNC_NAME() {

                            body;

                            }

        函数的返回值:是函数调用时所执行的函数体中的最后一条语句的状态返回值;

        自定义函数返回值:  return #

上一篇: nginx
下一篇: c++11 lambda

继续阅读