18、bash脚本编程之四 字符串测试,组合测试及for循环

练习:

传递一个用户名参数给脚本,判断此用户的用户名跟其基本组的组名是否一致,并将结果显示出来。

18.1 字符(串)测试:

    ==:测试是否相等,相等为真,不等为假(等号两端必须要加空格)

    !=: 测试是否不等,不等为真,等为假

    >:测试一个字符串是否大于另外一个字符串

    <:测试一个字符串是否小于另外一个字符串

    -n string: 测试指定字符串是否为空,空则真,不空则假

    -z string: 测试指定字符串是否不空,不空为真,空则为假

    [root@Daniel-R480 ~]# A=hello

    [root@Daniel-R480 ~]# B=hi

    [root@Daniel-R480 ~]# [ "$A"=="B" ]

    [root@Daniel-R480 ~]# echo $?

    0

    [root@Daniel-R480 ~]# [ "$A" == "B" ]

    [root@Daniel-R480 ~]# echo $?

    1

    [root@Daniel-R480 ~]# [ "$A" = "$B" ]

    [root@Daniel-R480 ~]# echo $?

    1

    #‘’代表着直接对比A和B

    [root@Daniel-R480 ~]# [ '$A' = '$B' ]

    [root@Daniel-R480 ~]# echo $?

    1

    [root@Daniel-R480 ~]# [ "$A" = "$B" ]

    [root@Daniel-R480 ~]# echo $?

    1

    [root@Daniel-R480 ~]#

    [root@Daniel-R480 ~]# [ "$A" != "$B" ]

    [root@Daniel-R480 ~]# echo $?

    0

    [root@Daniel-R480 ~]#

练习:写一个脚本

    传递一个参数(单字符就行)给脚本,如参数为q,就退出脚本;否则,就显示用户的参数;

练习:写一个脚本

    传递一个参数(单字符就行)给脚本,如参数为q、Q、quit或Quit,就退出脚本;否则,就显示用户的参数;

    #!/bin/bash

    #

    if [ $1 = 'q' ];then

      echo "Quiting..."

      exit 1

    elif [ $1 = 'Q' ];then

      echo "Quiting..."

      exit 2  

    elif [ $1 = 'quit' ];then

      echo "Quiting..."

      exit 3 

    elif [ $1 = 'Quit' ];then

      echo "Quiting..."

      exit 4  

    else

      echo $1

    fi

