bash编程之条件判断,if语句!

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

条件判断的常用测试类型:

1整数测试:比较数值大小,然后判定是否符合条件

2字符测试:比较字符串(是否一样,字符串大小,是否为空),然后判定是否符合条件

3文件测试:判断文件是否存在,文件是否为目录,文件是什么类型

 

布尔值:

真,假

逻辑运算:

与运算:有假结果为假

真 && 真 = 真

真 && 假 = 假

假 && 真 = 假

假 && 假 = 假

或运算:有真结果为真

真 || 真 = 真

真 || 假 = 真

假 || 真 = 真

假 || 假 = 假

非运算:取反运算

! 真 = 假

! 假 = 真

 

 bash中条件判断使用if:会根据条件进行判断结果为真或为假

单分支:

if 条件; then   #如果条件满足执行分支1;不满足就退出

分支1; 

fi

 

双分支:#如果条件满足执行分支1,不满足就执行分支2

if 条件; then   

分支1;

else

分支2;

fi

 

多分支:如果条件1满足执行分支1,如果条件2执行分支2,如果条件3满足执行分支3,

if 条件1; then

分支1;

elif 条件2; then

分支2;

elif 条件3; then

分支3;

...

else

分支n;

fi

 

bash中如何做测试:

test:比较表达式, 测试运算.任何命令的执行结果也可以做测试对于命令状态返回值0为真,其余都为假

格式有三种:test EXPRESSION

                     [ EXPRESSION ]两端有必须空格 一个括号和test命令一样,

                     ` EXPRESSION `两个括号表示关键字

 

条件测试:

只要命令用作条件,就表示引用是其状态结果(即执行成功与否),而非命令的输出结果,因此,不能使用命令替换符``

练习:让用指定一个文件,判定:

如果文件有空白行,就显示空白行数;

#!/bin/bash

#

read -p "Enter a file path: " fileName  ##让用户输入一个文件赋值给fileName变量,实验开始的时候加了$符号一直执行不了脚本,一直没找到原因,READ命令是复制给变量,加了$就变成引用变量了,所以会一直执行不下去

 

if grep "^$" $fileName &> /dev/null; then   #执行grep查找fileName变量文件中是否有空白行,执行结果丢入位桶,因为只使用命令的执行状态返回值,没有使用命令的执行结果所以不用加``.

linesCount=`grep "^$" $fileName | wc -l`  #取空白行数的命令结果赋值给变量

echo "$fileName has $linesCount space lines."  #

fi

 

wKiom1O_nffAg0tJAAGfKq8ttd8647.jpg

 

练习:让用指定一个文件,判定:

如果文件有空白行,就显示空白行数;否则,就说明文件无空白行;

#!/bin/bash

#

read -p "Enter a file path: " fileName #提示用户输入文件路径,并赋值给fileName

 

if grep "^$" $fileName &> /dev/null; then  #用grep判断变量fileName文件中是否有空白行,如果有就执行下面语句1

        linesCount=`grep "^$" $fileName | wc -l`  #用wc -l命令读取grep命令判断fileName中有多少空白行

        echo "$fileName has $linesCount space lines."

else  #如果if处命令返回值为假则执行语句2

     echo "$fileName hava no space line."

fi

 

wKiom1O_nvnDJOn1AAB7diSysUg885.jpg

 

bash编程之:整数测试

二元测试:比较两个数

num1 OPRAND num2  

OPRAND比较操作符

    -gt: 大于[ $num1 -gt $num2 ]第一个大于第二个数为真,否则为假

    -lt: 小于

    -ge:大于等于

    -le: 小于等于

    -ne: 不等于

    -eq: 等于

 

练习:判定两个数孰大孰小,整数是通过命令行参数传递而来。

条件判断中[]号一定要加空格,中括号表示执行判断要加空格

#!/bin/bash

#

