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

本站所有内容来自互联网收集,仅供学习和交流,请勿用于商业用途。如有侵权、不妥之处,请第一时间联系我们删除!Q群:迪思分享

免费资源网 – https://freexyz.cn/

上部:

面向过程:

顺序执行

选择执行: 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

免费资源网 – https://freexyz.cn/


© 版权声明
THE END
★喜欢这篇文章吗?喜欢的话,麻烦动动手指支持一下!★
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容