Bash条件判断

bash编程之:条件判断,判定后续操作的前提条件是否满足,

bash编程之: 条件判断常用类型:

  整数测试:比较两个整数谁大谁小,是否相等;

    二元测试:

      num1 操作符 num2

      -eq: 等于

      -ne: 不等于

      -le:小于等于

      -ge:大于等于 

      -lt:小于

      -gt: 大于

  字符测试:比较两个字符串是否相等;

    双目录

           >:          大于

           <:          小于

           ==:             等于,等值比较

           =~:             左侧是字符串,右侧是一个模式,判定左侧的字符串能否被右侧的模式所匹配;通常只[[]]中使用,模式中可以使用行首、行尾锚定符;但模式不要加引导

           !=, <>:     不等于

    单目录

           -n 字符串:  字符串是否不空,不空为真,空则为假

           -z 字符串:  字符串是否为空,空则为真,不空则假

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@demo scripts] # stringA="root"
[root@demo scripts] # stringB="hello"
[root@demo scripts] # [ "$stringA" == "$stringB" ]
[root@demo scripts] # echo $?
1
[root@demo scripts] # stringB="root"
[root@demo scripts] # [ "$stringA" == "$stringB" ]
[root@demo scripts] # echo $?
0
[root@demo scripts] # userName=root
[root@demo scripts] # [[ `grep "^$userName\>" /etc/passwd | cut -d: -f7` =~ sh$ ]]
[root@demo scripts] # echo $?
0
[root@demo scripts] # userName=bin
[root@demo scripts] # [[ `grep "^$userName\>" /etc/passwd | cut -d: -f7` =~ sh$ ]]
[root@demo scripts] # echo $?
1
[root@demo scripts] # [ -n userName ]
[root@demo scripts] # echo $?
0

  文件测试:测试某个文件是否具有读权限、写权限、执行权限等;

    单目测试:

      -e file :         测试文件是否存在

      -a file :         测试文件是否存在

      -f file :         测试是否为普通文件

      -d     :            测试是否为目录文件

      -b somefile :     测试文件是否存在并且是否为一个块设备文件

      -c somefile :     测试文件是否存在并且是否为一个字符设备文件

      -h|-L somefile :     测试文件是否存在并且是否为符号链接文件

      -p somefile :     测试文件是否存在并且是否为管道文件:

      -S somefile :     测试文件是否存在并且是否为套接字文件:

      -r somefile:      测试其有效用户是否对此文件有读取权限

      -w somefile:      测试其有效用户是否对此文件有写权限

      -x somefile:      测试其有效用户是否对此文件有执行权限

      -s somefile:      测试文件是否存在并且不空

     双目测试:

      file1 -nt file2 : 测试file1是否比file2更 新一些

      file1 -ot file2 : 测试file1是否比file2更 老一些

      file1 -ef file2 :  测试file1和file2是否引用同一个文件   

bash编程之:逻辑运算:

    与运算:

      真 && 真 = 真 

      真 && 假 = 假

      假 && 真 = 假

      假 && 假 = 假

    或运算:

      真 || 真 = 真 

      真 || 假 = 真

      假 || 真 = 真

      假 || 假 = 假

    非运算:

      !真 = 假

      !假 = 真

bash编程之:组合条件测试

    与:条件1 &&条件2

      条件1为假,则最终结果一定为假,否则,条件2不予执行

      条件1为真,则最终条件结果决于后面条件,因此,条件2必须执行

    或:条件1 ||条件2

      条件1为真,则最终结果一定为真,否则,条件2不予执行

      条件1为假,则最终条件结果决于后面条件,因此,条件2必须执行

    非: 

      与的优先级大于或,或的优先级大于非

bash编程之:条件测试方法

     test 表达式

     [ 测试表达式 ]

     [[ 测试表达式 ]]

bash编程之:if条件判断使用:

    单分支:

       if 条件; then

          分支1;

       fi

    双分支:

        if 条件; then

         分支1;

        else 

         分支2;

        fi

    多分支:

        if 条件; then

          分支1;

        elif 条件2; then 

          分支2;

        elif 条件3; then 

          分支3;

           ...

        else 

          分支n;

        fi

bash编程之:命令引用:

  1.引用命令的执行结果:使用`COMMAND`或$(COMMAND)

  2.引用命令执行是否成功的状态结果:一定是直接执行命令,此时需要执行结果重定向至/dev/null

bash编程之:脚本自动退出

  exit [n] 

        0表示成功(Zero - Success)

        非0表示失败(Non-Zero  - Failure)

        2表示用法不当(Incorrect Usage)

        127表示命令没有找到(Command Not Found)

        126表示不是可执行的

 

练习:

 

  1.写一脚本,实现如下功能;

   1、让用户通过键盘输入一个用户名

   2、如果用户存在,就显示其用户名和UID;

   3、否则,就显示用户不存在;