if [ $# -lt 2 ];then   #如果脚本参数的个数$#少于2个则提示用户

   echo "stupid..."

   echo "`basename $0` argu1 argu2"  #用basename取脚本本身$0的基名(显示脚本文件名),提示用户提供2个参数

   exit 4  #给定执行状态返回值

fi

 

if [ $1 -gt $2 ]; then   

echo "The max num is $1."

else

echo "The max num is $2."

fi

exit 6

 

wKioL1O_oWGDokxdAAFw_1FOr2k053.jpg

 

bash知识点:只要命令用作条件,就表示引用是其状态结果(即执行成功与否),而非命令的输出结果,因此,不能使用命令替换符;

bash知识点之脚本自定义退出:

脚本状态返回值:脚本执行的最后一条命令的状态返回值,所以需要自定义脚本返回值exit n:n为一个数字,

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

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

if id $userName &> /dev/null  #取命令返回状态.if会根据状态返回值判断.

if [ `id -u $userName` -eq 0 ] #取命令执行结果执行成功为真,失败为假!

 

练习1:写一脚本,实现如下功能:

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

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

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

   判断用户是否存在 

grep "^root\>" /etc/passwd

id root

练习2:写一脚本,实现如下功能:

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

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

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

练习3:写一脚本,实现如下功能:

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

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

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

 

 

答案1:

 

wKiom1O_zaWC7XQjAAG8XuMYQlY520.jpg

 

 

 

答案2:

 

wKiom1PA5tCiiY9iAAKO_CuPdZU383.jpg

 

 

 

答案3:

wKioL1PA6U7yEoI2AADZa09Q8vo334.jpg

 

 

 

扩展:判断当前系统上的所有用户是Good guy还是Bad guy.

 

wKiom1PA6hqCfJGIAACGSccPQV8755.jpg


 

 

 

 

bash的知识点:

组合条件测试:对条件做逻辑运算,

&&和||被称为短路条件符

与:条件1 && 条件2 如果条件1满足则执行条件2

条件1为假,则最终结果一定为假,因此,条件2将不执行;

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

或:条件1 || 条件2  如果条件1不满足则执行条件2

条件1为真,则最终结果一定为真,因此,条件2将不再执行;

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

非: ! 条件 条件失败了则执行后面的语句!

#userName=root

#id $userName && echo "$userName exist"  #先执行id命令,如果id $userName 执行失败,就不执行&&后面的echo命令,最终结果就是失败;如果id命令执行成功,则最终结果取决于echo命令执行的成功与否.echo必须执行

#id $userName && echo "$userName exist" || echo "$userName exist"  #如果条件1满足则执行条件2,如果条件1不满足,则执行条件3

 

wKiom1PA8nTT2o1gAADXzldzyvY735.jpg

 

bash编程之:字符测试:判断某个字符串能否被模式匹配到,变量尽量加""号,以免报错

双目:对字符串进行排序判断

>: 大于

<: 小于

==: 等于,等值比较

!=, <>:不等于

 

wKiom1PA-ejgtEq9AACFD90pDx0576.jpg

 

=~:左侧是字符串,右侧是一个模式,判定左侧的字符串能否被右侧的模式所匹配;通常只在[[]]中使用;

模式中可以使用行首、行尾锚定符;但模式中不要加引号;

#[[ "stringA"=~ ot ]]

#userName=root

#[[ `grep "^$userName\>" /etc/passwd |cut -d: -f7` =~ sh$ ]]

#echo $?

 

wKioL1PA-MeQ4UfkAABvQkl0KWY753.jpg

 

单目:判断一个字符串是否为空

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

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

 

wKiom1PA-lqjswixAAAxoBWoSLQ827.jpg

 

  

bash知识点:文件测试

[]

[[]]

test

 

单目测试:

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

 

wKioL1PA_uXz_--OAAA2tHy6kHg682.jpg

 

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

-f /path/to/file: 测试是否为普通文件;是为真,否则为假

 

wKioL1PA_yTyAAugAAArhKO_y9s636.jpg

 

-d /path/to/somefile: 测试是否为目录文件;

 

wKiom1PA_5_Su93PAAArnJoDZr8088.jpg

 

-b /path/to/somefile: 测试文件是否存在并且是否是一个块设备文件; 

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

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

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

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

-r /path/to/somefile: 测试其有效用户(当前用户)是否对此文件有读取权限;

 

wKiom1PA__eDzON1AAA1Xrdau6A850.jpg

 

-w 测试其有效用户(当前用户)是否对此文件有写权限

 

wKioL1PA__OQ2wpUAAAulc1dz7s295.jpg

 

-x 测试其有效用户(当前用户)是否对此文件有执行权限

 

wKiom1PBAFLTZ3ctAAAnoUuFdpw842.jpg

 

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

 

wKioL1PBAFGAX9W_AAAmQQaPkio960.jpg

 

双目测试:

file1 -nt file2: 测试file1是否为file2更 新一些;file1存在,file2不存在,file1更新

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

file1 -ef file2: 测试file1是否为file2引用的同一个设备;

    

wKiom1PA_I7DTLsXAACdCMGaN34449.jpg

 

 

 

 

bash的知识点:位置参数轮替(shift)

  

写一个脚本:使用形式如下

userinfo.sh -u username [-v {1|2}]

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

如果同时使用了-v选项:

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

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

#!/bin/bash

#

[ $# -lt 2 ] && echo "Too less argements, quit" && exit 3

##首先测试脚本文件参数是否小于2,&&如果小于2提示参数不够,&&退出码3

if [[ "$1" == "-u" ]];then userName="$2"

shift 2

fi

##如果参数1字符测试为"-u" ,参数2就复制给useName变量,执行成功就去掉前两个参数

if [ $# -ge 2 ] && [ "$1" == "-v" ]; then

verFlag=$2

fi

##如果剩下的脚本参数等2个, 并且剩下的脚本参数1字符测试为"-v" ,就将参数2赋值给变量"verFlag"

verFlag=${verFlag:-0}

##给变量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

##判断变量verFlag不为空,结果为真;执行取反判断变量verFlag的值不是"012"中的一个,结果为真;显示错误提示信息,并提示文件参数的输入格式

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

##执行判断变量verFlag为1,显示用户的家用户名,UID,GID,目录路径;

##执行判断变量verFlag为2, 则显示用户的家用户名,UID,GID,目录路径和shell

##否则就显示用户名,UID,GID

 

 

照例在最后放一些习题以供复习:

 

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

 

练习4:写一个脚本,实现如下功能:

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

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

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

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

 

写一个脚本

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

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

 

写一个脚本

1、显示如下菜单:

cpu) show cpu info;

mem) show memory info;

quit) quit

Enter your option:

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

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

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

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

 

写一个脚本,完成如下任务:

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

2、复制目录时,才使用cp -r

3、复制文件时,使用cp

4、复制链接文件,使用cp -d

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

 

写一个脚本,完成如下任务,其使用形式如下所示:

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

其中:

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

如果参数为start,则创建空文件/var/lock/subsys/script,并显示“starting script successfully.”

如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script successfully.”

如果参数为restart,则删除文件/var/locksubsys/script并重新创建,而后显示“Restarting script successfully.”

如果参数为status,那么:

如果文件/var/lock/subsys/script存在,则显示“Script is running...”,否则,则显示“Script is stopped.”

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章