shell基本介绍 :


1、Shell作用就是执行用户命令,有两种方式:交互式(输入一条,解释一条),批处理(将多个命令同时写入脚本,然后调用shell,一次性把这些命令执行完毕);


2、交互式命令分为:内建命令 和 非内建命令;

                                      内建命令; 相当于调用函数,不创建新的进程,使用which查不到其定义的位置;如cd ,alias ,exit等;

                                      非内建命令:使用了fork创建新进程,使用which可以查找到其定义的位置;


3、在shell脚本中,#表示注释,但是如果#位于第一行,且为#!形式,表示该脚本使用后面指定的解释器; 如 #! /bin/sh


4、在批处理中,交互式shell fork/exec出一个shell,用于处理子进程任务,一条执行完,才执行下一条;


5、Shell 变量由全大写字母加下划线组成;


6、 有两种类型的Shell变量:环境变量和本地变量;

        环境变量可以从父进程传递给子进程,可使用printenv查看 当前Shell进程的环境变量; 环境变量是一个存放元素为字符串的数组;

        本地变量只存在于当前Shell中,set 命令可以查看当前Shell进程中定义的所有变量;

        环境变量是所有进程都有的东西,而本地变量只是Shell进程特有;


7、Shell变量的定义:

       VARNAME=value  注意,等号两边不能有空格;

       在shell中定义的变量,默认本地变量,仅供本Shell进程使用,不过,可使用export VARNAME=value将本地变量声明为环境变量;

8、Shell变量的删除:

       unset VARNAME 删除VARNAME变量,无论是本地变量还是环境变量;


9、Shell变量的取值: 

      ${VALUE}  表示提取了VALUE的值;


10、Shell 变量类型默认是字符串类型的,不需要定义其变量类型;


11、通配符:

        *  : 匹配零个或者多个任意字符;

        ?  : 匹配一个任意字符;

       [a,b,c],匹配a,b,c中的任意一个;


12、 一条命令的输出作为另一条命令的输入;

         DATE=$(data)   将data命令的执行结果给了变量DATE;

         

13、算术运算:$(( ))中的Shell变量取值将转化为整数;

        VAR=45;

        echo $(($VAR+45 ))

        $(( )) 只能做整数的运算,且包含的运算符只能是 : +  ,- , * , / 和()运算;


14、转义字符\;

        转义字符 \ 用于除去紧跟其后的单个字符的特殊意义(回车除外),也就是说只去其字面值;如touch \$\ \$  可以创建名字为$  $的文件;


15、单引号:

       用于保持单引号内字符的字面值,包括回车和\也不例外;如果单引号没有配对,则会提示用户输入’;


16、双引号:

       用于保持引号内所有字符的字面值,包括双引号;但是除了一下情况:

       $+变量名仍然表示取变量的值;

       反引号仍然表示命令替换(和$(  )等价);

       \$  , \‘,\“ , \\  仍然表示字面值;




shell脚本基本语法:



1、test 命令:

      test命令用于测试一个条件是否成立,与[    ]作用等价,如果成立,则返回0,不成立,则返回1;     

      VAR=5   //变量赋值;

      ${VAR} -gt 1  //比较大小; 等价于[ ${VAR} -gt 5 ],注意在变量之间,变量和括号之间,都要加一个空格;

      echo $?           //显示结果;