1
2
3
4
5
6
7
8
#!/bin/bash
#
read -p "please input userName: " userName
if grep "^$userName\>" /etc/passwd & > /dev/null ; then
   echo "$userName :`id -u $userName`" ;
else
    echo "$userName is not OK !!" ;
fi

  2.写一脚本,实现如下功能;

  1、让用户通过键盘输入一个用户名,如果用户不存在就退出;

  2、如果用户的UID大于等于500,就说明它是普通用户;

  3、否则,就说明这是管理员或系统用户;

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
#
read -p "please input userName: " userName
if ! grep "^$userName\>" /etc/passwd & > /dev/null ; then
   echo "Can you speak Chinese" ;
   exit 62
fi
   i=` id -u $userName`;
if [ $i - ge 500 ]; then
   echo "The $userName is putong user" ;
else
   echo "The $userName is root user" ;
fi

  3.写一脚本,实现如下功能;

  1、让用户通过键盘输入一个用户名,如果用户不存在就退出;

  2、如果其UID等于其GID,就说它是个"good guy"

  3、否则,就说它是个“bad guy”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
#
read -p "please input userName: " userName
if ! grep "^$userName\>" /etc/passwd & > /dev/null ; then
  echo "Can you speak Chinese" ;
exit 62
fi
i=` id -u $userName`
g=` id -g $userName`
if [ $i - eq $g ]; then
  echo "$userName is good guy" ;
else
  echo "$userName is bad guy" ;
fi

4.扩展题3:判断当前系统的所有用户是goodguy 还是bad guy;

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
#
for userName in ` cut -d:-f1 /etc/passwd `; do
   i=` id -u $userName`
   g=` id -g $userName`
   if [ $i - eq $g ]; then
     echo "$userName is good guy" ;
   else
     echo "$userName is bad guy" ;
   fi
done

 5.写一个脚本,实现如下功能;

  1、添加10个用户stu1-stu10;但要先判断用户是否存在;

  2、如果存在,就用红色显示其已经存大在

  3、否则,就添加此用户;并绿色显示;

  4、最后显示一共添加了几个用户;

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
#
for i in {1..10}; do
   if grep "^stu$i\>" /etc/passwd &> /dev/null ; then
     echo -e "\033[31mstu$i\033[0m is sunflly"
   else
     useradd stu$i&& echo -e "useradd \033[32mstu$i\033[0m is suefully"
   fi
done
echo "Add $UserCount users."

6.200以为所有3的整数倍正整数的和;

1
2
3
4
5
6
7
8
#! /bin/bash
#
declare -i sum =0
for i in {1..200}; do
   if [ $i%3 = 0 ]; then
     let sum =$ sum +$i;
   fi
done

7.让用户指定一个文件,判定:如果文件有空白行,就显示空白行数;否则,就说明无空白行;

1
2
3
4
5
6
7
8
9
#! /bin/bash
#
read -p "Enter a file path: " filename
if grep "^&" $filename &> /dev/null ; then
   linesCount=` grep "^&" $filename | wc -l`
   echo "$filename has $linesCount space lines."
else
   echo "$filename hace no space lines."
fi

8.判定两个数孰大孰小,整数是通过命令行参数传递而来;

1
2
3
4
5
6
7
#! /bin/bash
#
if [ $1 -gt $2 ]; then
   echo "The max num is $1."
else
   echo "The max num is $2."
fi

9.判定所有用户是否拥有可登录shell;

1
2
3
4
5
6
7
8
9
#! /bin/bash
#
for userName in ` cut -d: -f1 /etc/passwd `; do
     if [[ ` grep "^$userName\>" /etc/passwd | cut -d: -f7` =~ sh$ ]]; then
         echo "login user: $userName"
     else
         echo "nologin user: $userName"
     fi
done

10.写一脚本,实现如下功能:

    1、让用户交互式输入一个用户名,先判断用户是否存在;不存在则以7退出

    2、判断用户的shell是否为/bin/bash;如果是,则显示为"bash user.",退出码为0,否则显示为"Not bash user.",退出码为1。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#! /bin/bash
#
read -t 3 -p "Enter Input UserName " userName
  
if ! id $userName &> /dev/null ; then
     echo "No such user."
     exit 7
fi
  
userShell=` grep "^$userName\>" /etc/passwd | cut -d: -f7`
  
if [[ "$userShell" == "/bin/bash" ]]; then
     echo "bash user."
     returnValue=0
else
     echo "Not bash user."
     returnValue=1
fi
  
exit $returnValue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /bin/bash
#
read -t 5 -p "Enter Input UserName: " UserName
if [[ $UserName != ` grep "^$UserName"  /tmp/passwd | cut -d: -f1` ]]; then
     echo "No Such $UserName."
     exit 7
elif [[ ` grep "^$UserName"  /tmp/passwd | cut -d: -f7` =~ sh$ ]]; then
     
        echo "$UserName is bash user."
         exit 0
else
         echo "$UserName Not bash user."
         exit 1
fi

