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

Bash条件判断的更多相关文章

  1. (转)bash条件判断之if语句

    http://blog.51cto.com/64314491/1629175---------bash条件判断之if语句(一) http://blog.51cto.com/64314491/16292 ...

  2. bash脚本编程之二 条件判断and 逻辑运算

    1.条件测试结构 1) if/then结构: 判断命令列表的退出码是否为0,0为成功. 如果if和then在条件判断的同一行上的话, 必须使用分号来结束if表达式: if和then都是关键字. 关键字 ...

  3. 完全总结bash中的条件判断test [ [[ 使用

    在bash脚本编程中,我们经常做一些条件判断, 我们主要用到了三种,test,单中括号,双中括号 经常有看到不同的写法,如: [ $? –eq ] [[ $myvar == “mysql” ]] te ...

  4. bash Shell 中如何实现条件判断之if判断

    http://blog.51cto.com/lovelace/1211353 bash中如何实现条件判断?条件测试类型:    整数测试    字符测试    文件测试 一.条件测试的表达式:     ...

  5. 5-3 bash脚本编程之二 条件判断

    1. 条件测试的表达式 1. [ expression ]  :注意这个中括号的前后都有一个空格 2. [[ expression ]] 3. test expression 2.条件判断的类型 1. ...

  6. shell条件判断与流程控制

    一 条件判断式语句 1.按文件类型进行判断 测试类型 作用 -b 文件 判断文件是否存在,并且是否为块设备文件(是块设备文件为真) -c 文件 判断文件是否存在,并且是否为字符设备文件(是字符设备设备 ...

  7. 【重点】Shell入门教程:流程控制(2)条件判断的写法

    第三节:条件判断的写法 if条件判断中,if的语法结构中的“条件判断”可以有多种形式.测试结果是真是假,就看其传回的值是否为0. 条件测试的写法,有以下10种: 1.执行某个命令的结果 这里的命令,可 ...

  8. 【重点】Shell入门教程:流程控制(3)条件判断式的真假值

    之前曾提到,在Bash中什么是真什么是假,是以命令的结束状态是否为0来做判断.传回0,即为真:传回非0,即为假. 在Bash中,这种可以影响程序流程的式子,称为条件判断式.判断式的操作数分成“单元”及 ...

  9. [Shell]条件判断与流程控制:if, case, for, while, until

    ---------------------------------------------------------------------------------------------------- ...

随机推荐

  1. 关于lwip移植到ucsos-ii平台的遇到的问题(一)

    移植的步骤参照<Day_Day_Up笔记之uCOS-II_LwIP_在_STM32F107_上移植>,<uCOS平台下的LwIP移植笔记>,<嵌入式网络那些事>. ...

  2. http状态消息

    1-5状态码了解 1XX 表示信息(消息) 2XX 表示成功 3XX 表示重定向 4XX 表示请求错误 *** 5XX 表示服务端错误 常见状态码 200 请求成功 一切正常 301 重定向,修改后的 ...

  3. sql转db,后台坑货

    打开 创建一个db文件然后点击文件--新建---Sqlite 导入空db成功后点击左侧栏 点击表 点击右上角+号把sql文件的语句复制粘贴到 然后点击运行,运行完成后保存ok

  4. 第二篇——The communication during software engineering.

    I've learned a lot in my software engineering class about how a program comes out.That's also a esse ...

  5. 细说JAVA反射

    Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性.例如,使用它能获得 Java 类中各成员的名称并显 ...

  6. NLog的使用

    1.项目添加NLog的项目引用: 2.将工程的framework框架改为3.5或4.0,将配置文件[NLog.config]拷贝至运行的bin/(release/debug)路径下 3.项目中代码使用 ...

  7. valueForKeyPath常用用法

    valueForKeyPath和valueForKey有一些类似,但也有一些不同的地方.这里就简单说一下valueForKeyPath一些不同的地方. 举例来说: 1.valueForKeyPath可 ...

  8. 构造一个简单的Linux系统MenuOS

    陈智威20135125 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验指导 ...

  9. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  10. 胡说REST(REpresentational State Transfer)

    Roy T. Fielding的2000年在他的博士论文中提出REpresentational State Transfer这一软件架构风格,相比"表述性状态转移"等等类似的拗口的 ...