Shell脚本编程算术运算和条件测试
发布时间:2020-12-15 23:24:20 所属栏目:安全 来源:网络整理
导读:算术运算 1、bash中的算术运算:help let +,-,*,/,%取模(取余),**(乘方) 实现算术运算: (1) let var=算术表达式 (2) var=$[算术表达式] (3) var=$((算术表达式)) (4) var=$(expr arg1 arg2 arg3 ...) (5) declare –ivar= 数值 (6) echo ‘算术表达式’
算术运算
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 必须使用测试命令进行 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |