bash的算术运算
+, -, *, /, %取模(取余), **(乘方)
实现算术运算:
- (1) let var=算术表达式
- (2) var=$[算术表达式]
- (3) var=$((算术表达式)) //推荐使用这种类C风格
- (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
12fi
13if [ -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