广告
返回顶部
首页 > 资讯 > 精选 >shell脚本中for语句、if语句怎么用
  • 313
分享到

shell脚本中for语句、if语句怎么用

2023-06-09 20:06:53 313人浏览 安东尼
摘要

小编给大家分享一下shell脚本中for语句、if语句怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!上部:面向过程:顺序执行选择执行: if, case循环执行: for, while, until一、for语句&n

小编给大家分享一下shell脚本中for语句、if语句怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

上部:

面向过程:
顺序执行
选择执行: if, case
循环执行: for, while, until

一、for语句

  格式:
     for 变量 in 列表;do
        语句1;
        语句2;
        ...
     done
   例1、写一个脚本,添加10个用户,并让每个用户的密码同用户名】

代码如下:


       #!/bin/bash
       for I in {1..10}; do
          useradd user$I;
       echo user$I | passwd --stdin user$I
       done

  例2、写一个脚本,分别显示 /tmp/1.dir /tmp/2.dir /tmp/3.dir三个文件的时间戳,并将这三个文件被修改的时间改为201003030303.03

代码如下:


        #!/bin/bash
        for Dir in /tmp/1.dir /tmp/2.dir /tmp/3.dir; do

           stat $Dir
           touch -m -t 201003030303.03 $Dir
           stat $Dir
        done

bash的变量类型:
    本地变量
    局部变量
    环境变量
    位置变量 :$1、$2、$3、$4....
    特殊变量:
        $?: 用于保存刚刚执行的命令的状态返回值;
0:成功执行;1-255:失败,1,2,127
可以使用exit命令在脚本中自定义脚本执行状态返回值;如果不定义,脚本执行状态返
回值取决于脚本执行结束前最后执行的那个语句的状态;

       $@, $*: 所有位置参数;
       $#: 位置参数的个数;
       $0: 脚本名称

二、if语句

单分支if语句:
      格式:
          if 条件; then
语句1
语句2
  ...
           fi
     例3、写一个脚本,实现如下功能: 如果用户存在,就说明其存在;

代码如下:


#!/bin/bash
   UserName=user1
 if grep "^$UserName\>" /etc/passwd &> /dev/null; then
    echo "$UserName exists."
 fi


    例4、写一个脚本,实现如下功能:如果设备/dev/sda3已经挂载,就显示其挂载点;

代码如下:


#!/bin/bash
Device='/dev/sda3'
if mount | grep "^$Device" &> /dev/null; then
   mount | grep "/dev/sda3" | cut -d' ' -f3
fi

例5、写一个脚本,实现如下功能: 如果/etc/rc.d/rc.sysinit中有空白行,就显示其空白行数;

代码如下:


    #!/bin/bash
     File='/etc/rc.d/rc.sysinit'
    if grep "^$" $File &> /dev/null; then
     grep "^$" $File | wc -l
    fi

双分支if语句:

  格式:
   if 条件; then
 语句1
 语句2
 ...
else
 语句1
 语句2
 ...
fi

   例6、写一个脚本,实现如下功能:

     如果设备/dev/sda3已经挂载,就显示其挂载点;否则,就说明其未挂载或设备不存在;

代码如下:


        #!/bin/bash
          Device='/dev/sda3'
        if mount | grep "^$Device" &> /dev/null; then

           mount | grep "/dev/sda3" | cut -d' ' -f3
        else
          echo "$Device not mounted or not exist."
        fi

多分支if语句:
    格式:
    if 条件1; then
 语句1
 语句2
 ...
elif 条件2; then
 语句1
 语句2
 ...
elif 条件3; then
 语句1
 语句2
 ...
else
 语句1
 语句2
 ...
fi
   例7、写一个脚本:
      判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。
      如果其生产商为GenuineIntel,就显示其为Intel公司;
      如果其生产商为AuthenticAMD,就显示其为AMD公司;
     否则,就显示无法识别;

代码如下:


    #!/bin/bash
       Vendor=`grep "vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`
       if [[ $Vendor =~ [[:space:]]*GenuineIntel$ ]]; then

         echo "intel"
       elif [[ $Vendor =~ [[:space:]]*AuthenticAMD$ ]]; then
         echo "AMD"
       else
         echo "Unknown"
       fi

下部:

一、bash条件测试
     整数测试   [ expression ]
     字符测试     [[ expression ]]
     条件测试     test expression   test 根据表达式求值的结果返回 0(真)或 1(假)

1、整数测试:数值比较
         -gt   大于
         -ge   大于或等于
         -eq   等于
         -lt   小于
         -le   小于或等于
         -ne    不等于

