bash中的算术运算及条件测试

bash的算术运算

+, -, *, /, %取模(取余), **(乘方)

实现算术运算:

  • (1) let var=算术表达式
  • (2) var=$[算术表达式]
  • (3) var=$((算术表达式))
  • (4) var=$(expr arg1 arg2 arg3 …)
  • (5) declare –i var = 数值
  • (6) echo ‘算术表达式’ | bc

注意:乘法符号有些场景中需要转义,如*

bash有内建的随机数生成器:$RANDOM(0-32767)

echo $[$RANDOM%50] :0-49之间随机数

[989][root@centos6: /root]# num1=10
[990][root@centos6: /root]# num2=20
[993][root@centos6: /root]# let sum=${num1}+${num2}
[993][root@centos6: /root]# echo ${sum}
30
[994][root@centos6: /root]# echo $[${num1}+${num2}]
30
[995][root@centos6: /root]# echo $((${num1}+${num2}))
30
[996][root@centos6: /root]#  nu12=$(expr ${num1} \* ${num2})
[998][root@centos6: /root]# echo ${nu12}
200

增强型赋值:

+=, -=, *=, /=, %=

let varOPERvalue

例如:let count+=3 自加3后自赋值

自增,自减:

let var+=1 或 let var++

let var-=1 或 let var–


bash条件测试

判断某需求是否满足,需要由测试机制来实现

专用的测试表达式需要由测试命令辅助完成


测试命令

  • test EXPRESSION
  • [ EXPRESSION ]
  • [[ EXPRESSION ]]

注意:EXPRESSION前后必须有空白字符


测试表达式的类别

  • 数值比较
  • 字符串测试
  • 文件测试

数值比较测试

  • -gt: 是否大于
  • -ge: 是否大于等于
  • -eq: 是否等于
  • -ne: 是否不等于
  • -lt: 是否小于
  • -le: 是否小于等于
[999][root@centos6: /root]# test 1 -gt 3
[1000][root@centos6: /root]# echo $?
1
[1001][root@centos6: /root]# test 1 -lt 3
[1002][root@centos6: /root]# echo $?
0
[1003][root@centos6: /root]# [ 1 -gt 3  ]
[1004][root@centos6: /root]# echo $?
1
[1005][root@centos6: /root]# [ 1 -lt 3  ]
[1006][root@centos6: /root]# echo $?
0

字符串测试:

  • ==:是否等于;
  • >: ascii码是否大于ascii码
  • <: 是否小于
  • !=: 是否不等于
  • =~: 左侧字符串是否能够被右侧的PATTERN所匹配

注意: 此表达式一般用于[[ ]]中;扩展的正则表达式

  • -z “STRING”:字符串是否为空,空为真,不空为假
  • -n “STRING”:字符串是否不空,不空为真,空为假

注意:用于字符串比较时的用到的操作数都应该使用引号

[1007][root@centos6: /root]# name=xiangge
[1009][root@centos6: /root]# [ -z "${name}"  ]
[1010][root@centos6: /root]# echo $?
1
[1011][root@centos6: /root]# [ -z "${myname}"  ]
[1012][root@centos6: /root]# echo $?
0
[root@centos6: /root]# [  "${myname}" == "${name}"  ]
[1019][root@centos6: /root]# echo $?

注意以下例子:左则字串要能包含下右侧字符串,反之就不行。

[1007][root@centos6: /root]# name=xiangge
[1022][root@centos6: /root]# [[ ${name} =~ "xiang" ]]
[1023][root@centos6: /root]# echo $?
[1026][root@centos6: /root]# [[ "xiang" =~ "${name}" ]]
[1026][root@centos6: /root]# echo $?
1

文件测试

存在性测试

  • -a FILE:同-e
  • -e FILE: 文件存在性测试,存在为真,否则为假

存在性及类别测试

  • -b FILE:是否存在且为块设备文件
  • -c FILE:是否存在且为字符设备文件
  • -d FILE:是否存在且为目录文件
  • -f FILE:是否存在且为普通文件
  • -h FILE 或 -L FILE:存在且为符号链接文件
  • -p FILE:是否存在且为命名管道文件
  • -S FILE:是否存在且为套接字文件

