shell脚本编程之for语句、if语句使用介绍

           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
 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`."


2、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


你可能感兴趣的:(密码,用户名)