例1:写一个脚本,生成两个随机数,比较其大小;显示大数;

bash有个内置变量:$RANDOM

代码如下:


#!/bin/bash
  A=$RANDOM
  B=$RANDOM
if [ $A -ge $B ]; then
  echo "Max number is $A."
else
  echo "Max number is $B."
fi

例2:写一脚本,随机生成一个整数,判定,显示其奇偶性;

代码如下:


#!/bin/bash
#
A=$RANDOM
if [ $[$A%2] -eq 0 ]; then
  echo "$A: Even"
else
  echo "$A: Odd"
fi

例3、写一个脚本:

计算100以内所有奇数的和以及所有偶数的和;分别显示之;

代码如下:


#!/bin/bash
EvenSum=0
OddSum=0
for I in {1..100}; do
  if [ $[$I%2] -eq 0 ]; then
    EvenSum=$[$EvenSum+$I]
  else
    OddSum=$[$OddSum+$I]
  fi
done
echo "EvenSum is: $EvenSum. OddSum is: $OddSum."

例4、计算N以内所有奇数的和以及所有偶数的和;分别显示之;N是通过参数传递过来的正整数;

代码如下:


#!/bin/bash
EvenSum=0
OddSum=0
for I in `seq 1 $1`;do
  if [ $[$I%2] -eq 1 ]; then
    OddSum=$[$OddSum+$I]
  else
    EvenSum=$[$EvenSum+$I]
  fi
done
echo "EvenSum: $EvenSum."
echo "OddSUm: $OddSum."
echo "Sum: $[$EvenSum+$OddSum]"

例5、写一个脚本,完成以下要求:

     1、添加10个用户user1, user2, ..., user10;但要先判断用户是否存在,不存在而后再添加;
     2、添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;
     3、最后显示当前系统上共有多少个用户;

代码如下:


#!/bin/bash
Count=0
for I in {1..10}; do
  if id user$I &> /dev/null; then
    echo "user$I exists."
  else
    useradd user$I
    echo "Add user$I successfully."
    Count=$[$Count+1]
  fi
done
echo "Add $Count new users."
echo "Total users: `wc -l /etc/passwd | cut -d' ' -f1`."

bash字符测试:
       >: 大于
       <: 小于
      ==: 等于
      =~: 判断左边的字符串是否能够被右边的模式所匹配;通常用于[[]];
         [[ $opt1 =~ $opt2 ]]一般做行首、行尾锚定;不要加引号
 单目:
     -z $STRING: 为空则为真,不空则为假;
     -n $STRING: 为空则为假,不空则真;

例6、写一个脚本,判定用户的shell是否为bash;

代码如下:


#!/bin/bash
Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ "$Shell" == "/bin/bash" ]; then
  echo "Bash User."
  Ret=0
else
  echo "Not Bash User."
  Ret=9
fi
exit $Ret

例7、根据用户shell的结束符是否为sh来判定其是否为登录用户:

代码如下:


