shell 脚本编程之for语句、if语句(2 )

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


你可能感兴趣的:(if语句,FOR语句)