* Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具所无法实现的功能。



   

   1.创建脚本

脚本合集

   #!/bin/bash  ##脚本第一行,用/bin/bash执行

   echo "hello world"   ##执行的命令

   

    * /usr/local/bin  本地开发、系统上的其他人使用的脚本

    * /usr/local/sbin  本地开发、由root使用的脚本





   2.脚本的执行和调试

脚本合集




   3.引用和转义

    *  在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致 按字面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。

   

脚本合集

  echo "can i have a $FRUIT"

 *  弱引用,将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。换言之,变量扩展和命令扩展在双引号内仍起作用。

  echo 'can i have a $FRUIT'

 *  强引用,将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展

脚本合集

  *  转义,非引用的\是转义字符。它保留了下一个字符的文字值。





   4.shell变量

    *  用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变量的脚本

脚本合集

   FITST=jhon  ##定义变量

   echo ${FIRST}_$LAST   ##使用变量



  

    5.命令替换

    *  在子shell中执行指定命令并用命令输出替换脚本中的命令替换。

脚本合集




    6.算术运算符

    *  可以在程序中实现加、减、乘、除等数学运算的运算符。

   -     减法

   +     加法

   **    幂运算

   *     乘法

   /     除法

   %     余数

脚本合集

   i++    增量后

   i--    减量后

   +=     加等

   -=     减等

脚本合集

  ## 脚本内容表示从1到10之和

   运行结果

脚本合集

 

 

    7.for循环

    *  用于值列表中的相同命令的重复。

脚本合集

    ##  (seq 2 2 8)表示从2到8隔两个数取数

  



    8.循环与计算结合

脚本合集

  ** 表示从1加到99的总和

  结果

脚本合集




   9.数据库备份示例