2、常见测试命令:

       (注意:括号 和字符之间都有空格,空格不可少;

       [ -d  DIR ], 如果DIR存在,而且是一个目录,则为真,返回0;

       [ -f  FILE ],如果FILE存在,且为一个普通文件,则为真;

       [ -z STRING ],如果STRING的长度为0,则为真,

       [ -n STRING ],如果STRING的长度不为0,则为真;

       [ STRING1 = STRING2 ],如果两个字符串相同,则为真;

       [ STRING1 != STRING2 ],如果两个字符串不同,则为真;

       [ ARG1 OP    ARG2 ] ,ARG1 和 ARG2必须是帧数;OP是操作符; -eq(等于) -ne(不等于),

                                           -lt(小于), -le(小于等于),-gt(大于) -ge(大于等于)


       [ ! EXPR ] EXPR可以是上面的任何测试命令; !表示逻辑反;


       [ EXPR1 -a EXPR2 ] EXPR可以是上面的任何测试命令; -a 表示逻辑与;


       [ ExPR1 -o EXPR2 ] ,EXPR可以是上面的任何测试命令; -o表示逻辑或;


3、在条件测试语句中,如果一个没有定义的变量直接被赋值,则会出现错误:

      如[ -d Desktop -a $VAR = ‘abc’ ] 如果VAR 没有事先定义,则会报错,正确的做法是

          [ -d Desktop -a “$VAR” = ’abc‘ ], 使用双引号将变量内容括起来;


4、shell 中的条件选择语句:

      if/then/elif/else/fi

      如:if [  -f ./1.sh ];

              then ./2.sh;

              elif  ;

              then ;

              fi;

      注意: 命令和各个参数之间必须要用空格隔开;

                   Shell中没有{},所以用if  和fi 表示语句块的开始和结束;fi 后面也是可以跟语句的;

                   如果 条件的返回值为0(即:Exit Status 的返回值为0),则表示条件为真,否则表示条件为假;

                  注意: :(即冒号)是一个特殊的命令,称为空命令,表示不做任何事,但是作为条件返回时,结果为真;


5、read  变量名

      表示从命令行读一个值给了变量名;



6、使用case  和  esac 来确定 case 命令执行的范围; 

      使用 $变量 in  可能值1|可能值2|可能值3) 动作;; [nN]*)动作2;;来匹配相应的变量值,并且执行相应的动作,注意,使用的是两个封号结尾;注意只有半个括号;

      最后使用 esac 来结束;

      如:

  

     case ”$YES_OR_NO“ in 

     yes|y)

     echo “good morning ”;;

     [nN]*)

     echo “good afternoon“;;

     *)

     echo “sorry”;;

    esac



7、 使用for 循环:

        for 循环变量 in 取值1 取值2 取值3;

        do  执行动作;

        done

        意思就是,依次取取值,然后进行动作;done 表示循环完毕;


8、  使用while;

        read TRY

        while [ $TRY !=  ”secret“ ];

        do echo “sorry!”

        read TRY;

        done;


9、 控制循环次数;

        COUNTER=1;

        while [ “$COUNTER” -lt 10 ];

        do echo “here we again ”

        COUNTER=$(($COUNTER + 1))

        


10、常用的位置参数和特殊变量;

       $0 命令行参数第一个,相当于C语言中的main函数的 argv[0];这里是该文件的名字;

       $1 ,$2 相当于 argv[1],argv[2];

       $#,相当于argc -1;

       $@ ,表示 $1,$2......,这个可用在for 循环之后的 in 后面;

       $? 表示上一条命令的退出状态:Exit Status;


11、使用shift 位移个数 可以将参数左移几个;

       echo “the $0 is now running”

       echo “first $1”

       echo “second $2”

       echo “$@”

      

       shift 1                    #参数左移两个;

       echo “first $1”

       echo “second $2”

       echo “$@”

       

       会发现现在的 $1 是原来$2的值;


12、   shell 中函数的运用;

           foo() { echo “Function foo is called” }   #注意,这里的分号必须要加;      

           echo “start”

           foo               #注意没括号;

           echo “end”

           注意函数定义时,没有参数和返回值;定义时有括号,调用时没有有括号;

           注意,函数定义必须在函数调用之前,必须;调用一般在后面;


13、Shell脚本提供了调试方式:

       在 命令行输入时,使用以下格式:


        sh -n shell文件名;      只检测是否有语法错误,并不执行;

        sh -v shell文件名;      一边执行脚本,一边将执行过的脚本命令和执行结果打印到标准输出;

        sh -x shell文件名;      提供跟踪执行信息,将执行的每一条命令和结果打印出来;(常用)


       在脚本里头全部调试时,使用以下格式:

        #! /bin/sh -x  (x可以被替换);


       在脚本里只进行一部分调试时:

       在开始调试的位置加:


       set -x;                         #启用调试;

       需要调试信息的部分;

       set +x;                        #禁用调试;

       (x 可以换)