写一个判断文件类型的脚本

1  #!/bin/bash 
2  #
3  # 用户键入路径,用脚本来判断文件类型
4  read -p "Enter a file path: " filename
5  if [ -z "$filename" ];then
6    echo "usage: Enter a file path."
7    exit 1
8  fi
9  if [ ! -e $filename ];then
10    echo "NO such file."
11    exit 2
12 fi
13 if [ -f $filename ];then
14    echo "A common file."
15 elif [ -d $filename ];then
16    echo "A common directory."                                
17 elif [ -L $filename ];then
18    echo "A symbolic file."
19 else
20    echo "other type."
21 fi

文件权限测试:(当前用户)

  • -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:当前有效用户是否为文件属组

组合测试条件

第一种方式:

COMMAND1 && COMMAND2 并且 COMMAND1 || COMMAND2 或者 ! COMMAND 非

如:[[ -r FILE ]] && [[ -w FILE ]]

第二种方式: EXPRESSION1 -a EXPRESSION2 并且 EXPRESSION1 -o EXPRESSION2 或者 ! EXPRESSION 必须使用测试命令进行;

[990][root@centos6: /root]# [ -z "$hostName" ] || [ "$hostName" == "centos6.8E" ]
[991][root@centos6: /root]# echo $?
0

原创文章,作者:祥健,如若转载,请注明出处:http://www.178linux.com/73626

(0)
祥健祥健
上一篇 2017-04-17
下一篇 2017-04-17

相关推荐

  • Linux Basics-Linux Bash历史和其概念名词解释part1

    Linux Basics-Linux Bash历史和其概念名词解释part1 阅读本文你将知道:查看更多BashFAQ.pdf   Bash的历史及其特性   Bash的如何工作   Bash的概念解释   前提知识:      对linux有一定基础而且了解Bash的…

    Linux干货 2016-10-29
  • Linux终端和伪终端简述

    本文简述Linux各种类型终端的区别以及如何用命令查看终端类型

    Linux干货 2018-03-26
  • N28-第三周博客作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。
    2、取出最后登录到当前系统的用户的相关信息。
    3、取出当前系统上被用户当作其默认shell的最多的那个shell。
    4、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxusers.txt文件中。
    5、取出当前主机的IP地址,提示:对ifconfig命令的结果进行切分。
    6、列出/etc目录下所有以.conf结尾的文件的文件名,并将其名字转换为大写后保存至/tmp/etc.conf文件中。
    7、显示/var目录下一级子目录或文件的总个数。
    8、取出/etc/group文件中第三个字段数值最小的10个组的名字。
    9、将/etc/fstab和/etc/issue文件的内容合并为同一个内容后保存至/tmp/etc.test文件中。
    10、请总结描述用户和组管理类命令的使用方法并完成以下练习:
    (1)、创建组distro,其GID为2016;
    (2)、创建用户mandriva, 其ID号为1005;基本组为distro;
    (3)、创建用户mageia,其ID号为1100,家目录为/home/linux;
    (4)、给用户mageia添加密码,密码为mageedu;
    (5)、删除mandriva,但保留其家目录;
    (6)、创建用户slackware,其ID号为2002,基本组为distro,附加组peguin;
    (7)、修改slackware的默认shell为/bin/tcsh;
    (8)、为用户slackware新增附加组admins;

    Linux干货 2017-12-19
  • 马哥教育网络班22期第五周课程练习1

    1、cat /etc/passwd  | egrep "^root|^fedora|^user1"| cut -d":" -f1,7  2、egrep -o  "[^[:space:]]+\(\)" /etc/rc.d/init.d/functions   3…

    Linux干货 2016-09-15
  • N26-第四周作业

    一、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 思路:先用递归操作复制文件,再用chmod改变文件及其下目录权限。 方法一: [root@promote ~]# cp -r /etc/skel /home/tuser1 #复制文件并改名 [root@promote ~]#…

    2017-05-07

评论列表(1条)

  • renjin
    renjin 2017-04-21 11:25

    主要介绍了bash编程的测试及算术运算,内容总结的很详细,排版也很不错,继续努力!