脚本合集

  

   #!/bin/bash

   for DB in $(mysql -uroot -p123 -e "show databases;" -E -N | grep -v '^*' | grep -v    'schema$')    //过滤要备份的数据库

   do

   echo "Backup $DB"     //显示Backup 库名

   mysqldump $DB > /dbbackup/$DB.dump    //备份数据库到dbbackup目录

   done

   echo "OK"      //备份完成后显示OK

   for DBDUMP in /dbbackup/*    //从dbbackup目录中过滤库名

   do

   SIZE=$(stat --printf "%s\n" $DBDUMP)   //统计备份文件大小

   echo "$DBDUMP $SIZE"   //显示库名和大小

   done




   10.位置参数


  * 使用read提示用户输入(使用-p选项)并将其直接存储到一个或多个变量,为交互式输入

脚本合集

   测试

脚本合集

  * 使用位置参数来读取传递给脚本的命令行参数或选项输入。各种特殊变量存储传递的选项编号。

脚本合集

    指定的位置参数总数:$#

    位置参数自身:$0、$1、$2、$3....

    所有位置参数: [email protected]、$*

   测试

脚本合集

 



   11.退出状态

    *  Linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态。这被bash当作逻辑True值。非零退出状态通常表示发生了错误,并且被bash当作逻辑False值。

脚本合集

   echo $?  ##退出状态的值被存储在"?"中,查看退出状态

   *  退出状态数字的含义

   0    ##在指定的文件中找到了模式

   1    ##在指定的文件中未找到模式

   >1    ##一些其他错误(无法打开文件、错误的搜索表达式等)

 



   12.test条件判断

   *  test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语法,使用方括号"[]"将表达式括起来,这样更易于阅读

   *  非零或零长度字符串运算符

脚本合集

    [ -n westos];echo $?   ##判断不是非零字符,也可写为test -n westos;echo $?

   [ -z westos];echo $?   ##判断是非零字符

  

   *  字符串比较运算符

脚本合集

   =    ##等于字符

  !=    ##不等于字符


   *  数字比较运算符

脚本合集

  -eq    等于

   -ne           不等于

   -lt    小于

   -le   小于等于

   -gt          大于

   -ge         大于大于

     

   *  文件状态运算符

脚本合集

   测试

脚本合集


    -b    ##块设备文件

    -c    ##字符设备文件

    -e    ##文件是否存在

    -f    ##是否是常规文件

    -d    ##是否是目录

    -S    ##套接字文件

    -L    ##是否是链接


    *  二进制文件运算符

脚本合集

   

    -ef    ##两文件是否相同

    -nt    ##第一个文件是否比第二个新

    -ot    ##第一个文件是否比第二个旧


    *  逻辑运算符

脚本合集

    -a    ##并且,两个条件同时满足

    -o    ##或者,两个条件最少满足任意一个

    !    ##给结果取反

脚本合集

     &&    ##结果正确执行

     ||    ##结果不正确执行



    

    13.if语句

   *  if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之间的命令列表(反向平写if,标记if块的结束)

脚本合集


#!/bin/bash

if

        [ -z "$1" ]     //脚本后没跟文件

then

        echo please give me file   //显示please give me file

elif

        [ ! -e "$1" ]       //如果脚本后跟的文件不存在    

then

        echo "$1 is not exist"    //显示文件is not exist

else

        for NAME in `cat $1`       //从文件中过滤NAME

        do

             USER=`getent passwd $NAME`   //检测用户是否存在

             if

             [ -z "$USER" ]     //如果用户不存在

             then

                   useradd $NAME    //添加用户

                   echo wsetos | passwd --stdin $NAME   //并设置密码

             else

                   echo $NAME is exist      //显示用户存在

             fi

         done

fi      //结束

     *  测试

脚本合集




    14.case语句

   *  它能够把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪部分代码。esac标记结束


脚本合集


#!/bin/bash

case "$2" in

     +)    //第二个变量为+

      echo num=$[ $1 + $3 ]   //输出$1 + $3的值

     ;;

     -)    //第二个变量为-

      echo num=$[ $1 - $3 ]   //输出$1 - $3的值

      ;;

     %)    //第二个变量为%

      echo num=$[ $1 * $3 ]   //输出$1 % $3的值

      ;;

      /)   //第二个变量为/

      echo num=$[ $1 / $3 ]   //输出$1 / $3的值

      ;;

     *)     //第二个变量为其他

      echo   "please input right command"   //输出please input right command

      ;;

esac

   *  测试

脚本合集


    15.expect语句

   *  实现自动应答脚本。

   交互输入脚本

脚本合集

  

    ## 使用expect脚本之前要yum install expect -y

   

    expect脚本

脚本合集

   #!/user/bin/expect    //告诉操作系统脚本里的代码使用那一个shell来执行。

   set timeout 10       //设置后面所有的expect命令的等待响应的超时时间,单位为秒

   spawn /mnt/ask.sh  //spawn是expect的内部命令,作用是给后面的shell指令加个壳,用来传递交互指令

   expect "who"    //判断上次输出结果里是否包含“who”的字符串,如果有则立即返回,否则等待超时时间后返回。

   send "haha\r"   //执行交互动作,相当于手工输入"westos"。

   expect "old"   

   send "13\r"

   expect "happy"

   send "happy\r"

   expect eof    //作用是在输出中搜索文件结束符,如果没有这一行,脚本会立即退出,得不到正确结果。

   ## interact表示执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。否则退出登录



  *  测试

脚本合集



   16.环境变量

   *  shell和脚本使用变量来存储数据 ,有些变量可以连同它们的内容传递给子进程,这些变量我们称之为环境变量,分为三种

   (1) 临时设置,换了shell后不存在

脚本合集


   (2) 用户级别设置,相对应的用户一直生效,切换用户后不生效

     修改~./bash_profile文件

脚本合集

     * 测试

脚本合集

   (3)系统级别修改,切换用户后也会生效

     修改/etc/profile文件

脚本合集

    * 测试

脚本合集

   (4) env  ##查看环境变量

脚本合集



   17.别名

    *  自定义属于自己的系统命令。

   (1) 临时生效

脚本合集

   alias xie = 'vim'   ##临时设置别名

   alias     ##查看别名

   (2)  永久生效

    修改~./ bashrc文件

脚本合集

   * 测试

脚本合集

    source  ./ bashrc  ##文件生效

    (3) 删除别名

     unalias  xie  

脚本合集


   18.函数

脚本合集

#!/bin/bash

ACTION () {     //设置函数

if [ $2 $1 ];then   //判断条件

   echo "$1 is $3"  

fi

}

   ACTION $1  "! -e" ‘not exist’  //使用函数

   ACTION $1  "-b" ‘not exist’

   ACTION $1  "-f" ‘not exist’

   ACTION $1  "-L" ‘not exist’

   ACTION $1  "-d" ‘not exist’

   ACTION $1  "-c" ‘not exist’

   ACTION $1  "-s" ‘not exist’