1、bash中的算术运算
- let运算符
[root@:vg_adn_tidbCkhsTest~/tidb-bench/sysbench]#let i=1+2 [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i 3 [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#let i1=10 [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#let i2=20 [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#let i3=$i1+$i2 [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i3 30
- $[expression]
[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#i1=$[11+22] [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i1 33
- $((experssion))
[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#i=$((22+33)) [root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#echo $i 55
- expr arg1 操作符 arg2
[root@:vg_adn_tidbCkhsTest ~/tidb-bench/sysbench]#i=`expr 11 \* 10`;echo $i 110
一般情况下使用expr运算符都要用反引号
2、判断某个用户是否存在,如果不存在,则创建此用户
#!/bin/bash id hadop &> /dev/null || useradd hadoop
3、计算passwd文件中第10个用户和第20个用户的UID之和
#!/bin/bash uid1=$(id -u `cat /etc/passwd |head | tail -1|cut -d':' -f1`) uid2=$(id -u `cat /etc/passwd |head -20| tail -1|cut -d':' -f1`) sum=$[$uid1+$uid2] echo "10 and 20 user 's uuid is $sum"
4、统计某个文件的空白行
[root@:vg_adn_tidbCkhsTest /tmp]#cat /etc/init.d/functions | grep '^$'| wc -l 90
5、判断返回值状态
[root@:vg_adn_tidbCkhsTest /tmp]#cat /etc/fstab &> /dev/null [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0 [root@:vg_adn_tidbCkhsTest /tmp]#cat /etc/fstabhaha &> /dev/null #查看一个不存在的文件 [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 1
6、条件测试
判断某需求是否满足,需要由测试机制来实现:
如何编写测试表达式以实现所需的测试
- (1)执行命令,并利用命令状态返回值来判断
0:成功
1:失败
- (2)测试表达式
test EXPRESSION
[ EXPRESSION ] 单中括号多见于数值比较
[[ EXPRESSION ]] 双中括号多见于字符串比较
注意:EXPRESSION两段必须有空白字符,否则为语法错误
bash的测试类型
数值测试:
-eq:是否等于
-ne:是否不等于
-gt:是否大于
-ge:是否大于等于
-lt:是否小于
-le:是否小于等于
[root@:vg_adn_tidbCkhsTest /tmp]#[ 11 -eq 21 ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 1 [root@:vg_adn_tidbCkhsTest /tmp]#[ 11 -eq 11 ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0
字符串测试
==:是否等于
>:是否大于
<:是否小于
!=:是否不等于
=~:左侧字符串能否被右侧的PATTERN所匹配。右侧的PATTERN不能使用bash的通配符来进行。并且PATTERN是匹配左侧字符串的某一部分而已
-z "STRING":判断指定的字串是否为空,空则为真,不空则为假
-n "STRING":判断指定的字符串是否不空,不空则真,空则为假。
[root@:vg_adn_tidbCkhsTest /tmp]#[ tom == tom ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0 [root@:vg_adn_tidbCkhsTest /tmp]#[ tom != tom ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 1
[root@:vg_adn_tidbCkhsTest /tmp]#[ "tom" != "join" ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0
并不是说字符串比较这样子就完美了,如下所示:
[root@:vg_adn_tidbCkhsTest /tmp]#[ "a" > "b" ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0 [root@:vg_adn_tidbCkhsTest /tmp]#[ "a" < "b" ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0 [root@:vg_adn_tidbCkhsTest /tmp]#[[ "a" > "b" ]] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 1 [root@:vg_adn_tidbCkhsTest /tmp]#[[ "a" < "b" ]] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0
所以说字符串的比较有两点要注意:
1、字符串要加引用
2、要使用双中括号[[ EXPRESSION ]]来进行比较
[root@:vg_adn_tidbCkhsTest /tmp]#name=tom[root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o" ]] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0 [root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o.*" ]] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 1 [root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o*" ]] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 1 [root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "om" ]] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0
[root@:vg_adn_tidbCkhsTest /tmp]#[[ $name =~ "o?" ]]
[root@:vg_adn_tidbCkhsTest /tmp]#echo $?
1
7、文件测试
文件存在性测试:
-e:FILE 文件的存在性测试,存在则为真,不存在则为假
文件类型测试:
-b FILE:文件是否为块设备文件
-c FILE: 文件是否为字符设备文件
-d FILE:文件是否是目录文件
-f FILE:文件是否是普通文件
-l FILE:文件是否为链接文件
-S FILE:文件是否为套接字文件
-p FILE:文件是否为管道文件
[root@:vg_adn_tidbCkhsTest /tmp]#[ -b /dev/xvda1 ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0 [root@:vg_adn_tidbCkhsTest /tmp]#[ -f /etc/init.d/functions ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0
文件权限性测试
-r FILE:文件是否可读
-w FILE:文件是否可写
-x FILE:文件是否可执行
[root@:vg_adn_tidbCkhsTest /tmp]#[ -x /usr/bin/passwd ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0
文件特殊权限测试
-g FILE:文件是否拥有SGID权限
-u FILE:文件是否拥有SUID权限
-k FILE:文件是否拥有sticky权限
[root@:vg_adn_tidbCkhsTest /tmp]#[ -u /usr/bin/passwd ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0
文件大小测试
-s FILE :文件是否为非空内容,有内容则为真,无内容则为假
[root@:vg_adn_tidbCkhsTest /tmp]#touch ./haha.sh [root@:vg_adn_tidbCkhsTest /tmp]#[ -s haha.sh ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 1 [root@:vg_adn_tidbCkhsTest /tmp]#echo "hahahaha" > haha.sh [root@:vg_adn_tidbCkhsTest /tmp]#[ -s haha.sh ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0
从属关系测试
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组
[root@:vg_adn_tidbCkhsTest /tmp]#echo $? 0 [root@:vg_adn_tidbCkhsTest /tmp]#[ -O /home/tidb ] [root@:vg_adn_tidbCkhsTest /tmp]#echo $? 1
组合条件运算
[ condition1 -a condition2 ] 相当于 condition1 && condition2
[ condition1 -o condition2 ] 相当于 condition1 || condition2
[ -not condition ] 相当于 !condition
练习题:判断主机名是否为空或主机名是“localhost.localdomain”
#!/bin/bash hostName=$(hostname) [ -z "$hostName" ] || [[ $hostName == "localhost.localdomain" ]] #这一句相当于: [ -n "$hostName" -o $hostName == "localhost.localdomain" ] if [ $? -eq 0 ];then hostname www.feng.com fi
脚本的状态返回值
默认是脚本中执行的最后一条命令的状态返回值
自定义状态退出状态码:
exit [n]:n为自己指定的状态码。
注意L:shell进程遇到exit时,即会终止,因此,整个脚本执行即为结束。