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: " userNameif 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: " userNameif ! grep "^$userName\>" /etc/passwd & > /dev/null;then echo "Can you speak Chinese"; exit 62fi 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: " userNameif ! grep "^$userName\>" /etc/passwd & > /dev/null;then echo "Can you speak Chinese";exit 62fii=`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"; fidone |
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" fidoneecho "Add $UserCount users." |
6.200以为所有3的整数倍正整数的和;
|
1
2
3
4
5
6
7
8
|
#! /bin/bash#declare -i sum=0for i in {1..200};do if [ $i%3 = 0 ];then let sum=$sum+$i; fidone |
7.让用户指定一个文件,判定:如果文件有空白行,就显示空白行数;否则,就说明无空白行;
|
1
2
3
4
5
6
7
8
9
|
#! /bin/bash#read -p "Enter a file path: " filenameif 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" fidone |
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 7fi userShell=`grep "^$userName\>" /etc/passwd | cut -d: -f7` if [[ "$userShell" == "/bin/bash" ]]; then echo "bash user." returnValue=0else echo "Not bash user." returnValue=1fi 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: " UserNameif [[ $UserName != `grep "^$UserName" /tmp/passwd | cut -d: -f1` ]]; then echo "No Such $UserName." exit 7elif [[ `grep "^$UserName" /tmp/passwd | cut -d: -f7` =~ sh$ ]]; then echo "$UserName is bash user." exit 0else echo "$UserName Not bash user." exit 1fi |
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 6fi |
|
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 <<EOFcpu) print cpu infomationmen) print memory infomationquit) QuitEOF returnValue=0 read -t 3 -p "Enter your option " userOptionuserOption=`echo $userOption | tr 'a-z' 'A-Z'` if [[ $userOption == "CPU" ]]; then cat /proc/cpuinfoelif [[ $userOption == "MEM" ]]; then cat /proc/meminfoelif [[ $userOptin == "QUIT" ]]; then echo "Quit" returnValue=6else echo "Unkown Option" returnValue=7fi 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 $targetDirfor 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 $targetDirdone |
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/scriptif ! [[ $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..." fifi |
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 5if [[ "$1" == "-u" ]]; then userName="$2" shift 2fiif [ $# -ge 2 ] && [ "$1" == "-v" ]; then verFlag=$2fi# echo $userName &verFlagverFlag=${verFlag:-0}if [ -n $verFlag ]; then if ! [[ $verFlag =~ [012] ]]; then echo "Wrong Parameter." echo "Usage: `basename $0` -u userName -v {1|2}" exit 4 fifiif [ $verFlag -eq 1 ]; then grep "^$userName" /etc/passwd | cut -d: -f1,3,4,6elif [ $verFlag -eq 2 ]; then grep "^$userName" /etc/passwd | cut -d: -f1,3,4,6,7else grep "^$userName" /etc/passwd | cut -d: -f1,3,4fi |
Bash条件判断的更多相关文章
- (转)bash条件判断之if语句
http://blog.51cto.com/64314491/1629175---------bash条件判断之if语句(一) http://blog.51cto.com/64314491/16292 ...
- bash脚本编程之二 条件判断and 逻辑运算
1.条件测试结构 1) if/then结构: 判断命令列表的退出码是否为0,0为成功. 如果if和then在条件判断的同一行上的话, 必须使用分号来结束if表达式: if和then都是关键字. 关键字 ...
- 完全总结bash中的条件判断test [ [[ 使用
在bash脚本编程中,我们经常做一些条件判断, 我们主要用到了三种,test,单中括号,双中括号 经常有看到不同的写法,如: [ $? –eq ] [[ $myvar == “mysql” ]] te ...
- bash Shell 中如何实现条件判断之if判断
http://blog.51cto.com/lovelace/1211353 bash中如何实现条件判断?条件测试类型: 整数测试 字符测试 文件测试 一.条件测试的表达式: ...
- 5-3 bash脚本编程之二 条件判断
1. 条件测试的表达式 1. [ expression ] :注意这个中括号的前后都有一个空格 2. [[ expression ]] 3. test expression 2.条件判断的类型 1. ...
- shell条件判断与流程控制
一 条件判断式语句 1.按文件类型进行判断 测试类型 作用 -b 文件 判断文件是否存在,并且是否为块设备文件(是块设备文件为真) -c 文件 判断文件是否存在,并且是否为字符设备文件(是字符设备设备 ...
- 【重点】Shell入门教程:流程控制(2)条件判断的写法
第三节:条件判断的写法 if条件判断中,if的语法结构中的“条件判断”可以有多种形式.测试结果是真是假,就看其传回的值是否为0. 条件测试的写法,有以下10种: 1.执行某个命令的结果 这里的命令,可 ...
- 【重点】Shell入门教程:流程控制(3)条件判断式的真假值
之前曾提到,在Bash中什么是真什么是假,是以命令的结束状态是否为0来做判断.传回0,即为真:传回非0,即为假. 在Bash中,这种可以影响程序流程的式子,称为条件判断式.判断式的操作数分成“单元”及 ...
- [Shell]条件判断与流程控制:if, case, for, while, until
---------------------------------------------------------------------------------------------------- ...
随机推荐
- java语言程序设计(一)-2
(一)jdk安装及环境变量配置 1.jdk下载 下载地址http://www.oracle.com/technetwork/java/javase/downloads/index.html,下载SE标 ...
- Ubuntu下mysql-server的安装
(1)更新 #apt-get update (2)安装 #apt-get install mysql-server 出现窗口设置"root"用户的密码为"456456&q ...
- 2014优秀的好用的20款免费jQuery插件推荐
2013 年最好的 20 款免费 jQuery 插件,世界买家网 www.buyerinfo.biz在这里分享给大家 这些插件对设计者和开发者都有很大的帮助,希望大家能够喜欢:) 现 今互联网市场上提 ...
- break continue 区别 以及实例
不论是MATLAB.c/c++.c#还是其他类型的编程语言,我们总是避免不了和for循环以及switch语句打交道,而对循环进行优化的时候,又总是避免不了用到break以及continue来控制循环, ...
- java.io.IOException: Cannot run program "jad"
今天调试google tag manager, 需要看看google analytics source code,无奈没有源码,装个一个插件ejad 还是不行: java.io.IOException ...
- 界面绚丽的SharePoint仪表盘控件Nevron Gauge for SharePoint 控件详细介绍
Nevron .NET Vision 是一款用于创建独特的.强大的数据表示应用程序的最终控件,它具有超强的数据可视化性能. 整合了Nevron Chart for .NET, Nevron Diagr ...
- Javascript常用方法函数收集(一)
1.字符串长度截取 function cutstr(str, len) { var temp, icount = 0, patrn = /[^\x00-\xff]/, strre = "&q ...
- js字符拼接
for (var j = 0; j < 9; j++) { eval("if (datas[i].b" + j + " == '1') { b[j-1] = 1; ...
- adb -s emulator-5554 install JDKCast-PAP.apk
multi-emulators direct to install app adb -s emulator-5554 install JDKCast-PAP.apk
- C语言状态机模板
转载声明:如果转载本博客内容,请联系869119842@qq.com,获得作者书面授权. 前言 上一篇我的博客中探讨了一种非swtich-case结构的状态机写法,但是个人感觉写起来比较麻烦,如果增加 ...