bash编程基础(二)补

   bash脚本编程

        脚本文件格式:

        第一行,顶格:#!/bin/bash

        注释信息:#

        代码注释:

        缩进,适度添加空白行;

   语言:编程语法格式,库,算法和数据结构

   编程思想:

      问题空间–解空间

      变量:

          局部变量

          本地变量

          环境变量

               

          位置参数变量

          特殊变量

       数据类型:字符、数值型

        弱类型:字符型

     算术运算:

        + ,-, *, /,**

        VAR= let VAR=$num1 op $num2

        VAR= $[expression]

         VAR=$((expression))

         VAR=$(expr  argu1 argu2 argu3)

     注意:有些时候乘法符号需要转义;

     增强型赋值:

         变量做某种算术运算后回存至此变量中;

            let i=$i+#

            let i+=#

            +=, -=, *=, %=

                  自增:

                           let VAR=$[$VAR+1]

                           let  VAR+=1

                            let VAR++

                   自减:

                          VAR=$[VAR-1]

                          let VAR=1

                          let VAR–

   练习:写一个脚本

          1  计数/etc/passwd文件中的第10个用户和第20个用户的id号之和;

            id1=$(head-10/etc/passwd | tail-1 | cut -d: -f3)

            id1=$(head-20/etc/passwd | tail-1 | cut -d: -f3)

           2、计算/etc/rc.d/init/d/functions和/etc/inittab文件的空白行数之和;

                  grep "^[[:space:]]*$" /etc/rc.d/init.d/functions | wc -l

   条件测试:

           判断某需求是否满足,需要由测试机制来实现;

           如何编写测试表达式以实现所需的测试:

           (1)执行命令,并利用命令状态返回值来判断;

                     0:成功

                     1-255:失败

              (2)测试表达式

                    test EXPRESSION

                    [EXPRESSION]

                    [ [EXPRESSION]]

                  注意:EXPRESSION两端必须有空白字符,否则为语法错误;

            bash的测试类型:

                  数值测试

                  字符串测试

                   文件测试

             数值测试:数值比较

               -eq: 是否等于: [$num1 -eq $num2]

               -ne: 是否不等于;

               -gt:是否大于等于;

              -lt: 是否小于;

               -le: 是否小于等于;

               字符串测试:

                 ==:是否等于;

                 >:是否大于;

                  <:是否小于;

                !=:是否不等于;

                 =-: 左侧的字符串是否能够被右侧的PATTERN所匹配;

                -z: "STRING":判断指定的字串是否为空;空位真,不空为假;

               -n:  "STRING":判断指定的字串是否为不空,不空为真,空则假;

                 注意:(1)字符串要加引号;

                       (2)要使用[[]];

                文件测试:

                    存在性测试

                    -a FILE

                    -e FILE

                     文件的存在性测试,存在则为真,否则则为假;

                 存在性及类型测试

                     -b FILE: 是否存在并且为块设备文件;

                     -c:FILE :是否存在并且为目录文件;

                     -f: FILE 是否存在并且为普通文件;

                     -h: FILE 或 -L FILE: 是否存在并且为符号链接文件;

                     -p: FILE: 是否存在且为命名管道文件;

                     -s: FILE: 是否存在且为套接字文件;

                文件权限测试:

                     -r FILE:是否存在并且对当前用户可读;

                     -w FILE:是否存在并且对当前用户可写;

                    -x  FILE:是否存在并且对当前用户可执行;

               特殊权限测试:

                    -u: FILE: 是否存在并且拥有suld权限;

                    -g: FILE 是否存在并且对当前用户可读;

                    -k  FILE: 是否存在并且 拥有sticky 权限

                文件是否有内容:

                    -s FILE: 是否有内容;

                     时间戳:

                    -N FILE: 文件自从上一次读操作后是否被修改过;

                从属关系测试:

                     -O FILE:当前用户是否为文件的属主;

                     -G FILE: 当前用户是否属于文件的属组;  

   

                双目测试:

                    FILE1  -ef FILE2: FILE1与FILE2是否指向同一个文件系统相同inode的硬连接;

                    FILE1  -nt FILE2:FILE1是否新于FILE2;

                     FILE1 -ot  FILE2: FILE1是否旧于FILE2;

                组合测试条件:

                     逻辑运算:

                第一种方式:

                    COMMAND1 && COMMAND2

                    COMMAND1 ||    COMMAND2

                    ! COMMAND 

                    [ -O FILE ] && [ -r FILE ]

                第二种方式:

                    EXPRESSION1 -a EXPPRESSION2

                    ! EXPRESSION 

                    [ -O FILE -a -x FILE ] 

                练习:将当前主机名称保存至hostName变量中;

                    主机名如果为空,或者为localhost.localdomain,则将其设置为www.magedu.com;

                    hostName=&(hostname)

                    [ [ -z "$hostName" -o "$hostName"=="locahost.localdomain" -o "$hostName" == "localhost"]] && hostname www.magedu.com

                脚本状态返回值:

                    默认是脚本中执行的最后一天命令的状态返回值;

                   自定义状态退出状态码:

                   exit [n]: n为自己指定的状态码;

                   注意:shell进程遇到exit时,即会终止,因此,整个脚本执行即                             为结束;

     

            向脚本传递参数:

                位置参数变量

                myscript.sh argu1 argu2

                引用方式:

                 $1, $2,…,${10},${11},…

            轮替:

                 shift [n]: 位置参数轮替;

     练习;写一脚本,通过命令传递两个文本文件路径给脚本,计算器空白行数之和;

            #!/bin/bash

            #

            file1-lines=$(grep "^$" $1 | wc -l)

            file2-lines=$(grep "^$" $2 |  wc -l)

            echo "Total blank lines: $[$file1-lines+$file2-lines]"

     特殊变量:   

         $0 :脚本文件路径的本身;

         $#:脚本参数的个数;

         $*:  所有参数;“hello" "hi" "toyou"

         $@: 所有参数;"hello hi toyou"

    过程式编程语言的代码执行顺序;

         顺序执行:逐条运行;

         选择执行:代码有一个分支:条件满足是才会执行;

         两个或以上是分支:只会执行其中一个满足条件的分支;

    循环执行:

        代码片段(循环体)要执行0、1或多个来回;

        选择执行:

         if  测试条件

         then 

              代码分支

         fi

         双分支的if语句;

         if 测试条件;then

         条件为真实执行的分支

         else

         fi

    示例:通过参数传递一个用户给脚本,次用户不存在是,则添加之;

         #!/bin/bash

         #

         if !|grep "^$1\“ /etc/passwd/ $> /dev/null; then

         useradd $1

         echo $1 | passwd –stdin $1 $> /dev/null

         echo "Add user $1 finished."

         fi

    做条件判断:

         #!/bin/bash

         #

         if [ $# -lt 1 ]; then

            echo "At least one username."

            exit 2

         fi

         if !|grep "^$1\“ /etc/passwd/ $> /dev/null; then

             echo "User $1 exists."

         else

             useradd $1

             echo $1 | passwd –stdin $1 $> /dev/null

             echo "Add user $1 finished."

          fi

   练习1、通过命令行参数给定的两个数字,输出其中较大的数值;

   第一种:

   #!/bin/bash

   #

  if [ $# -lt 2 ]; then

   echo "Two integers."

   exit 2

   fi

   if [ $1 -ge $2 ]; then

     echo "Max numeber: $1."

   elese

     echo "Max numeber: $2."

  fi 


  第二种:

   #!/bin/bash

   #

   if [ $# -lt 2 ]; then

      echo "Two integers."

       exit 2

  fi

   declare -i max=$1

  if [ $1 -ge $2 ]; then

     max=$1

  else 

      max=$2

  fi 

  echo "Max number: $max."

原创文章,作者:shadow,如若转载,请注明出处:http://www.178linux.com/64546

(0)
shadowshadow
上一篇 2016-12-23
下一篇 2016-12-23

相关推荐

  • Nginx 编译安装

    Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服 1、Apache服务器和nginx的优缺点: Apache具有很优秀的性能,而且通过模块可以提供各种丰富的功能。 1)首先Apache对客户端的响应是支持并发的 ,运行httpd这个daemon进程之后,它会同时产生多个子进程/…

    Linux干货 2017-02-06
  • N25-第一周作业

    第一周博客作业 1.描述计算机的组成及其功能 2.按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别 3.描述Linux哲学思想,并按照自己的理解对其进行解释性描述。 4.说明Linux系统上命令的使用格式:详细介绍,ifconfg,echo,tty,startx,export pwd,history,shutdown,poweroff,rebo…

    Linux干货 2016-12-02
  • 一起学DNS系列(十四)DNS查询工具之DIG的使用(2)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://jeffyyko.blog.51cto.com/28563/240243    上节谈到了利用DIG的+trace参数追踪域名解析的过程,其实除此之外,DIG还有一些其他的参数,这节会涉及到这…

    2015-03-17
  • RAID 0 软件实现

    RAID 0 软件实现        RAID 0又称为Stripe或Striping,它代表了所有RAID级别中最高的存储性能。RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求。这种数据上的并行…

    Linux干货 2017-05-02
  • LVS负载均衡实战演练

    LVS负载均衡实战之lvs-nat模型 1.准备好机器,配置好时间同步,配置号网络,主机名 172.16.251.91 client [桥接] [网关为172.16.251.90] #lvs负载均衡两块网卡 172.16.251.90  lvs [网卡1] [桥接] 192.168.42.150  lvs [网卡2] [VMnet8] 192.168.42.…

    Linux干货 2017-06-22
  • Linux上功能强大的文本编辑工具—vim

    vim–Vi Improved是一款全屏文本编辑器 vi: Visual Interface,文本编辑器 可见,vim是vi的升级版,所以我们当然要学习vim! vim的功能强大,自然命令、用法也会种类繁多,想要用的得心应手自然是需要长期的实际操作的,正所谓工欲善其事必先利其器,我们要想能够在linux上从容应对繁多的文本编辑,无疑vim编辑器是…

    Linux干货 2016-08-12