11.写一个脚本,实现如下功能;

      1、显示如下菜单:

           CPU) show cpu info;

           men) show memory info;

           quit) quit

           Enter your option:

      2、如果用户选择CPU,则显示文件/proc/cpuinfo的信息;

      3、如果用户选择mem,则显示文件/proc/meminfo的信息;

      4、如果用户选择quit,则退出,且退出码为5;

      5、如果用户键入其它字符,则显示未知选项,请重新执行脚本;退出码为6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#! /bin/bash
#
echo "CPU)Show Cpu Info: "
echo "Men)Show Memory info: "  
echo "quit)quit "
  
read -t 5 -p "Enter your Chooise Option:" Chooise
  
if [[ $Chooise == CPU ]]; then
         echo ` cat /proc/cpuinfo `
elif [[ $Chooise == Men ]]; then
         echo ` cat /proc/meninfo `
else
         exit 6
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#! /bin/bash
#
cat <<EOF
cpu) print cpu infomation
men) print memory infomation
quit) Quit
EOF
      
returnValue=0
  
read -t 3 -p "Enter your option " userOption
userOption=` echo $userOption | tr 'a-z' 'A-Z' `
  
if [[ $userOption == "CPU" ]]; then
     cat /proc/cpuinfo
elif [[ $userOption == "MEM" ]]; then
     cat /proc/meminfo
elif [[ $userOptin == "QUIT" ]]; then
     echo "Quit"
     returnValue=6
else
     echo "Unkown Option"
     returnValue=7
fi
  
exit $returnValue

  12.写一个脚本,实现如下功能;

    1.分别复制/var/log/下的文件至/tmp/log目录中;

    2.复制目录时,使用cp -r;

    3.复制文件时,使用cp;

    4.复制链接文件时,使用cp -d;

    5.余下的类型,使用cp -a;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /bin/bash
#
targetDir= '/tmp/logs'
 
[ -e $targetDir ] || mkdir $targetDir
for fileName in /var/log/ *; do
   if [ -d $fileName ]; then
     copyCommand= 'cp -r'
   elif [ -f $fileName ]; then
     copyCommand= 'cp'
   elif [ -h $fileName ]; then
     copyCommand= 'cp -d'
   else
     copuCommand= 'cp -a'
   fi
 
   $copyCommand $fileName $targetDir
done

  13.写一个脚本,实现如下功能;

    1.其使用形式如下所示;

      script.sh{start|stop|restart|status}

    2.如果参数为空,则显示帮助信息,并退出脚本;

    3.如果参数为start,则创建空文件/tmp/scipt,并显示starting script successfully;mp

    4.如果参数为stop,则删除文件/tmp/script,并显示stop script succesfully;

    5.如果参数为restart,则删除文件/tmp/script并重新创建,而后显示Rstart script successfully;

    6.如果参数为status,那么

      如果文件/tmp/script存在,则显示Script is running...,否则,则显示Script is stoped;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#! /bin/bash
#
Dir= /tmp/script
 
if ! [[ $1 =~ [startstoprestartstatus] ]]; then
   echo "script.sh{start|stop|restart|status"
elif [ $1 == start ]; then
   mkdir $Dir && echo "Starting Script Successfully.."
elif [ $1 == stop ]; then
   rm -rf $Dir && echo "Stop Script Successfully..."
elif [ $1 == restart ]; then
   rm -rf $Dir && mkdir $Dir &&  echo "Stop Script Successfully..."
elif [ $1 == status ]; then
   if [ -e $Dir ]; then
     echo "Script is running..."
   else
     echo "Script is stoped..."
   fi
fi

  14.写一个脚本,实现如下功能;

    1.使用形式如下:userinfo.sh -u username [-v {1|2}]

    2.-u选项用于指定用户,而后脚本显示用户UID和GID;

    3.如果同时使用了-v选项;

      -v后面的值如果是1,则额外显示用户的家目录路径;

      -v后面的值如果是2,则额外显示用户的家目录路径和shell;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#! /bin/bash
#
 
[ $ # -lt 2 ] && "Too less argements,quit..." && exit 5
 
if [[ "$1" == "-u" ]]; then
   userName= "$2"
   shift 2
fi
 
if [ $ # -ge 2 ] && [ "$1" == "-v" ]; then
   verFlag=$2
fi
 
# echo $userName &verFlag
 
verFlag=${verFlag:-0}
if [ -n $verFlag ]; then
   if ! [[ $verFlag =~ [012] ]]; then
     echo "Wrong Parameter."
     echo "Usage: `basename $0` -u userName -v {1|2}"
     exit 4
   fi
fi
 
if [ $verFlag - eq 1 ]; then
   grep "^$userName" /etc/passwd | cut -d: -f1,3,4,6
elif [ $verFlag - eq 2 ]; then
   grep "^$userName" /etc/passwd | cut -d: -f1,3,4,6,7
else
   grep "^$userName" /etc/passwd | cut -d: -f1,3,4
fi

 



转载于:https://www.cnblogs.com/Saviorsyang/p/5734492.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值