介绍了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语句

1、单分支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

2、双分支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

3、多分支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 
#edit by www.jbxue.com
   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 
#edit by www.jbxue.com
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`."

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

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

复制代码代码如下:
#!/bin/bash 
#edit by www.jbxue.com
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 
#edit by www.jbxue.com
 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语句使用介绍的更多相关文章

  1. shell脚本编程之“最简单的死循环”【转】

    转自:http://blog.chinaunix.net/uid-23046336-id-3475462.html 在linux下编程的程序猿都知道shell脚本,就算你不怎么熟悉,也应该听过的吧!那 ...

  2. Shell脚本的条件控制和循环语句

    条件判断:if语句 语法格式: if [ expression ] then Statement(s) to be executed if expression is true fi 注意:expre ...

  3. shell脚本学习—条件测试和循环语句

    条件测试 1. 条件测试:test [ 命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假, 则命令的Exit Status为1(注意与 ...

  4. Shell脚本文件中常用的操作语句

    1. 清空文件中的内容 cat  /dev/null  >> /var/log/messages 2. 脚本中判断用户是不是root用户 ROOT_UID = 0            # ...

  5. shell 脚本 for,while,case 语句详解及案例

    ################for循环语句的结构#############使用for循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列,直到变量值用完退出循环. ...

  6. Linux之shell脚本for、while、case语句的高级用法

    1.case语句的用法: [root@ELK-chaofeng test]# cat test3.sh #!/bin/bash while true ;do read -p "please ...

  7. shell脚本程序中循环、判断语句的介绍

    shell的循环主要有3种,for,while,until shell的分支判断主要有2种,if,case 一,for循环 C/C++ Code复制内容到剪贴板 #!/bin/bash for fil ...

  8. Linux shell脚本 (十二)case语句

    case语句 case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构. case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令.case ...

  9. 《shell脚本if..then..elif..then.if语句的总结》

    第一种: #!/bin/bash service vsftpd start &> /dev/null if [ $? -eq 0 ] then echo "ftp is sta ...

随机推荐

  1. 配置phpmyadmin使登录时可填写IP管理多台MySQL 连接多个数据库 自动登录

    一.如何设置phpMyAdmin自动登录? 首先在根目录找到config.sample.inc.php复制一份文件名改为config.inc.php(如果已经存在 config.inc.php 文件, ...

  2. 网卡及MAC和PHY的区别

    转载:http://blog.sina.com.cn/s/blog_53d7350f0100mudb.html 一块以太网网卡包括OSI(开方系统互联)模型的两个层.物理层和数据链路层.物理层定义了数 ...

  3. 纯JS操作服务器绑定控件(Repeat)实现表头升降排序

    JS实现功能 var obj = function (id) { return "string" == typeof id ? document.getElementById(id ...

  4. python邮件发送接收

    接收邮件 import poplib,pdb,email,re,time from email import header POP_ADDR = r'pop.126.com' USER = '' PA ...

  5. css笔记19:浮动的案例

    案例一: 1. 首先是01.html文件: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  6. 基于BaseHTTPServer的简单存储服务器

    服务器代码: from BaseHTTPServer import BaseHTTPRequestHandler from BaseHTTPServer import HTTPServer impor ...

  7. [改善Java代码]警惕泛型是不能协变和逆变的

    什么叫做协变(covariance)和逆变(contravariance)? 在变成语言的类型框架中,协变和逆变是指宽类型和窄类型在某种情况下(如参数,泛型,返回值)替换或交换的特性,简单的说,协变是 ...

  8. 关于Talend的Patch分支对应Eclipse开发环境的配置总结.

    给产品打patch有时候会遇到很多问题,给产品打patch而且大多数是给很多老版本的Studio打,而且要有对应的patch的开发环境. 但是不巧有些patch对应的git仓库目录结构和一些其他版本的 ...

  9. 关于在Eclipse中构建patch开发环境

    git仓库中不能添加空文件夹. 至于为什么git 仓库中不能添加空文件夹,我没有找到具体的原因. 在V2EX上有人说: 我猜是因为git的内部实现,即只对文件做快照决定的吧,另一方面空文件夹确实对源代 ...

  10. sublime text使用技巧

    常用快捷键 Ctrl + L  选择整行(按住-继续选择下行) Ctrl + KK  从光标处删除至行尾 Ctrl + Shift+K  删除整行 Ctrl + Shift+D  复制光标所在整行,插 ...