18.2 组合测试条件

    -a: 与关系

    -o: 或关系

    !: 非关系

    if [ $# -gt 1 -a $# -le 3 ]

    if [ $# -gt 1 ] && [ $# -le 3 ]

    q, Q, quit, Quit

练习:

传递三个参数给脚本,第一个为整数,第二个为算术运算符,第三个为整数,将计算结果显示出来,要求保留两位精度。形如:

./calc.sh 5 / 2

练习:

传递3个参数给脚本,参数均为用户名。将此些用户的帐号信息提取出来后放置于/tmp/testusers.txt文件中,并要求每一行行首有行号。

写一个脚本:

判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。

如果其生产商为AuthenticAMD,就显示其为AMD公司;

如果其生产商为GenuineIntel,就显示其为Intel公司;

否则,就说其为非主流公司;

写一个脚本:

给脚本传递三个整数,判断其中的最大数和最小数,并显示出来。

MAX=0

MAX -eq $1

MAX=$1

MAX -lt $2

MAX=$2

18.3 for循环

    循环:进入条件,退出条件

    for

    while

    until

    for 变量 in 列表; do

      循环体

    done

    for I in 1 2 3 4 5 6 7 8 9 10; do

      加法运算

    done

    遍历完成之后,退出;

如何生成列表:

(1){1..100}:直接通过数字列表

(2)`seq [起始数 [步进长度]] 结束数`:通过seq命令

    [root@Daniel-R480 ~]# seq 3

    1

    2

    3

    [root@Daniel-R480 ~]# seq 5 10

    5

    6

    7

    8

    9

    10

    [root@Daniel-R480 ~]# seq 2 2 10

    2

    4

    6

    8

    10

    [root@Daniel-R480 ~]#

    #!/bin/bash

    #

    declare -i SUM=0

    for I in {1..100};do

        let SUM=$[$SUM+$I]

    done

    echo "The sum is : $SUM"

    1,...,100

    declare -i SUM=0

        integer

        -x

写一个脚本:

1、设定变量FILE的值为/etc/passwd

2、依次向/etc/passwd中的每个用户问好,并显示对方的shell,形如:  

    Hello, root, your shell: /bin/bash

    [root@Daniel-R480 ~]# for I in `seq 1 $LINES`; do echo "Hello, `head -n $I /etc/passwd | tail -1 | cut -d: -f1`"; done

    Hello, root

    Hello, bin

    Hello, daemon

    Hello, adm

    Hello, lp

    Hello, sync

    Hello, shutdown

    Hello, halt

    Hello, mail

    Hello, operator

    Hello, games

    Hello, ftp

    Hello, nobody

    Hello, systemd-network

    Hello, dbus

    Hello, polkitd

    Hello, rpc

    Hello, rpcuser

    Hello, nfsnobody

    Hello, sshd

    Hello, postfix

    Hello, chrony

    Hello, daniel

    Hello, daniel

    Hello, daniel

    Hello, daniel

    Hello, daniel

    Hello, daniel

    Hello, daniel

3、统计一共有多少个用户

    for I in `seq 1 $LINES`; do echo "Hello, `head -n $I /etc/passwd | tail -1 | cut -d: -f1`"; done

    只向默认shell为bash的用户问声好

写一个脚本:

1、添加10个用户user1到user10,密码同用户名;但要求只有用户不存在的情况下才能添加;

    #!/bin/bash

    #

    for I in {1..10};do

            if id user$I &>/dev/null; then

               echo "user$I exists."

            else

               useradd user$I

               echo user$I | passwd --stdin user$I &> /dev/null

            fi

    done

    #!/bin/bash

    #

    for I in {1..10}; do

            if id user$I &>/dev/null; then

              userdel -r user$I

              echo "Delete user$I finished."

            else

              echo "user$I not exist."

            fi

    done

扩展:

接受一个参数:

add: 添加用户user1..user10

del: 删除用户user1..user10

其它:退出

    #!/bin/bash

    #

    if [ $# -lt 1 ];then

            echo "Usage; adminusers --ARG"

            exit 7

    fi

    if [ $1 == '--add' ];then

      for I in {1..10}; do

            if id user$I &> /dev/null; then

              echo "user$I exists."

            else

              useradd user$I

              echo user$I | passwd --stdin user$I &> /dev/null

              echo "Add user$I finished."

            fi

       done

    elif [ $1 == '--del' ]; then

       for I in {1..10};do

         if id user$I &> /dev/null;then

          userdel -r user$I

          echo "Delete user$I finished."

         else

          echo "No user$I."

         fi

       done

    else

       echo "Unknown ARG"

       exit 8

    fi

设置adminusers user1,user2,user3,hello,hi

    #!/bin/bash

    #

    if [ $1 == '--add' ]; then

      for I in `echo $2 | sed 's/,/ /g'`;do

        if id $I &> /dev/null;then

          echo "$I exists."

        else

          useradd $I

          echo $I | passwd --stdin $I &> /dev/null

          echo "add $I finished."

         fi

       done

    elif [ $1 == '--del' ]; then

      for I in `echo $2 | sed 's/,/ /g'`;do

        if id $I &> /dev/null;then

            userdel -r $I

            echo "Delete $I finished."

        else

            echo "$I NOT exist."

        fi

      done

    elif [ $1 == '--help' ]; then

       echo "Usage:adminuser2.sh --add USER1,USER2,... | --del USER1,USER@@,..."

    else

      echo "Unknown options."

    fi

写一个脚本:

计算100以内所有能被3整除的正整数的和;

取模,取余:%

3%2=1

100%55=45

写一个脚本:

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

18.4 let命令和数据计算

    let命令

    let I=$[$I+1]

    SUM=$[$SUM+$I]和let SUM+=$I是一个意思

    let I+=1 相当于 let I++

    [root@Daniel-R480 ~]# I=3

    [root@Daniel-R480 ~]# let I++

    [root@Daniel-R480 ~]# echo $I

    4

    [root@Daniel-R480 ~]# let I++

    [root@Daniel-R480 ~]# echo $I

    5

    -=:表示=-相对应的数值

    let I-=1 相当于 let I--

    ++I, --I

    *=:表示=*相对应的数值

    /=:表示=/相对应的数值

    %=:表示=%(取余)相对应的数值

写一个脚本,

分别显示当前系统上所有默认shell为bash的用户和默认shell为/sbin/nologin的用户,并统计各类shell下的用户总数。显示结果形如:

    BASH,3users,they are:

    root,redhat,gentoo

    NOLOGIN, 2users, they are:

    bin,ftp

    #!/bin/bash

    #

    NUMBASH=`grep "bash$" /etc/passwd | wc -l`

    BASHUSERS=`grep "bash$" /etc/passwd | cut -d: -f1`

    BASHUSERS=`echo $BASHUSERS | sed 's@[[:space:]]@,@g'`

    echo "BASH, $NUMBASH users, they are:"

    echo "$BASHUSERS

Comments Closed.