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