热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

bash脚本中if语句和for语句使用方法

nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd

在bash shell脚本中,我们要先了解三种执行顺序

  • 顺序执行 (从左到右,从上到下的执行)
  • 选择执行 (条件满足或者不满足的时候,才会执行某段结构)
  • 循环执行 (重复执行某段结构)

今天所写的if 就是选择顺序,for就是循环执行

在if或者for中不可避免的要使用一些结构,还有一些运算方法,我先把这些列出来,方便以后使用。

算术运算方法

              1.$[expression]

                    其中的表达式可以是纯数字组成的,也可以使用变量引用变量值;在使用变量时,可以将$符号省略;

                    示例:

                            # echo $[3+4]

                            # NUM1=5 ; NUM2=4 ; echo $[NUM1*NUM2]

              2.let VAR=EXPRESSION

                    根据算术表达式完成算术运算并赋值给指定的变量;

              3.$((EXPRESSION))

                    其中的表达式可以是纯数字组成的,也可以使用变量引用变量值;在使用变量时,可以将$符号省略;

              4.expr ARGU1 ARGU2 ARGU3

                    其中ARGU1和ARGU3必须是整数数值;ARGU2是算术运算符;

              5.echo "EXPRESSION" | bc

              6.bc <<

    位置参数变量
   $0:命令的本身,对于脚本而言,就是该脚本的路径;
   $1,$2.....$n:脚本后面通过命令行给脚本传递的命令行参数;
       n>9时,引用该位置变量时,需要加{},即${10}

   特殊变量:
       $@:给出的所有位置参数的列表,当使用双引号引用时,每个参数作为单独的字符串存在;
       $*:给出的所有位置参数的列表,当使用双引号引用时,整个参数列表被当做一个字符串;
       $#:标识除去$0之外,整个命令行中有多少个参数;

shift命令,可以将$2->$1;

if语句:
       if: if 命令; then 命令; [ elif 命令; then 命令; ]... [ else 命令; ] fi

       if语句的单分支结构:
           if 命令; then 命令;  fi

           注意:是否会执行then后面的命令,取决于if后面的命令的执行状态返回值;
               1.如果其返回值为真,则执行then后面的命令;
               2.如果其但回执为假,则不执行then后面的命令;


           建议在脚本中的书写格式:
               if CONDITION ; then
                   STATEMENT
                   ..
               fi

               或
               if CONDITION ;
               then
                   STATEMENT
                   ..
               fi

       if语句的双分支结构:
           if 命令; then 命令; else 命令; fi

           注意:是否会执行then或else后面的命令,取决于if后面的命令的执行状态返回值;
               1.如果其返回值为真,则执行then后面的命令;
               2.如果其但回执为假,则执行else后面的命令;


           建议在脚本中的书写格式:
               if CONDITION ; then
                   STATEMENT
                   ..
               else
               STATEMENT
                   ..
               fi

               或
               if CONDITION ;
               then
                   STATEMENT
                   ..
               else
               STATEMENT
                   ..
               fi

       if语句的多分支结构:(不建议使用,太麻烦,我们可以用下边的方法,进行单个或者多个的嵌套解决
            if 命令; then 命令; [ elif 命令; then 命令; ]... [ else 命令; ] fi

            注意:是否会执行then或else后面的命令,取决于if后面的命令的执行状态返回值或者elif后面的命令的执行状态返回值;
               1.首先判断if后面的命令的状态返回值是否为真,如果为真,就执行then后面的语句;如果为假,就继续判断第一个elif后面的命令的执行状态返回值;
               2.第一个elif后面的命令的执行状态返回值为真,就执行第一个elif语句中then后面的命令,否则,就继续判断第二个elif后面的命令执行状态返回值;
               3.以此类推,会判断每个elif后面的命令的执行状态返回值是否为真,如果所有的if和elif后面的命令的执行状态返回值均为假,则执行else后面的语句;

            建议在脚本中的书写格式:
               if CONDITION ; then
                   STATEMENT
                   ..
               elif CONDITION2 ; then
                   STATEMENT
                   ..
               else ; then
               STATEMENT
                   ..
               fi

               或
               if CONDITION ;
               then
                   STATEMENT
                   ..
               elif CONDITION2 ; then
                   STATEMENT
                   ..
               else
               STATEMENT
                   ..
               fi

               注意:if的多分支结构,使用场景不多,而且有些时候,可以使用嵌套的单分支或双分支if结构代替if多分支结构;

               嵌套的if结构

                   if CONTITIONG1 ; then
                       if CONTITIONG2 ; then
                           if CONTITIONG3 ; then
                               STATEMENT
                               ..
                           else
                               STATEMENT
                           fi                           
                       else
                           STATEMENT
                       fi
                   else
                       STATEMENT
                   fi

一个好的循环结构,必须包括两个重要的环节;
       1.进入循环的条件:
           在符合要求或满足条件时才开始循环;

       2.退出循环的条件:
           达到某个要求或符合某个条件时需要结束或终止循环的执行;

   for循环:
       1.遍历列表的循环:
            为列表中的每个成员执行命令。
            for 名称 [in 词语 ... ] ; do 命令; done

                建议在脚本中书写的格式:
                for VAR_NAME in LIST ; do
                   循环体
                done
            或
                for VAR_NAME in LIST
                do
                   循环体
                done

           注意:
           VAR_NAME:任意指定的变量名称,变量的值是从LIST中遍历获取的各个元素;
           LIST:for循环需要遍历的列表;可以通过以下方式生成列表;
               1.直接给出列表;
               2.纯整数列表;
                   1)花括号展开:
                   {FIRSTNUM..LASTNUM}
                   {FIRST,SECOND,THIRD,...,LAST}
                   2)seq命
                       seq [OPTION]... LAST
                       seq [OPTION]... FIRST LAST
                         seq [OPTION]... FIRST INCREMENT LAST
               3.花括号展开:
                   {FIRST..LAST}
               4.命令的执行结果:
                   ls /etc
               5.GLOBBING通配符
               6.某些特殊变量的值:
                   $*,$@
           循环体:
               一般来说,循环体中应该能够用到VAR_NAME变量的值的命令或命令的组合;如果循环体中的命令并没有用到VAR_NAME变量的值的话,列表的元素个数,就是此次for循环的次数;

    1.进入循环的条件,LIST中尚有未被取尽的元素;
   2.退出循环的条件,LIST中的元素被取尽;
   3.for循环几乎不会出现死循环;
   4.在执行循环的过程中,需要将整个LIST载入内存,因此。对于大列表来说,可能会消耗比较多的内存及CPU资源;

简单的例子(Vim编辑内容)

1.传递一个字符串给脚本,脚本会将该字符串当作用户名,如果该用户不存在,则添加之并为其设置与用户名相同的密码。

#!/bin/bash
#
if [ $# -ne 1 ] ; then
        echo "please input one name charast"
        exit 6;
fi
if id $1 &> /dev/null ; then
        echo "This user already exists"
else
        useradd $1 &> /dev/null
        echo $1 | passwd --stdin $1 &> /dev/null
        echo "This user creat and password is username"
fi

2.将两个文本文件的路径传递给脚本作为其参数,如果有文件不存在,则结束脚本执行并报告错误信息;如果文件都存在,则比较两个文件中哪个文件的行数多,返回行数多的文件的文件名。

#!/bin/bash
#
read -p "Please input two files: " FILE1 FILE2
if ! cat $FILE1 &> /dev/null ; then
        echo "please enter the first true path file"
        exit 5
        if ! cat $FILE2 &> /dev/null ;then
                echo "please enter the second true path file"
                exit 5
        fi
fi
LINE1=$(cat $FILE1 | wc -l )
LINE2=$(cat $FILE2 | wc -l )
if [ $LINE1 -ne $LINE2 ] ; then
        if [ $LINE1 -gt $LINE2 ] ; then
                echo "$FILE1"
        else
                echo "$FILE2"
        fi
else
        echo "$FILE1 and $FILE2 are generally long"
fi
unset FILE1 FILE2 LINE1 LINE2

3.利用RANDOM变量随机生成十个数字,显示出这十个数字,并显示出其中的最大值和最小值。

#!/bin/bash
#
touch /tmp/math.txt
for I in $(seq 1 10) ; do
        J=$RANDOM
        echo  "$J "
        echo "$J" >> /tmp/math.txt
done
K=$( sort -n /tmp/math.txt | head  -1)
L=$( sort -n /tmp/math.txt | tail  -1)
echo "laster $L ; leaster $K "
rm -rf /tmp/math.txt
exit 5

4.给脚本传递一个数字作为行总数,分别打印由*组成的最0小锐角朝上和朝下的等腰三角形以及菱形。

#!/bin/bash
#
read -p "enter one number: " INT
if [[ $INT =~ [^[:digit:]] ]] ; then
        echo "please enter the number"
        exit 5
fi
echo ”zheng sanjiao“
for I in $(seq  $INT) ; do
        for J in $(seq  $[INT-I]) ; do
                echo -n " "
        done
        for K in $(seq  $[2*I-1]) ; do
                echo -n "*"
        done
        echo
done
echo "dao sanjiao"
for M in $(seq  $INT) ; do
        for B in $(seq $[M-1]) ; do
                echo -n " "
        done
        for N in $(seq $[2*(INT-M)+1]) ; do
                echo -n "*"
        done
        echo
done
echo "lingxing"
if [ $[INT%2] -ne 0 ] ; then
        INT2=$[(INT+1)/2]
        for Q in $(seq  $INT2) ; do
                for W in $(seq  $[INT2-Q]) ; do
                        echo -n " "
                done
                for E in $(seq  $[2*Q-1]) ; do
                        echo -n "*"
                done
                echo
        done
        for R in $(seq  $[INT2-1]) ; do
                for T in $(seq $[R]) ; do
                        echo -n " "
                done
                for Y in $(seq $[2*(INT2-R)-1]) ; do
                        echo -n "*"
                done
        echo
        done
        exit 7
else
        echo "qing shuru jishu >3"
fi

5.分别打印顺序和旋转的九九乘法表。
    顺序的九九乘法表是正常的九九乘法表;
    旋转的九九乘法表是第一行是1×1=1 1×2=2 1×3=3 1×4=4 ... 1×9=9; 第二行是2×2=4 2×3=6 2×4=8 ... 2×9=18; ... 第九行是9×9=81;

#!/bin/bash
#
for I in $(seq 1 9) ; do
        for J in $(seq 1 $I) ;do
                echo -ne "$I×$J=$[I*J]\t"
        done
        echo
done
for M in $(seq 1 9) ; do
        for N in $(seq $M 9) ; do
                echo -ne "$M×$N=$[N*M]\t"
        done
        echo
done


推荐阅读
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • QuestionThereareatotalofncoursesyouhavetotake,labeledfrom0ton-1.Somecoursesmayhaveprerequi ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 树莓派Linux基础(一):查看文件系统的命令行操作
    本文介绍了在树莓派上通过SSH服务使用命令行查看文件系统的操作,包括cd命令用于变更目录、pwd命令用于显示当前目录位置、ls命令用于显示文件和目录列表。详细讲解了这些命令的使用方法和注意事项。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
author-avatar
高正_飞翔之殇_826
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有