#!/bin/bash
Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`
if [ -z $Shell ]; then
  echo "No shell."
  exit 3
fi
if [[ "$Shell" =~ sh$ ]]; then
  echo "Login User."
  Ret=0
else
  echo "None Login User."
  Ret=4
fi
exit $Ret

二、bash测试之文件测试:

    操作符 文件路径
       -f: 测试其是否为普通文件,即ls -l时文件类型为-的文件;
       -d: 测试其是否为目录文件,即ls -l时文件类型为d的文件;
       -e: 测试文件是否存在;存在为真,否则为假;
       -r: 测试文件对当前用户来说是否可读;
       -w: 测试文件对当前用户来说是否可写;
       -x: 测试文件对当前用户来说是否可执行;
       -s: 测试文件大小是否不空,不空则真,空则假;
短路操作:只要前半段已经可以决定最终结果,后半段就不再运算;
 与运算:
   真 && 真 =  真
   真 && 假 =  假
   假 && {真|假} = 假


 或运算:
   假 || 0 = 0
   假 || 1 = 1
   真 ||   =1

例8、给定一个路径,判断如果为普通文件,显示之;如果为目录,显示之;
      否则,说无法识别;

代码如下:


#!/bin/bash
if [ ! -e $1 ]; then
  echo "No such file."
  exit 7
fi
if [ -f $1 ]; then
  echo "Common file."
elif [ -d $1 ]; then
  echo "Directory."
else
  echo "Unknown file."
fi

综合例子:
写一个脚本:可以接受一个参数,其使用形式如下:
script.sh {start|stop|restart|status}
如果参数为start,创建空文件/var/lock/subsys/script,并显示“Starting script successfully.”;
如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script finished.”;
如果参数为restart,则删除文件/var/lock/subsys/script后重新创建,并显示“Restarting script successfully.”;
如果参数为status,那么:
如果/var/lock/subsys/script文件存在,则显示为“script is running.”
否则,则显示为“script is stopped.”
其它任何参数:则显示“script.sh {start|stop|restart|status}”

代码如下:


#!/bin/bash
if [ $1 == start ] ;then
   touch /var/lock/subsys/script
   echo "Starting script successfully."
 elif [ $1 == stop ] ; then
    rm -f /var/louk/subsys/script
    echo "Stop script finished."
 elif [ $1 == restart ];then
     rm -f /var/louk/subsys/script
     touch  /var/lock/subsys/script
    echo "Restarting script successfully."
  elif [ $1 == status ];then
     [ -e /var/lock/subsys/script ]&& echo "script is running." || echo "script is stopped."
 else
   echo "script.sh {start|stop|restart|status}"
fi

看完了这篇文章,相信你对“shell脚本中for语句、if语句怎么用”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!

--结束END--

本文标题: shell脚本中for语句、if语句怎么用

本文链接: https://www.lsjlt.com/news/257645.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 函数的返回值:类型、含义全解析
    c++++函数的返回值类型定义了函数调用的结果,可以是基本类型(如int)或用户定义类型(如类)。返回值的含义取决于函数的目的,可以表示成功/失败、操作结果或其他信息。 C++ 函数的...
    99+
    2024-04-30
    c++ 函数返回值
  • 从零到精通:C++ 函数返回值权威解读
    c++++ 函数的返回值类型指定了函数调用后的返回值类型,位于函数名后,括号前。返回值表达式是函数体中用来计算和返回函数值的表达式,通常置于 return 语句中。函数也可以抛出异常,需...
    99+
    2024-04-30
    c++ 函数返回值
  • golang可变参数是否可以用于接口类型?
    go语言中,可变参数不能直接应用于接口类型。解决方法是使用类型断言,将接口类型断言为特定的接口类型,然后使用可变参数语法。例如,定义一个printer接口,实现两个结构体consolep...
    99+
    2024-04-30
    golang 接口类型 go语言
  • C++ 函数递归详解:递归在字符串处理中的应用
    递归函数是一种在字符串处理中反复调用自身来解决问题的技术。它需要一个终止条件以防止无限递归。递归在字符串反转和回文检查等操作中被广泛使用。 C++ 函数递归详解:递归在字符串处理中的应...
    99+
    2024-04-30
    c++ 递归
  • golang函数在框架中的应用
    在 go 框架中,函数通过实现接口和使用函数指针实现代码的高内聚和低耦合:定义一个接口来指定 http 处理程序的签名。创建一个实现该接口的结构体,该结构体包含一个函数指针字段以保存 h...
    99+
    2024-04-30
    框架 golang
  • C++ 递归进阶:理解尾递归优化及其应用
    尾递归优化 (tro) 可提高特定递归调用的效率。它将尾递归调用转换为跳转指令,并将上下文状态保存在寄存器中,而不是堆栈上,从而消除对堆栈的额外调用和返回操作,提高算法效率。利用 tro...
    99+
    2024-04-30
    c++ 递归
  • 为什么golang中没有函数重载?
    go 语言中不允许函数重载,原因如下:简化编译器实现提高代码可读性避免名称冲突go 中可以使用可变参数列表或接口来实现类似函数重载的行为。 Go 中没有函数重载的原因 在 Go 语言中...
    99+
    2024-04-30
    golang 函数重载 代码可读性
  • golang 反射的未来发展和新特性解读
    go 语言反射的未来发展包括泛型、更好的错误处理和性能优化,在 go 1.18 中新增了值比较、方法集和自定义类型转换等新特性。这些特性简化了反射的使用,增强了错误处理,并支持动态调用方...
    99+
    2024-04-30
    golang 反射 用户注册
  • C++ 函数库详解:系统功能外延的实际应用案例
    c++++ 函数库通过预定义函数集合扩展了程序功能,提供了系统功能支持,包括容器、算法、流和诊断。开发人员可创建自定义函数,例如自定义排序函数,以实现特定需求,如按成绩降序排序。该函数库...
    99+
    2024-04-30
    c++ 函数库 标准库
  • 错误处理时golang函数的性能影响
    golang 中处理错误时,err != nil 性能优于 if err != nil,因为直接检查错误可以避免额外临时变量的创建,降低内存分配和垃圾回收,从而提升性能。 错误处理时 ...
    99+
    2024-04-30
    性能 golang
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作