linux脚本条件运算,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、文件存在时。后续命令继续执行

[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

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

必须使用测试命令进行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值