bash脚本编程之条件判断
1、bash脚本编程格式:
2、变量介绍: 局部变量 本地变量 环境变量 位置参数变量 特殊变量 3、数据类型: 字符型 数值型 4、bash算数运算: 方法①:let var=$num1 op $num2 方法②:var=$[ expression ] 方法③:var=$((expression)) 方法④:var=$(expr argu1 op argu2 ) 需要注意的是: var=变量值 //这是变量赋值 var=$(命令) //这是命令结果引用 有些时候,乘法符号(*)需要转义实现; 5、增强型赋值:在shell脚本中要用let描述 变量做某种算数运算后回存至此变量中: let i=$i+# //#是数字 let i+=# 此类操作符有:+=、-+、*=、/=,%= 自增: let var+=1 let var++ //如果每次加“1”,可以写成此种方式 自减: let var-=1 let var-- //如果每次减“1”,可以写成此种方式 6、练习题: 计算/etc/passwd文件中的第10个用户和第20个用户的uid之和 id1=$(head -10 /etc/passwd | tail -1 | cut -d: -f3) id2=$(head -20 /etc/passwd | tail -1 | cut -d: -f3) idsum=$[ $id1 + $id2] 7、shell脚本编程之条件测试(测试表达式) 判断某需求是否满足;需要由测试机制来实现。 如何编写测试表达式以实现所需要的测试: 如#grep "^$" /etc/rc.d/init.d/functions &> /dev/null #echo $? ①、有专门命令实现测试表达式,使用执行命令,并利用命令状态返回值来判断: 0:成功 1-255:失败 如:查看centos用户是否登陆系统: #w | grep "^centos&;" #echo $? ②、没有专门命令实现,这类需要用到测试表达式(如:大小、长短等) 方法一:test expression 方法二:[ expression ] //注意:expression两端必须有空白字符,否则为语法错误 方法三:[[ expression ]]//注意:expression两端必须有空白字符,否则为语法错误 8、bash的测试表达式类型: 数值测试 字符串测试 文件测试 8.1、数值测试:用于实现数值大小比较: -eq :是否等于;如[ $num1 -eq $num2 ] -ne :是否不等于 -gt :是否大于 -ge :是否大于等于 -lt :是否小于 -le :是否小于等于 8.2、字符串测试:字符比较;比较时,变量要加引号 == :是否等于 如:[ "tom" =="tmo" ] > :是否大于 < :是否小于 != :是否不等于 =~:左侧字符串是否能够被右侧的PATTERN所匹配;可以匹配左侧字符串的部分内容。 -z "string":判断指定的字串“string”是否为空,空则为真,不空为假 -n "string":判断指定的字串"string" 是否为不空,不空为真,空则为假。 注意1:做字符串测试时,要在[[ expression ]]两个中括号中做比较,一个中括号有时是不生效的。 如:#[[ a>b ]] #echo $? 注意2:字符串要加引号,表示引用,做变量引用时不能用单引号。 8.3、文件测试: 存在性测试:文件的存在性测试,存在为真,不存在为假 -a FILE -e FILE 文件存在性及类型测试: -b FILE :是否存在并且为块设备文件 -c FILE :是否存在并且为字符设备文件 -d FILE :是否存在并且为目录文件 -f FILE :是否存在并且为普通文件 -h FILE :是否存在并且为符号链接文件 -L FILE :是否存在并且为符号链接文件,大写"L"。 -p FILE :是否存在并且为命名管道文件 -S FILE :是否存在并且为套接字文件,大写"S"。 文件存在性及权限测试: -r FILE :是否存在并且对当前用户可读 -w FILE :是否存在并且对当前用户可写 -x FILE :是否存在并且对当前用户可执行。 文件存在性及特殊权限测试: -g FILE :是否存在并且拥有sgid权限 -u FILE :是否存在并且拥有suid权限 -k FILE :是否存在并且拥有sticky权限 文件存在性及大小测试:文件是否有内容 -s FILE :是否存在并且有内容,有为真没有为假;小写“s” 文件存在性及时间戳测试: -N FILE :文件自从上一次读操作后是否被修改过。 文件存在性及从属关系测试 -O FILE :文件是否存在并且当前用户是文件属主。 -G FILE :文件是否存在并且当前用户属于文件属组。 双目测试: FILE1 -eq FILE2 :FILE1与FILE2是否为指向同一文件系统的相同inode的硬链接 FILE1 -N FILE2 :FILE1是否新于FILE2
8.4、组合测试条件: 逻辑运算: 方法一: command1 && command2 command1 || command2 ! command2 方法二: test EXPRESSION1 -a|-o|!EXPRESSION2 方法三:[EXPRESSION1 -a|-o|!EXPRESSION2 ] 方法四:[[EXPRESSION1 -a|-o|!EXPRESSION2 ]] 如: [ -o FILE -a -x FILE ] //表示测试用户是否属于当前用户并有执行权限。 9、脚本的状态返回值: 默认是脚本中执行的最后一条命令的状态返回值,可以自定义状态退出状态码,如下: exit [n] :n为自己指定的状态码;若不指定n,默认0为真,其他为假, 注意:shell进程遇到exit时,即会终止,因此整个脚本执行即为结束。 如:id user3 &> /dev/null && exit 0 || useradd user3 练习1:将当前主机名称保存至hostname变量中;主机名如果为空,或者为localhost.localdomain,则将其设置为www.magedu.com [root@localhost ~]# hostname=$(hostname) [root@localhost ~]# [ -z "$hostname" -o "$hostname" == "localhost.localdomain" ] && hostnamewww.magedu.com 10、位置参数变量:向脚本传递参数 位置参数变量格式: MYSCRIPT ARGU1 ARGU2 //脚本 参数1 参数2 位置参数变量应用方式:$1,$2,.....${10},${...}, 如: 有一个脚本如下: #!/bin/bash echo "put two arg" let sum=$1+$2 echo $sum 运行: [root@localhost ~]# bash ./script 2 3 //其中2 3 为位置参数表示脚本中的$1,$2 put two arg 5 [root@localhost ~]# 位置参数轮替: 格式:shift [n] //一次将n个参数踢出,可以不加n,表示默认一个 如: #!/bin/bash echo " firsh pos argus :$1,$3" shift 2 echo "second pos argus :$1" 运行: ~]# bash ./shift.sh 1 2 3 //一次踢出两个参数,那个再一次给$1赋值 即是第三个数 firsh pos argus :1,3 second pos argus :3 [root@localhost ~]# 练习: 写一个脚本,通过命令传递两个文本文件路径给脚本,计算空白行数之和 1 #!/bin/bash 2 lin1=$(grep "^$" "$1"| wc -l) 3 lin2=$(grep "^$" "$2"| wc -l) 4 echo $[$lin1+$lin2] 运行: [root@localhost ~]# bash ./line0.sh /etc/fstab /etc/issue 2 [root@localhost ~]# 11、特殊变量 $0:脚本文件路径本身 $#:脚本参数的个数 $*:所有参数,把所有参数当作一个个单独的字符串 $@:所有参数,把所有参数当作一个个字符串来看待 引用9: 脚本的状态返回值: 默认是脚本中执行的最后一条命令的状态返回值,可以自定义状态退出状态码,如下: exit [n] :n为自己指定的状态码,0为真,其他为假 注意:shell进程遇到exit时,即会终止,因此整个脚本执行即为结束。 如:id user3 &> /dev/null && exit 0 || useradd user3 如下脚本: 1 #!/bin/bash 2 [ $# -lt 2 ] && echo "input two argu" && exit 10 3 4 lin1=$(grep "^$" "$1"| wc -l) 5 lin2=$(grep "^$" "$2"| wc -l) 6 echo $[$lin1+$lin2] 运行: [root@localhost ~]# bash ./line0.sh /etc/fstab input two argu [root@localhost ~]# echo $? //查看执行状态,由于有exit命令,因此不会执行到最后一条语句 10 [root@localhost ~]#
注意:有时候脚本在编写的时候会有错误,可以用bash -x来执行检查 "-x"选项可用来跟踪脚本的执行,是调试shell脚本的强有力工具。“-x”选项使shell在执行脚本的过程中把它实际执行的每一个命令行显示出来,并且在行首显示一个"+"号。 "+"号后面显示的是经过了变量替换之后的命令行的内容,有助于分析实际执行的是什么命令。 “-x”选项使用起来简单方便,可以轻松对付大多数的shell调试任务,应把其当作首选的调试手段。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |