标签:逻辑运算 useradd 执行 符号链接 算术 let dom 符号 ascii
算术运算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、文件存在时。后续命令继续执行
[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
2、文件不存在时。后续命令就不再执行了
[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
------------------------------------------
1、判断某需求是否满足,需要由测试机制来实现
专用的测试表达式需要由测试命令辅助完成测试过程
2、评估布尔声明,以便用在条件性执行中
?若真,则返回0
?若假,则返回1
3、测试命令:
?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
1、长格式的例子:
test "$A"="$B"&&echo"Stringsareequal"
test“$A”-eq“$B”&&echo"Integersareequal"
2、简写格式的例子:
["$A"="$B"]&&echo"Stringsareequal"
["$A"-eq"$B"]&&echo"Integersareequal"
1、-v VAR
变量VAR是否设置
2、数值测试:
-gt是否大于
-ge是否大于等于
-eq是否等于
-ne是否不等于
-lt是否小于
-le是否小于等于
3、字符串测试:
=是否等于
>ascii码是否大于ascii码
<是否小于
!=是否不等于
=~左侧字符串是否能够被右侧的PATTERN所匹配
注意: 此表达式一般用于[[ ]]中;扩展的正则表达式
-z "STRING“字符串是否为空,空为真,不空为假
-n "STRING“字符串是否不空,不空为真,空为假
4、注意:用于字符串比较时的用到的操作数都应该使用引号
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
1、第一种方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]]
2、第二种方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必须使用测试命令进行
标签:逻辑运算 useradd 执行 符号链接 算术 let dom 符号 ascii
原文地址:http://blog.51cto.com/dklwj/2292355