Shell脚本编程算术运算和条件测试
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本编程算术运算和条件测试相关的知识,希望对你有一定的参考价值。
算术运算
1、bash中的算术运算:help let
+, -, *, /, %取模(取余), **(乘方)
实现算术运算:
(1) let var=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare –ivar= 数值
(6) echo ‘算术表达式’ | bc
2、乘法符号有些场景中需要转义,如*
3、bash有内建的随机数生成器:
$RANDOM(0-32767)
echo $[$RANDOM%50] :0-49之间随机数
赋值
1、增强型赋值:
+=, -=, *=, /=, %=
2、let varOPERvalue
例如:let count+=3
自加3后自赋值
3、自增,自减:
let var+=1
let var++
let var-=1
let var--
逻辑运算
1、true, false
1, 0
2、与:(&)
1 与1 = 1
1 与0 = 0
0 与1 = 0
0 与0 = 0
------------------------------------
与运算可以理解为并且的关系
1代表真
0代表假
一个真和一个假与的结果是假
有一个假的与出来的结果就是假的
得出结论:
谁和1与的保留原值
和0与的不管是什么结果都是0
------------------------------------
3、或:(|)
1 或1 = 1
1 或0 = 1
0 或1 = 1
0 或0 = 0
------------------------------------
或运算:
真和真或结果为真
1 || 1 = 1
真和假或结果也为真
1 || 0 = 1
假和真或结果也是真
0 || 1 = 1
只有两个为假是结果才为假
0 || 0 = 0
结论:
和真与的结果为真
和假与的保留原值
------------------------------------
逻辑运算
1、非:!
! 1 = 0
! 0 = 1
2、短路运算
短路与 (&&)
第一个为0,结果必定为0
第一个为1,第二个必须要参与运算
短路或 (||)
第一个为1,结果必定为1
第一个为0,第二个必须要参与运算
3、异或:^
异或的两个值,相同为假,不同为真
------------------------------------------
示例:判断一个文件是否存在,如果存在就给文件加上执行权限
1、文件存在时。后续命令继续执行
[[email protected] ~]#ls anaconda-ks.cfg &> /dev/null && chmod +x anaconda-ks.cfg
[[email protected] ~]#ll
total 1244
-rwx--x--x. 1 root root 1559 Jul 18 20:55 anaconda-ks.cfg
2、文件不存在时。后续命令就不再执行了
[[email protected] ~]#ls an &> /dev/null && chmod +x an
[[email protected] ~]#echo $?
2
示例:判断一个账号是否存在,不存在则创建此账号
[[email protected] ~]#id coodf &> /dev/null || useradd coodf
[[email protected] ~]#echo $?
0
[[email protected] ~]#getent passwd coodf
coodf:x:1004:1004::/home/coodf:/bin/bash
[[email protected] ~]#
示例;用异或来兑换两个数字的位置
[[email protected]~/bin]#a=10;b=7;a=$[a^b];b=$[a^b];a=$[a^b]; echo $a $b
7 10
------------------------------------------
条件测试
1、判断某需求是否满足,需要由测试机制来实现
专用的测试表达式需要由测试命令辅助完成测试过程
2、评估布尔声明,以便用在条件性执行中
?若真,则返回0
?若假,则返回1
3、测试命令:
?test EXPRESSION
?[ EXPRESSION ]
?[[ EXPRESSION ]]
[[ EXPRESSION ]]
== 相同,字符串不要加"",支持通配符
=~ 匹配,字符串不要加"",支持扩展正则表达式
注意:EXPRESSION前后必须有空白字符
-------------------------------------------------
避免空值的写法 加X即可
[[email protected] ~]#[ X"$name" = X"$title" ] && echo true || echo false
false
[[ ]] 变量要加"" 正则表达式不用加""
[[email protected] ~]#var=abc;[[ "$var" =~ ^a ]] && echo true|| echo false
true
判断是否以.conf结尾
[[email protected] ~]#filename=a.conf
[[email protected] ~]#[[ "$filename" =~ .conf$ ]] &&echo true || echo false
true
[[email protected] ~filename=a.con
[[email protected] ~[[ "$filename" =~ .conf$ ]] && echo true || echo false
false
判断一个是否为文件并且这个文件是否有写权限,如果有写权限就给它去掉
[[email protected] ~]#file=/etc/issue;[ -f $file -a -w $file ] && chmod -w $file
判断一个是否为文件或者这个文件是否有写权限,如果有写权限就给它去掉
[[email protected] ~]#file=/etc/issue;[ -f $file -a -w $file ] && chmod -w $file
判断一个文件不具有写权限,如果没有就给它加上写权限
[[email protected] ~]#file=/etc/issue;[ ! -w $file ] && chmod +w $file
判断一个文件是否具有执行权限,如果没有就给它加上执行权限
[[email protected] ~]#file=/etc/shadow ; [ ! -x $file ] && chmod +x $file
[[email protected] ~]#ll /etc/shadow
---x--x--x 1 root root 1220 Sep 22 08:26 /etc/shadow
[[email protected] ~]#
----------------------------------------------------------
条件性的执行操作符
根据退出状态而定,命令可以有条件地运行
?&& 代表条件性的AND THEN
?|| 代表条件性的OR ELSE
-------------------------------------
示例:
[[email protected] ~]#grep -q no_such_user /etc/passwd || echo ‘No such user‘
No such user
test命令
1、长格式的例子:
test "$A"="$B"&&echo"Stringsareequal"
test“$A”-eq“$B”&&echo"Integersareequal"
2、简写格式的例子:
["$A"="$B"]&&echo"Stringsareequal"
["$A"-eq"$B"]&&echo"Integersareequal"
bash的数值、字符串测试
1、-v VAR
变量VAR是否设置
2、数值测试:
-gt是否大于
-ge是否大于等于
-eq是否等于
-ne是否不等于
-lt是否小于
-le是否小于等于
3、字符串测试:
=是否等于
>ascii码是否大于ascii码
<是否小于
!=是否不等于
=~左侧字符串是否能够被右侧的PATTERN所匹配
注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
-z "STRING“字符串是否为空,空为真,不空为假
-n "STRING“字符串是否不空,不空为真,空为假
4、注意:用于字符串比较时的用到的操作数都应该使用引号
Bash的文件测试
1、存在性测试
-a FILE:同-e
-e FILE: 文件存在性测试,存在为真,否则为假
2、存在性及类别测试
-b FILE:是否存在且为块设备文件
-c FILE:是否存在且为字符设备文件
-d FILE:是否存在且为目录文件
-f FILE:是否存在且为普通文件
-h FILE 或-L FILE:存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE:是否存在且为套接字文件
3、文件权限测试:
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE: 是否存在且可执行
4、文件特殊权限测试:
-u FILE:是否存在且拥有suid权限
-g FILE:是否存在且拥有sgid权限
-k FILE:是否存在且拥有sticky权限
5、文件大小测试:
-s FILE: 是否存在且非空
6、文件是否打开:
-t fd: fd文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
7、双目测试:
FILE1 -efFILE2: FILE1是否是FILE2的硬链接
FILE1 -ntFILE2: FILE1是否新于FILE2(mtime)
FILE1 -otFILE2: FILE1是否旧于FILE2
Bash的组合测试条件
1、第一种方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]]
2、第二种方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必须使用测试命令进行
以上是关于Shell脚本编程算术运算和条件测试的主要内容,如果未能解决你的问题,请参考以下文章