1、脚本开头

                #!/bin/bash或者#!/bin/sh

二者区别

sh:Bourne shell(sh) 是 UNIX 最初使用的shell,并且在每种 UNIX 上都可以使用, 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。

bash: Linux 操作系统缺省的 shell 是Bourne Again shell,它是 Bourne shell 的扩展,简称 Bash,与 Bourne shell 完全向后兼容,并且在Bourneshell 的基础上增加、增强了很多特性。Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能,它还包含了很多 C shell 和 Korn shell 中的优点,有灵活和强大的编程接口,同时又有很友好的用户界面。

2、注释

   2.1 #单行注释

   2.2多行注释

      方法ASH脚本学习总结_SH

       

       如果注释中有反引号的命令就会报错,反引号部分不会被注释掉,例如 var=`ls -l` 就不会被注释掉。       

       方法B(避免反引号报错)

       SH脚本学习总结_脚本_02

3、变量定义

3.1直接定义

    java_home="/opt/Oracle/java"

3.2 变量传递

    java_bin=$java_home/bin或者java_bin=${java_home}/bin

3.3 参数传递

  version=$1

       说明:$0代表sh运行命令的第一个参数,即该sh文件的全名

             $1代表sh运行命令的第二个参数

变量说明

$$ Shell本身的PID(ProcessID)
$! Shell最后运行的后台Process的PID
$? 最后运行的命令的结束代码(返回值)
$- 使用Set命令设定的Flag一览
$* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" …"$n" 的形式输出所有参数。
$# 添加到Shell的参数个数
$0 Shell本身的文件名
$1~$n添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

举例:

sh test.sh aabb

echo"number:$#"   #输出number:2
echo "scname:$0" #输出scname:test.sh
echo "first :$1"  #输出first:aa
echo "second:$2"  #输出second:bb
echo "argume:$@"  #输出argume:aa bb

扩展:

$*和$@的区别:

$*实例

SH脚本学习总结_SH_03

$@实例

SH脚本学习总结_SH_04

4、函数定义

    函数名(){

       函数体

    }

    举例:

    usage(){

        echo"usage:sh $0 pkg_version"

        echo"example:sh deploy_ciitc.sh V1.0.0B03_20160416_03-56-09"

        exit 1

    }

    函数调用

    直接写函数名,举例:

    if [ $# -ne 1];then

      usage

      exit 1

    fi

5、单引号、双引号、反引号与反斜杠

   5.1单引号 ('' ) 

# grep Susan phonebook 
Susan Goldberg 403-212-4921 
Susan Topple 212-234-2343 
如果我们想查找的是Susan Goldberg,不能直接使用grep Susan Goldberg phonebook命令,grep会把Goldbergphonebook当作需要搜索的文件 
# grep 'Susan Gold' phonebook 
Susan Goldberg 403-212-4921 
shell碰到第一个单引号时,它忽略掉其后直到右引号的所有特殊字符 

5.2 双引号 (" " ) 

双引号作用与单引号类似,区别在于它没有那么严格。单引号告诉shell忽略所有特殊字符,而双引号只要求忽略大多数,具体说,括在双引号中的三种特殊字符不被忽略:$,\,` ,即双引号会解释字符串的特别意思,而单引号直接使用字符串.如果使用双引号将字符串赋给变量并反馈它,实际上与直接反馈变量并无差别。如果要查询包含空格的字符串,经常会用到双引号。 
# x=* 
# echo $x 
hello.sh menus.sh misc.sh phonebook tshift.sh 
# echo '$x' 
$x 
# echo "$x" 

这个例子可以看出无引号、单引号和双引号之间的区别。在最后一种情况中,双引号告诉shell在引号内照样进行变量名替换,所以shell$x替换为*,因为双引号中不做文件名替换,所以就把*作为要显示的值传递给echo对于第一种情况需要进一步说明,shell在给变量赋值时不进行文件名替换(这从第三种情况中也能看出来),各步骤发生的精确次序如下: shell扫描命令行,把x的值设为星号*; 
shell
再次扫描命令行,碰到星号*,把它替换成当前目录下的文件清单; 
shell
启动执行echo命令,把文件清单作为参数传递给echo. 
这个赋值的先后次序非常重要:shell先作变量替换,然后作文件名替换,最后把这行处理为参数 

5.3 反引号(``) 

命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。shell中有两种方法作命令替换:把shell命令用反引号或者$(...)结构括起来,其中,$(...)格式受到POSIX标准支持,也利于嵌套。 
# echo The date and time is `date` 
The date and time is
6 1506:10:35 CST 2005 
# echo Your current working directory is $(pwd) 
Your current working directory is/home/howard/script 

5.4 反斜杠backslash-escaped( \ ) 

反斜杠一般用作转义字符,或称逃脱字符,linux如果echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号 
echo -e "\n" 
反斜杠的另一种作用,就是当反斜杠用于一行的最后一个字符时,shell把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用

       \n   表示新的一行
    \r   表示回车
    \t   表示水平制表符
    \v   表示垂直制表符
    \b   表示后退符
    \a   表示"alert"(蜂鸣或者闪烁)
    \0xx 转换为八进制的ASCII码

扩展:

1echo -e "\n" 等同于echo $'\n'         # 新行

2ssh root@172.20.11.13 'cd$batch_ws_pkg_path;[ -f $batch_ws_pkg ] && echo "batch ws  pkg find" || echo "batch ws  pkg not find" && exit 1 '

命令解释:登录172.20.11.13,并且在机器上执行''内部的命令-----切换目录,成功后,判断目录如果存在,打印batch ws pkg find否则打印batch ws pkg not find并退出

 

6、逻辑判断

6.1 IF语句

SH脚本学习总结_学习_05

常用判断:

SH脚本学习总结_SH_06

扩展:

SH脚本学习总结_脚本_07


6.2Case语句

case条件语句:

   语法: case 条件 in

          xxx)

          commands;;

          xxx)

          commands;;

          xxx)

          commands;;

          esac

 

   说明:这个esac 就是case的结束,想if...fi 一样的,

         注意commands;;中的“;;”不能少掉。

实例:

SH脚本学习总结_学习_08

6、特殊简写命令

SH脚本学习总结_SH_09

7循环

  7.1 for循环

语法:for  变量  in   列表
     do
        操作~~~~
      done

  说明:变量是在当前循环实用,用来替代当前列表的对象。
     列表:循环中所要操作的对象,可以是字符串,文件名等。

实例:

  SH脚本学习总结_学习_10

扩展:for循环的其他写法--注:对于固定次数的循环,可以通过seq命令来实现,就不需要变量的自增了;这里的C语言for循环风格是挺熟悉的吧。

  SH脚本学习总结_SH_11

7.2 while循环

    语法: while  [ 表达式 ]

                 do

                 操作......

                 done

 

     说明:只要表达式成立,就将一直循环下去。

           []   表达式 之间要有空格,最好在与操作符前后也加上空格

           先判断表达式的true还是falsetrue时候,在执行里面的语句。

     实例:

  SH脚本学习总结_脚本_12

7.3 until循环

    语法:until  [表达式]

                 do

                 操作......

                 done

    

   说明: untilwhile正好相反, until是如果表达式不成立则执行里面的操作,直到表达式成功后结束。

   实例:

 SH脚本学习总结_SH_13

SH脚本学习总结_SH_14